A2A代理集成MCP服务器

一个基于模型上下文协议(MCP)的服务器,用于桥接使用A2A协议的AI代理,动态暴露代理技能并管理代理注册。

  • by darrelmiller
  • C#
  • 本地部署
  • 1 星标
  • 更新于
在 GitHub 查看 darrelmiller/a2abridge

使用说明

A2ABridge-用于A2A代理集成的MCP服务器

一种MCP(模型上下文协议)服务器,使用代理到代理(A2A)协议桥接AI代理。此服务器将代理技能作为MCP工具动态公开,并管理代理注册。

特性

  • 动态工具注册:注册代理时,自动将代理技能作为MCP工具公开
  • 代理管理:通过MCP工具添加和删除代理
  • 永久存储:代理注册保存到本地文件(agents.json)
  • A2A协议支持:使用A2A客户端库与注册代理进行交互
  • 异步任务支持:自动轮询长时间运行的代理任务,直到完成
  • 伪影提取:从代理任务工件、历史记录或状态消息中检索响应
  • 开放遥测仪器:调试和监控的全面跟踪

建筑

组件

  1. 代理商注册 (Services/AgentRegistry.cs)

    • 管理注册代理人的集合
    • 将代理信息持久化到 agents.json
    • 从提供的URL获取和缓存代理卡
    • 使用 AgentCard 模型来自 A2A NuGet包
  2. 动态McpServer (DynamicMcpServer.cs)

    • 实施MCP服务器协议
    • 基于注册的代理动态生成工具定义
    • 将工具调用路由到适当的代理
    • 处理同步(AgentMessage)和异步(AgentTask)响应
    • 轮询任务直到完成,并从工件中提取结果
  3. A2A客户端 (从 A2A NuGet包)

    • 通过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协议通信

用法示例

  1. 启动MCP服务器
  2. 使用MCP客户端调用 AddAgent 带有代理卡URL的工具
  3. 代理的技能会自动作为工具提供
  4. 使用呼叫代理技能 {alias}_{skillName} 刀具样式
  5. 代理通过以下方式在服务器重启过程中持续存在 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、状态、轮询计数和端点