from solvemcp import MCPClientsolvemcp
Small Python client for Model Context Protocol (MCP) servers.
It provides:
stdiotransport for local subprocess servers.- Streamable HTTP transport for modern MCP servers.
- Legacy HTTP+SSE fallback for older servers.
- Dynamic Python callables for tools returned by
tools/list.
Installation
pip install solvemcpQuick Start
Connect to a local stdio server
with MCPClient.stdio([sys.executable, "-u", "../tests/echoserver.py"]) as mcp:
print(list(mcp.tools))
res = mcp.echo(text="hello")
print(res)['echo']
{'content': [{'type': 'text', 'text': 'hello'}]}
Connect to an HTTP MCP server
with MCPClient.http("https://mcp.grep.app") as mcp:
print(list(mcp.tools))
res = mcp.searchGitHub(query="class PtyProcess", language=["Python"])['searchGitHub']
cts = res['content']
print(len(cts))10
print(cts[0]['text'][:500])Repository: sedwards2009/extraterm
Path: extensions/ProxySessionBackend/src/python/ptyprocess/ptyprocess.py
URL: https://github.com/sedwards2009/extraterm/blob/master/extensions/ProxySessionBackend/src/python/ptyprocess/ptyprocess.py
License: MIT
Snippets:
--- Snippet 1 (Line 79) ---
(intr, eof) = (3, 4)
_INTR = _byte(intr)
_EOF = _byte(eof)
class PtyProcessError(Exception):
"""Generic error class for this package."""
# setecho and setwinsize are pulled out here b
How Tool Calls Work
For each server tool with a valid Python identifier name, MCPClient adds a method dynamically. Example: a server tool named echo becomes mcp.echo(...).
Equivalent forms:
mcp.echo(text="hi")
mcp.call_tool("echo", text="hi")Streaming
For Streamable HTTP servers, use rpc_stream or call_tool_stream:
for msg in mcp.rpc_stream("tools/list", params={}): print(msg)Module Layout
solvemcp/client.py:MCPClientrequest lifecycle, initialization, tool binding, and RPC helpers.solvemcp/transports.py: transport implementations plus SSE parsers and error types.
Development
Run tests:
python tests/tests.py