MCP — Model Context Protocol
RactoGateway’s mcp package lets you expose tools as an MCP server, connect to any MCP server as a client, and run a provider-agnostic agentic loop.
Expose Tools as an MCP Server
from ractogateway import ToolRegistry
from ractogateway.mcp import RactoMCPServer
registry = ToolRegistry()
@registry.register
def get_weather(city: str) -> str:
"""Return current weather for a city."""
return f"Sunny in {city}"
server = RactoMCPServer.from_registry(registry, name="weather-tools")
server.run() # stdio transport — add to claude_desktop_config.json / Cursor
Connect to an MCP Server (Client)
from ractogateway.mcp import RactoMCPClient, MCPClientConfig
cfg = MCPClientConfig(
transport="stdio",
command="python",
args=["-m", "my_server"],
)
registry = RactoMCPClient(cfg).list_tools_sync()
SSE and streamable-HTTP transports are also supported:
cfg = MCPClientConfig(transport="sse", url="http://localhost:8001/sse")
Agentic Loop
MCPAgent runs the LLM → tool call → execute → continue loop and works identically with all three provider kits:
from ractogateway.mcp import MCPAgent
from ractogateway.openai_developer_kit import OpenAIDeveloperKit
from ractogateway._models.chat import ChatConfig
kit = OpenAIDeveloperKit(model="gpt-4o")
agent = MCPAgent(kit, registry, max_turns=6)
result = agent.run(ChatConfig(user_message="What is the weather in Tokyo?"))
print(result.content)
Aggregate Multiple Servers
from ractogateway.mcp import MCPMultiClient, MCPClientConfig
configs = [
MCPClientConfig(transport="stdio", command="python", args=["-m", "math_server"]),
MCPClientConfig(transport="sse", url="http://localhost:8001/sse"),
]
async with MCPMultiClient(configs) as multi:
registry = await multi.to_registry()
Installation
pip install ractogateway[mcp] # core (stdio + SSE client)
pip install ractogateway[mcp-sse] # server SSE transport (starlette + uvicorn)