A2ABridge-用于A2A代理集成的MCP服务器
一种MCP(模型上下文协议)服务器,使用代理到代理(A2A)协议桥接AI代理。此服务器将代理技能作为MCP工具动态公开,并管理代理注册。
特性
- 动态工具注册:注册代理时,自动将代理技能作为MCP工具公开
- 代理管理:通过MCP工具添加和删除代理
- 永久存储:代理注册保存到本地文件(
agents.json) - A2A协议支持:使用A2A客户端库与注册代理进行交互
- 异步任务支持:自动轮询长时间运行的代理任务,直到完成
- 伪影提取:从代理任务工件、历史记录或状态消息中检索响应
- 开放遥测仪器:调试和监控的全面跟踪
建筑
组件
- 代理商注册 (
Services/AgentRegistry.cs)
- 管理注册代理人的集合 - 将代理信息持久化到 agents.json - 从提供的URL获取和缓存代理卡 - 使用 AgentCard 模型来自 A2A NuGet包
- 动态McpServer (
DynamicMcpServer.cs)
- 实施MCP服务器协议 - 基于注册的代理动态生成工具定义 - 将工具调用路由到适当的代理 - 处理同步(AgentMessage)和异步(AgentTask)响应 - 轮询任务直到完成,并从工件中提取结果
- A2A客户端 (从
A2ANuGet包)
- 通过HTTP处理与A2A代理的通信 - 基于代理端点URI的工厂创建实例
MCP工具
管理工具
AddAgent
通过获取代理卡并将其添加到注册表来注册新代理。
参数:
alias(string):此代理使用的别名urlToAgentCard(string):代理卡JSON的URL
例子:
{
"alias": "weatherAgent",
"urlToAgentCard": "https://example.com/agents/weather/agent-card"
}脱模剂
通过别名从注册表中删除代理。
参数:
alias(string):要删除的代理的别名
例子:
{
"alias": "weatherAgent"
}动态代理工具
一旦代理注册,它的每一项技能都可以作为具有命名模式的MCP工具使用: {alias}_{skillName}
参数:
input(string):传递给代理技能的输入字符串
例子: 如果您使用别名注册代理 weatherAgent 它有一种叫做 getForecast,您可以致电:
{
"input": "What's the weather in Seattle?"
}使用工具名称 weatherAgent_getForecast.
代理卡格式
代理卡遵循A2A协议规范。关键属性包括:
- 名字:代理人的可读名称
- 描述:描述代理人的工作
- 网址:托管代理的URL
- 协议版本A2A协议的版本(例如“2024-11-05”)
- 技能:代理可以执行的一系列功能
代理卡结构示例:
{
"name": "Echo Agent",
"description": "Echoes back messages with a prefix",
"url": "https://example.com/.well-known/agent-card.json",
"protocolVersion": "2024-11-05",
"skills": [
{
"name": "echo",
"description": "Echoes back any message sent to the agent"
}
]
}有关完整的A2A代理卡规格,请参阅 A2A协议文件.
建立和运行
构建
dotnet build跑
dotnet run服务器使用stdio传输,并通过标准输入/输出进行通信,使其与MCP客户端兼容。
配置
- 存储位置:代理注册存储在
agents.json在应用程序的基本目录中 - 运输:使用stdio(标准输入/输出)进行MCP通信
- 日志记录:所有日志都指向stderr,以避免干扰MCP协议通信
用法示例
- 启动MCP服务器
- 使用MCP客户端调用
AddAgent带有代理卡URL的工具 - 代理的技能会自动作为工具提供
- 使用呼叫代理技能
{alias}_{skillName}刀具样式 - 代理通过以下方式在服务器重启过程中持续存在
agents.json
MCP客户端配置
要将此服务器与MCP客户端(例如Claude Desktop)一起使用,请将以下内容添加到MCP配置文件中:
{
"mcpServers": {
"a2abridge": {
"command": "dotnet",
"args": [
"run",
"--project",
"path/to/A2ABridge/A2ABridge.csproj"
]
}
}
}或者,如果你已经构建了项目,你可以直接运行可执行文件:
{
"mcpServers": {
"a2abridge": {
"command": "path/to/A2ABridge/bin/Debug/net9.0/A2ABridge.exe"
}
}
}看 example-mcp-config.json 以获得完整的配置示例。
代理卡示例
代理卡示例见 example-agent-card.json 用于测试目的。
依赖项
- .NET 9.0
- 模型上下文协议(0.4.0-preview.3)
- 微软。扩展。主机(9.0.0)
- 微软。扩展。Http(10.0.0)
- A2A(0.3.3-preview)-具有AgentCard模型的代理到代理协议库
- 开放遥测。出口商。控制台(1.14.0)
- 开放遥测。扩展。主机(1.14.0)
- 开放遥测。仪表。Http(1.14.0)
项目结构
A2ABridge/
├── Models/
│ └── RegisteredAgent.cs # Registered agent model
├── Services/
│ └── AgentRegistry.cs # Agent management service
├── DynamicMcpServer.cs # MCP server implementation with task polling
├── Program.cs # Application entry point with OpenTelemetry setup
└── agents.json # Persistent agent storage (created at runtime)备注
- 该项目使用官方
A2A的NuGet包AgentCard模型和相关类型 - A2A端点来源于代理卡URL
- 代理技能的所有工具输入都以字符串形式传递
- 错误处理返回适当的MCP错误代码,以实现更好的客户端集成
- 任务处理:代理返回时
AgentTask而不是AgentMessage,桥自动:
- 检查任务是否处于终端状态(已完成、已取消、失败、已拒绝) - 每500毫秒(最多60秒)轮询一次任务,直到它达到终端状态 - 从任务工件(主要)、任务历史或状态消息(回退)中提取响应
- 开放遥测:所有A2A操作都配有跟踪活动:
- A2A.SendMessage -消息发送操作 - A2A.PollTask -任务轮询生命周期 - A2A.GetTask -单个任务状态检查 - 标签包括任务ID、状态、轮询计数和端点
