Skip to content

MCP Integration Example

Connecting external MCP servers to your A2E agent.

Basic MCP Server Registration

python
import logging
from a2e.schema import A2EHostConfig
from a2e.core.server.server import A2EServer
from a2e.core.client.client import A2EClient
from a2e.caps.mcp.client import MCPAPI
from a2e.caps.tools.client import ToolAPI

logger = logging.getLogger("mcp-agent")

config = A2EHostConfig.from_yaml("config.yaml")  # Must include mcp plugin
server = A2EServer(config)
transport = server.start()

client = A2EClient(transport, logger, agent_caps=["mcp", "tools"])
client.connect()

mcp = MCPAPI(client)
tools = ToolAPI(client)

# Register a stdio MCP server
info = mcp.register_server("local_fs", MCPServerConfig(
    server_id="local_fs",
    name="Local Filesystem",
    transport="stdio",
    cmd=["python", "-m", "mcp_server_filesystem"],
    cwd="/home/user",
    tool_allow_list=["read_file", "write_file", "list_directory"]
))
print(f"Registered: {info.name}, tools: {[t.name for t in info.tools]}")

# Register an SSE MCP server
info2 = mcp.register_server("remote_api", MCPServerConfig(
    server_id="remote_api",
    name="Remote API",
    transport="sse",
    url="http://api.example.com:8081/sse",
    headers={"Authorization": "Bearer token123"}
))

# MCP tools are automatically synced into the host tool registry
# Namespaced as: server_id__tool_name

# List all MCP tools
all_tools = tools.list()
mcp_tools = [t for t in all_tools if "__" in t.name]
print(f"MCP tools available: {[t.name for t in mcp_tools]}")

# Call an MCP tool via the normal ToolAPI
result = tools.call("local_fs__read_file", {"path": "/home/user/data.txt"})
print(result.data)

# Or use MCPAPI for explicit routing
result = mcp.call_tool("read_file", {"path": "/home/user/data.txt"}, strategy="first")

Resource Access

python
# List resources from all MCP servers
resources = mcp.list_resources()
for r in resources:
    print(f"[{r.server_id}] {r.uri} ({r.mime_type}): {r.name}")

# Read a specific resource
content = mcp.read_resource("local_fs:///home/user/config.json")
print(content)

# Subscribe to resource updates
mcp.subscribe_resource("local_fs:///home/user/config.json")

Prompt Templates

python
# List prompts from MCP servers
prompts = mcp.list_prompts()
for p in prompts:
    print(f"[{p.server_id}] {p.name}: {p.description}")

# Get a filled prompt
prompt = mcp.get_prompt("local_fs", "summarize_file", {"path": "/data/report.txt"})
print(prompt.messages)

Dynamic Registration

MCP servers can be registered and unregistered at runtime:

python
# Register on-the-fly
mcp.register_server("temp_server", MCPServerConfig(
    server_id="temp_server",
    name="Temporary",
    transport="stdio",
    cmd=["python", "-m", "my_temp_server"]
))

# Use it...

# Unregister when done
mcp.unregister_server("temp_server")
# All synced tools are automatically removed

LLM Sampling (MCP → Agent)

When an MCP server needs LLM inference, it sends a sampling request through the gateway:

python
# The agent handles this automatically if it has LLM capability
# The MCP gateway forwards the request as mcp/sampling/req

# Manual sampling response (if needed):
mcp.respond_sampling(request_id, content="Generated text", model="my-model")

A2E Protocol v1.0 — Released under the MIT License.