Confidential guide on numerology and astrology, based of GG33 Public information

PYMCP-SSE
用于构建模型上下文协议(MCP)服务器的异步Python库和http/sse的客户端,非常适合AI代理,工具集成和聊天机器人生态系统。
3 years
Works with Finder
1
Github Watches
0
Github Forks
0
Github Stars
pymcp-sse: Python MCP over SSE Library
A lightweight, flexible implementation of the Model Context Protocol (MCP) for Python applications, specializing in robust HTTP/SSE transport.
Features
-
Modular Framework: Clean implementation of
BaseMCPServer
,BaseMCPClient
, andMultiMCPClient
. - HTTP/SSE Transport: Robust HTTP/SSE implementation with automatic session management, configurable timeouts, and reconnection handling.
-
Concurrent Task Execution:
BaseMCPServer.run_with_tasks()
method for easily running servers with persistent background asynchronous tasks. -
Tool Registration & Discovery: Simple decorator-based tool registration (
@server.register_tool()
) and a standarddescribe_tools
endpoint for clients to dynamically query detailed tool capabilities (parameters, descriptions). -
Server Push: Built-in support for server-initiated push notifications to clients and periodic keep-alive pings. Includes
NotificationScheduler
helper class. -
LLM Integration: Includes
BaseLLMClient
abstraction for easy integration with various LLM providers (an Anthropic Claude example is provided). -
Flexible Logging: Configurable logging via
pymcp_sse.utils
.
Installation
To install the library locally for development:
# Navigate to the directory containing pyproject.toml
cd /path/to/your/pymcp-sse
# Install in editable mode
pip install -e .
(Once published, installation via pip install pymcp-sse
will be available.)
Basic Usage
Creating an MCP Server (Simple)
from pymcp_sse.server import BaseMCPServer
from pymcp_sse.utils import configure_logging
configure_logging() # Configure logging (optional)
# Create a server instance
server = BaseMCPServer("My Simple Server")
# Register tools using the decorator
# Type hints are used by describe_tools
@server.register_tool("echo")
async def echo_tool(text: str) -> dict:
'''Echoes the provided text back.'''
return {"response": f"Echo: {text}"}
# Run the server using the standard method
if __name__ == "__main__":
# Additional kwargs are passed to uvicorn.run (e.g., timeout_keep_alive=65)
server.run(host="0.0.0.0", port=8000)
Creating an MCP Server (with Background Tasks)
import asyncio
from pymcp_sse.server import BaseMCPServer
from pymcp_sse.utils import configure_logging
configure_logging() # Configure logging (optional)
# Create a server instance
server = BaseMCPServer("My Background Task Server")
# Define your background task
async def my_periodic_task():
while True:
print("Task running...")
await asyncio.sleep(5)
# Define a shutdown callback
async def cleanup():
print("Cleaning up...")
# Run the server using run_with_tasks
async def main():
await server.run_with_tasks(
host="0.0.0.0",
port=8001,
concurrent_tasks=[my_periodic_task],
shutdown_callbacks=[cleanup]
)
if __name__ == "__main__":
asyncio.run(main())
Creating a Single Client
import asyncio
from pymcp_sse.client import BaseMCPClient
from pymcp_sse.utils import configure_logging
configure_logging() # Configure logging (optional)
async def main():
# Configure timeouts for stability (read timeout > server ping interval)
client = BaseMCPClient(
"http://localhost:8000", # Point to your server
http_read_timeout=65,
http_connect_timeout=10
)
try:
# Connect and initialize
if await client.connect() and await client.initialize():
print(f"Connected. Available tools: {client.available_tools}")
# Call a tool
result = await client.call_tool("echo", text="Hello, world!")
print(f"Tool Result: {result}")
# Assign a notification handler if needed
# client.notification_handler = your_async_handler
except Exception as e:
print(f"An error occurred: {e}")
finally:
await client.close()
if __name__ == "__main__":
asyncio.run(main())
Creating a Multi-Server Client
import asyncio
from pymcp_sse.client import MultiMCPClient
from pymcp_sse.utils import configure_logging
configure_logging() # Configure logging (optional)
async def main():
# Use servers from the examples section
servers = {
"server_basic": "http://localhost:8101",
"server_tasks": "http://localhost:8102"
}
# Configure timeouts for stability (read timeout > server ping interval)
client = MultiMCPClient(
servers,
http_read_timeout=65,
http_connect_timeout=10
)
try:
# Connect to all servers (automatically fetches tool details if describe_tools exists)
connection_results = await client.connect_all()
print(f"Connection Results: {connection_results}")
# Get info about connected servers (including tool details)
server_info = client.get_server_info()
print("\nServer Info:")
for name, info in server_info.items():
print(f"- {name}: Status={info['status']}, Tools={len(info.get('available_tools', []))}, Details Fetched={bool(info.get('tool_details'))}")
# Call a tool on a specific server
if server_info.get("server_basic", {}).get("status") == "connected":
result = await client.call_tool("server_basic", "echo", text="Hello from MultiClient!")
print(f"\nServer Basic Echo Result: {result}")
except Exception as e:
print(f"An error occurred: {e}")
finally:
await client.close()
if __name__ == "__main__":
asyncio.run(main())
Documentation
For more detailed usage instructions, notes on the HTTP/SSE implementation, guides on LLM integration, and the protocol specification, please refer to the documentation in the docs/
directory.
Examples
See the examples/
directory for complete working examples, including:
-
server_basic
: Demonstrates a simple server usingserver.run()
. -
server_tasks
: Demonstrates a server with background tasks (notification scheduler) usingserver.run_with_tasks()
. -
client
: A multi-server client usingMultiMCPClient
and anLLMAgent
to interact with both servers via natural language. Requires an API key (setANTHROPIC_API_KEY
in a.env
file in the project root). -
run_all.py
: A launcher script to easily startserver_basic
,server_tasks
, and theclient
simultaneously. -
notification_listener.py
: A simple standalone client for receiving push notifications from any compatible server.
License
MIT
相关推荐
Take an adjectivised noun, and create images making it progressively more adjective!
Embark on a thrilling diplomatic quest across a galaxy on the brink of war. Navigate complex politics and alien cultures to forge peace and avert catastrophe in this immersive interstellar adventure.
Reviews

user_d44JZSeR
As a dedicated user of mcp applications, I find pymcp-sse to be an exceptional tool. Authored by rvirgilli, this product offers seamless integration and user-friendly features. The project hosted on GitHub reflects high-quality craftsmanship and meticulous attention to detail. Highly recommend checking out pymcp-sse for your secure server events needs!