Skip to content

MCP Bridge Capability Specification

Capability Identity

PropertyValue
EnumA2ECapability.MCP
String"mcp"
Plugin TypeMCPPlugin
Plugin Priority10
Namespacemcp/*
Message Count20

Overview

The MCP (Model Context Protocol) Bridge connects A2E to the external MCP ecosystem. It acts as a gateway between A2E agents and MCP servers, exposing MCP tools, resources, prompts, and sampling through the A2E protocol. A2E acts as an MCP client — connecting to one or more MCP servers (over stdio subprocess or HTTP+SSE) and proxying their capabilities:

  • MCP Tools → appear in tool/list/resp with source="mcp", callable via tool/call/req (transparent)
  • MCP Resourcesmcp/resource/list + mcp/resource/read
  • MCP Promptsmcp/prompt/list + mcp/prompt/get
  • MCP Samplingmcp/sample/req (server asks agent to run LLM)
  • MCP Rootsmcp/root/list (agent exposes accessible paths to servers)

Architecture

Protocol Flow — Server Registration

Message Types (20)

Server Management (7)

mcp/server/list/req — MCPServerListRequest

Agent → Host. List all registered MCP servers and their status.

FieldTypeRequiredDefaultDescription
typestrYes"mcp/server/list/req"Message type
idstrYesautoMessage UUID
versionstrYes"1.0"Protocol version
tsfloatYesautoTimestamp
status_filterstrNo""Filter by server status (empty = all)

mcp/server/list/resp — MCPServerListResponse

Host → Agent.

FieldTypeRequiredDefaultDescription
typestrYes"mcp/server/list/resp"Message type
idstrYesautoMessage UUID
versionstrYes"1.0"Protocol version
tsfloatYesautoTimestamp
req_idstrYes""Echoes request ID
serverslist[dict]Yes[]List of MCPServerInfo objects

mcp/server/register/req — MCPServerRegisterRequest

Agent → Host. Register and connect to a new MCP server.

FieldTypeRequiredDefaultDescription
typestrYes"mcp/server/register/req"Message type
idstrYesautoMessage UUID
versionstrYes"1.0"Protocol version
tsfloatYesautoTimestamp
configdictYes{}MCPServerConfig (see below)

mcp/server/register/resp — MCPServerRegisterResponse

Host → Agent.

FieldTypeRequiredDefaultDescription
typestrYes"mcp/server/register/resp"Message type
idstrYesautoMessage UUID
versionstrYes"1.0"Protocol version
tsfloatYesautoTimestamp
req_idstrYes""Echoes request ID
okboolYesFalseWhether registration succeeded
serverdictNo{}MCPServerInfo (on success)
errorstrNo""Error message (on failure)

mcp/server/unregister/req — MCPServerUnregisterRequest

Agent → Host. Disconnect and remove an MCP server.

FieldTypeRequiredDefaultDescription
typestrYes"mcp/server/unregister/req"Message type
idstrYesautoMessage UUID
versionstrYes"1.0"Protocol version
tsfloatYesautoTimestamp
server_idstrYes""Server to unregister

mcp/server/unregister/resp — MCPServerUnregisterResponse

Host → Agent.

FieldTypeRequiredDefaultDescription
typestrYes"mcp/server/unregister/resp"Message type
idstrYesautoMessage UUID
versionstrYes"1.0"Protocol version
tsfloatYesautoTimestamp
req_idstrYes""Echoes request ID
okboolYesFalseWhether unregistration succeeded
server_idstrYes""Unregistered server ID

mcp/server/push — MCPServerPush

Host → Agent (server-initiated). Forwarded MCP notification.

FieldTypeRequiredDefaultDescription
typestrYes"mcp/server/push"Message type
idstrYesautoMessage UUID
versionstrYes"1.0"Protocol version
tsfloatYesautoTimestamp
server_idstrYes""Source MCP server
methodstrYes""MCP notification method
paramsdictNo{}Notification parameters

Forwarded MCP notification methods:

MethodDescription
notifications/tools/list_changedTool list has changed, re-sync needed
notifications/resources/list_changedResource list changed
notifications/resources/updatedA specific resource was updated
notifications/prompts/list_changedPrompt list changed
notifications/progressProgress update from server
notifications/messageLog message from server

Resources (6)

mcp/resource/list/req — MCPResourceListRequest

Agent → Host. List resources across all (or one) MCP server(s).

FieldTypeRequiredDefaultDescription
typestrYes"mcp/resource/list/req"Message type
idstrYesautoMessage UUID
versionstrYes"1.0"Protocol version
tsfloatYesautoTimestamp
server_idstrNo""Filter by server (empty = all)
cursorstrNo""Pagination cursor

mcp/resource/list/resp — MCPResourceListResponse

Host → Agent.

FieldTypeRequiredDefaultDescription
typestrYes"mcp/resource/list/resp"Message type
idstrYesautoMessage UUID
versionstrYes"1.0"Protocol version
tsfloatYesautoTimestamp
req_idstrYes""Echoes request ID
resourceslist[dict]Yes[]List of MCPResource objects
next_cursorstrNo""Next page cursor

mcp/resource/read/req — MCPResourceReadRequest

Agent → Host. Read a resource by URI.

FieldTypeRequiredDefaultDescription
typestrYes"mcp/resource/read/req"Message type
idstrYesautoMessage UUID
versionstrYes"1.0"Protocol version
tsfloatYesautoTimestamp
uristrYes""Resource URI
server_idstrNo""Server hint (auto-routed if empty)

mcp/resource/read/resp — MCPResourceReadResponse

Host → Agent.

FieldTypeRequiredDefaultDescription
typestrYes"mcp/resource/read/resp"Message type
idstrYesautoMessage UUID
versionstrYes"1.0"Protocol version
tsfloatYesautoTimestamp
req_idstrYes""Echoes request ID
contentslist[dict]Yes[]List of MCPResourceContent blocks
server_idstrNo""Originating server
errorstrNo""Error if read failed

mcp/resource/subscribe/req — MCPResourceSubscribeRequest

Agent → Host. Subscribe to change notifications for a resource URI.

FieldTypeRequiredDefaultDescription
typestrYes"mcp/resource/subscribe/req"Message type
idstrYesautoMessage UUID
versionstrYes"1.0"Protocol version
tsfloatYesautoTimestamp
uristrYes""Resource URI to subscribe
server_idstrNo""Server hint

mcp/resource/subscribe/resp — MCPResourceSubscribeResponse

Host → Agent.

FieldTypeRequiredDefaultDescription
typestrYes"mcp/resource/subscribe/resp"Message type
idstrYesautoMessage UUID
versionstrYes"1.0"Protocol version
tsfloatYesautoTimestamp
req_idstrYes""Echoes request ID
okboolYesFalseSubscription status
errorstrNo""Error if subscription failed

Prompts (4)

mcp/prompt/list/req — MCPPromptListRequest

Agent → Host. List all prompt templates.

FieldTypeRequiredDefaultDescription
typestrYes"mcp/prompt/list/req"Message type
idstrYesautoMessage UUID
versionstrYes"1.0"Protocol version
tsfloatYesautoTimestamp
server_idstrNo""Filter by server (empty = all)
cursorstrNo""Pagination cursor

mcp/prompt/list/resp — MCPPromptListResponse

Host → Agent.

FieldTypeRequiredDefaultDescription
typestrYes"mcp/prompt/list/resp"Message type
idstrYesautoMessage UUID
versionstrYes"1.0"Protocol version
tsfloatYesautoTimestamp
req_idstrYes""Echoes request ID
promptslist[dict]Yes[]List of MCPPrompt objects
next_cursorstrNo""Next page cursor

mcp/prompt/get/req — MCPPromptGetRequest

Agent → Host. Render a prompt template with argument values.

FieldTypeRequiredDefaultDescription
typestrYes"mcp/prompt/get/req"Message type
idstrYesautoMessage UUID
versionstrYes"1.0"Protocol version
tsfloatYesautoTimestamp
namestrYes""Prompt template name
argumentsdictNo{}Argument values
server_idstrNo""Server hint

mcp/prompt/get/resp — MCPPromptGetResponse

Host → Agent. Returns LLM-ready messages.

FieldTypeRequiredDefaultDescription
typestrYes"mcp/prompt/get/resp"Message type
idstrYesautoMessage UUID
versionstrYes"1.0"Protocol version
tsfloatYesautoTimestamp
req_idstrYes""Echoes request ID
descriptionstrNo""Prompt description
messageslist[dict]Yes[]List of MCPPromptMessage objects
server_idstrNo""Originating server
errorstrNo""Error if rendering failed

Sampling (2) — Server-initiated LLM Call

mcp/sample/req — MCPSamplingRequest

Host → Agent (server-initiated). MCP server requests an LLM completion.

FieldTypeRequiredDefaultDescription
typestrYes"mcp/sample/req"Message type
idstrYesautoMessage UUID
versionstrYes"1.0"Protocol version
tsfloatYesautoTimestamp
server_idstrYes""Originating MCP server
mcp_request_idstrYes""MCP JSON-RPC request ID
messageslist[dict]Yes[]LLM message history
model_preferencesdictNo{}Model preference hints
system_promptstrNo""System prompt override
include_contextstrNo"none"Context inclusion: none, thisServer, allServers
temperaturefloatNo1.0Sampling temperature
max_tokensintNo1024Max tokens to generate
stop_sequenceslist[str]No[]Stop sequences
metadatadictNo{}Additional metadata

mcp/sample/resp — MCPSamplingResponse

Agent → Host. Forwarded back to the originating MCP server.

FieldTypeRequiredDefaultDescription
typestrYes"mcp/sample/resp"Message type
idstrYesautoMessage UUID
versionstrYes"1.0"Protocol version
tsfloatYesautoTimestamp
req_idstrYes""Echoes request ID
server_idstrYes""Target MCP server
mcp_request_idstrYes""MCP JSON-RPC request ID
rolestrYes"assistant"Response role
contentdictYes{}Response content: {"type": "text", "text": "..."}
modelstrNo""Model used
stop_reasonstrNo""endTurn, stopSequence, maxTokens
errorstrNo""Error if agent refused

Roots (2) — Agent filesystem exposure

mcp/root/list/req — MCPRootsListRequest

Host → Agent (server-initiated). MCP server asking for roots.

FieldTypeRequiredDefaultDescription
typestrYes"mcp/root/list/req"Message type
idstrYesautoMessage UUID
versionstrYes"1.0"Protocol version
tsfloatYesautoTimestamp
server_idstrYes""Requesting MCP server
mcp_request_idstrYes""MCP JSON-RPC request ID

mcp/root/list/resp — MCPRootsListResponse

Agent → Host. Roots the agent exposes.

FieldTypeRequiredDefaultDescription
typestrYes"mcp/root/list/resp"Message type
idstrYesautoMessage UUID
versionstrYes"1.0"Protocol version
tsfloatYesautoTimestamp
req_idstrYes""Echoes request ID
server_idstrYes""Target MCP server
mcp_request_idstrYes""MCP JSON-RPC request ID
rootslist[dict]Yes[]List of MCPRoot objects

Data Models

MCPServerConfig

FieldTypeRequiredDefaultDescription
server_idstrNoauto hex[:8]Unique server identifier
namestrNo""Display name
transportMCPTransportNo"stdio"Transport type: stdio, sse, ws
cmdlist[str]No[]Stdio command + args
cwdstrNo""Working directory (stdio)
envdictNo{}Environment variables (stdio)
urlstrNo""HTTP/SSE/WS URL
headersdictNo{}HTTP headers (SSE/WS)
timeoutintNo300Request timeout in seconds
auto_reconnectboolNoTrueAuto-reconnect on disconnect
tool_allow_listlist[str]No[]Allowed tool names (empty = all)
resource_allow_listlist[str]No[]Allowed resource URIs (empty = all)

MCPServerInfo

FieldTypeDescription
server_idstrUnique identifier
namestrDisplay name
transportstrTransport type
statusMCPServerStatusconnecting, ready, error, disconnected
mcp_versionstrMCP protocol version
server_namestrMCP server software name
server_versionstrMCP server software version
tools_countintNumber of exposed tools
resources_countintNumber of exposed resources
prompts_countintNumber of exposed prompts
last_ping_msfloatLast ping latency
errorstrLast error message
connected_atfloatConnection timestamp

MCPResource

FieldTypeDescription
uristrResource URI
namestrDisplay name
descriptionstrDescription
mime_typestrMIME type
server_idstrOriginating server
annotationsdictMCP annotations

MCPResourceContent

FieldTypeDescription
uristrResource URI
mime_typestrMIME type (default: text/plain)
textstrText content
blobstrBase64-encoded binary content
typestrContent type: text or blob

MCPPrompt

FieldTypeDescription
namestrPrompt template name
descriptionstrDescription
server_idstrOriginating server
argumentslist[dict]Argument definitions: {name, description, required}

MCPPromptMessage

FieldTypeDescription
rolestruser or assistant
contentdictStructured content: `{type: "text"

MCPRoot

FieldTypeDescription
uristrFilesystem root URI
namestrDisplay name

Error Codes — MCPErrorCode

CodeEnum ValueDescriptionRetryable
mcp_server_not_foundMCP_SERVER_NOT_FOUNDServer ID not registeredNo
mcp_server_unavailableMCP_SERVER_UNAVAILABLEServer not connectedYes
mcp_tool_not_foundMCP_TOOL_NOT_FOUNDTool not found on any serverNo
mcp_resource_not_foundMCP_RESOURCE_NOT_FOUNDResource URI not foundNo
mcp_prompt_not_foundMCP_PROMPT_NOT_FOUNDPrompt name not foundNo
mcp_transport_errorMCP_TRANSPORT_ERRORTransport connection errorYes
mcp_protocol_errorMCP_PROTOCOL_ERRORMCP protocol violationNo
mcp_sampling_refusedMCP_SAMPLING_REFUSEDAgent refused LLM samplingNo
mcp_capability_missingMCP_CAPABILITY_MISSINGMCP capability not availableNo

Connection Types

MCPConnection (ABC)

Base class providing JSON-RPC 2.0 helpers, request/response correlation, and caching.

MethodDescription
call(method, params, timeout)JSON-RPC request
notify(method, params)JSON-RPC notification
_do_initialize()MCP handshake (initialize + initialized + cache)
call_tool(tool_name, arguments)MCP tools/call
read_resource(uri)MCP resources/read
get_prompt(name, arguments)MCP prompts/get

StdioMCPConnection

Spawns subprocess, NDJSON over stdin/stdout, daemon reader threads, auto-reconnect.

SSEMCPConnection

HTTP+SSE transport. First SSE "endpoint" event provides the POST URL. Posts JSON-RPC to that URL.

Tool Syncing

When a server is registered, its tools are synced into the host's ToolRegistry with namespaced names:

python
def _sync_tools(self, conn):
    for tool in conn.tools:
        namespaced_name = f"{conn.server_id}__{tool.name}"
        self.tool_registry.register(namespaced_name, tool, runner=conn.call_tool)

MCP tools become callable via the standard tool/call/req — the agent does not need to know the tool is MCP-backed.

Push Callbacks

CallbackTriggerAction
_on_pushMCP notification receivedForward as MCPServerPush, re-sync on tools/list_changed
_on_samplingMCP createMessage requestForward to A2E agent as MCPSamplingRequest
_on_roots_reqMCP roots/list requestImmediately respond with configured roots list

Wire Examples

Register a Stdio MCP Server

json
{"type":"mcp/server/register/req","id":"r1s2t3","version":"1.0","ts":1716123456.789,"config":{"server_id":"fs","name":"filesystem","transport":"stdio","cmd":["npx","-y","@modelcontextprotocol/server-filesystem","/tmp"],"cwd":"","env":{},"url":"","headers":{},"timeout":300,"auto_reconnect":true,"tool_allow_list":[],"resource_allow_list":[]}}
json
{"type":"mcp/server/register/resp","id":"u4v5w6","version":"1.0","ts":1716123457.200,"req_id":"r1s2t3","ok":true,"server":{"server_id":"fs","name":"filesystem","transport":"stdio","status":"ready","tools_count":5,"resources_count":0,"prompts_count":0},"error":""}

List Resources

json
{"type":"mcp/resource/list/req","id":"x7y8z9","version":"1.0","ts":1716123458.100,"server_id":"","cursor":""}

Get a Prompt

json
{"type":"mcp/prompt/get/req","id":"a0b1c2","version":"1.0","ts":1716123459.100,"name":"code_review","arguments":{"language":"python"},"server_id":"reviewer"}

Security Considerations

  1. Tool allow lists: tool_allow_list and resource_allow_list restrict what the agent can access
  2. Transport isolation: Stdio connections run in subprocesses; SSE connections use HTTP
  3. Sampling opt-in: Agent may refuse LLM sampling requests (returns mcp_sampling_refused)
  4. Auto-reconnect: Configurable; may be disabled for security-sensitive environments
  5. Root exposure: Agent explicitly controls which filesystem paths are visible to MCP servers

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