A high performance MCP client sdk for python
Config is the same across clients — only the file and path differ.
{
"mcpServers": {
"easymcp": {
"command": "<see-readme>",
"args": []
}
}
}Are you the author?
Add this badge to your README to show your security score and help users find safe servers.
EasyMCP is a complete rewrite of the model context protocol (MCP) in Python.
This server supports HTTP transport. Be the first to test it — help the community know if it works.
Five weighted categories — click any category to see the underlying evidence.
No known CVEs.
No package registry to scan.
Be the first to review
Have you used this server?
Share your experience — it helps other developers decide.
Sign in to write a review.
Others in developer-tools
Manage Supabase projects — databases, auth, storage, and edge functions
XcodeBuildMCP provides tools for Xcode project management, simulator management, and app utilities.
A Model Context Protocol (MCP) server and CLI that provides tools for agent use when working on iOS and macOS projects.
Asynchronous coordination layer for AI coding agents: identities, inboxes, searchable threads, and advisory file leases over FastMCP + Git + SQLite
MCP Security Weekly
Get CVE alerts and security updates for Easymcp and similar servers.
Start a conversation
Ask a question, share a tip, or report an issue.
Sign in to join the discussion.
EasyMCP is a complete rewrite of the model context protocol (MCP) in Python.
uv add easymcp
The high level API exposes a ClientManager class that can be used to manage multiple MCP servers.
import asyncio
from easymcp.client.ClientManager import ClientManager
from easymcp.client.transports.stdio import StdioServerParameters
mgr = ClientManager()
searxng = StdioServerParameters(
command="uvx",
args=["mcp-searxng"],
)
timeserver = StdioServerParameters(
command="uvx",
args=["mcp-timeserver"],
)
servers = {
"searxng": searxng,
"timeserver": timeserver,
}
async def main():
# initialize the client manager
await mgr.init(servers=servers)
# list servers
print(mgr.list_servers())
# remove a server
await mgr.remove_server("searxng")
# add a server
await mgr.add_server("searxng", searxng)
# list tools - these are namespaced by server name automatically
# {server name}.{tool name}
print(await mgr.list_tools())
# call tool
print(await mgr.call_tool("timeserver.get-current-time", {}))
# list resources - these are namespaced by server name automatically
# mcp-{server name}+{resource uri}
print(await mgr.list_resources())
# read resource
print(await mgr.read_resource("mcp-timeserver+datetime://Africa/Algiers/now"))
await asyncio.Future()
asyncio.run(main())
Namespaced tools remove need to perform a lookup to find the correct tool. This means:
Resources are namespaced in a way that makes it easy to make a resource URI to a specific server. You can:
mcp| easyMCP | modelcontextprotocol/python-sdk | |
|---|---|---|
| ClientManager | manages multiple MCP servers | |
| ClientSession | ClientSession | manages a single MCP server |
| StdioTransport | stdio_client | raw subprocess transport |
This project is licensed under the MIT License - see the LICENSE file for details.