Skip to content

MCPClient ​

The MCPClient class provides a reusable client for connecting to and interacting with MCP (Model Context Protocol) servers.

Overview ​

MCPClient handles individual MCP server connections, tool discovery, format conversion, and tool execution. It serves as the bridge between AmritaCore's tool system and external MCP-compliant services.

Properties ​

  • mcp_client (Client | None): The underlying FastMCP client instance
  • server_script (str | Path): The MCP server script path or URI
  • tools (list[MCPToolSchema]): List of original MCP tools fetched from the server
  • openai_tools (list[ToolFunctionSchema]): List of tools converted to OpenAI-compatible format

Methods ​

__init__(server_script: str | Path) -> None ​

Initializes an MCP client for a specific server.

Parameters:

  • server_script: Path to the MCP server script or URI

Example:

python
from amrita_core.tools.mcp import MCPClient

client = MCPClient("/path/to/weather-server.mcp")

async __aenter__() -> Self ​

Async context manager entry - connects to the MCP server.

Returns:

  • Self: The client instance for method chaining

Example:

python
async with MCPClient("/path/to/server.mcp") as client:
    tools = client.get_tools()

async __aexit__(exc_type, exc_val, exc_tb) -> None ​

Async context manager exit - closes the connection.

async simple_call(tool_name: str, data: dict[str, Any]) -> str ​

Calls an MCP tool and returns the result.

Parameters:

  • tool_name: Name of the tool to call
  • data: Dictionary of tool parameters

Returns:

  • str: Tool execution result (text content)
  • On error: JSON string with error details {"success": False, "error": "..."}

Example:

python
result = await client.simple_call("get_weather", {"city": "New York"})
print(result)  # "Weather in New York: Sunny, 25°C"

async _connect(update_tools: bool = False) -> None ​

Establishes connection to the MCP server.

Parameters:

  • update_tools: If True, fetches and converts available tools

Raises:

  • RuntimeError: If already connected

Example:

python
await client._connect(update_tools=True)
tools = client.get_tools()

_format_tools_for_openai() -> list[ToolFunctionSchema] ​

Converts MCP tool schemas to OpenAI-compatible format.

Returns:

  • list[ToolFunctionSchema]: List of tools in OpenAI format

Note: This is an internal method used during connection.

_cast_tool_to_amrita() -> None ​

Caches the OpenAI-format tools internally.

Note: Internal method called automatically after connection.

get_tools() -> list[ToolFunctionSchema] ​

Retrieves the list of tools in OpenAI-compatible format.

Returns:

  • list[ToolFunctionSchema]: List of available tools

Example:

python
tools = client.get_tools()
for tool in tools:
    print(f"Tool: {tool.function.name} - {tool.function.description}")

get_original_tools() -> list[MCPToolSchema] ​

Retrieves the original MCP tool schemas.

Returns:

  • list[MCPToolSchema]: Original MCP tools from the server

Example:

python
original_tools = client.get_original_tools()
for tool in original_tools:
    print(f"MCP Tool: {tool.name}")

async _close() -> None ​

Closes the connection to the MCP server.

Note: Automatically called when exiting async context manager.

Complete Usage Example ​

python
import asyncio
from amrita_core.tools.mcp import MCPClient


async def main():
    # Method 1: Using context manager (recommended)
    async with MCPClient("/path/to/server.mcp") as client:
        # Get available tools
        tools = client.get_tools()
        print(f"Available tools: {[t.function.name for t in tools]}")

        # Call a tool
        result = await client.simple_call("calculate", {"expression": "2 + 2"})
        print(f"Result: {result}")

    # Method 2: Manual connection management
    client = MCPClient("/another/server.mcp")
    try:
        await client._connect(update_tools=True)
        tools = client.get_tools()
        result = await client.simple_call("search", {"query": "test"})
    finally:
        await client._close()


asyncio.run(main())

Error Handling ​

MCPClient includes built-in error handling:

  • Connection errors: Raised as exceptions during _connect()
  • Tool execution errors: Returns JSON error response instead of raising
  • Automatic cleanup: Connection always closed in finally block or context manager

Apache 2.0 License