Files
AstrBot/openspec/mcp.md
LIghtJUNction 49988912e1 refactor(openspec): restructure protocol specifications
Major changes:
- Add A2A protocol (Google Agent-to-Agent)
- Add ACP protocol (Agent Communication)
- Add MCP protocol (Model Context Protocol)
- Add LSP protocol (Language Server Protocol)
- Add environment variables spec (env.md)
- Add path spec with XDG and Linux server support (path.md)
- Update ABP protocol to plugin-as-service model
- Delete legacy OpenSpec change proposals

New protocol specs:
- a2a.md: Cross-platform agent interoperability
- acp.md: Local agent control (IDE integration)
- mcp.md: AI model to tools/data connection
- lsp.md: Editor language features
- abp.md: AstrBot plugin protocol
- env.md: Environment variable conventions
- path.md: XDG + Linux server paths
2026-03-26 22:58:22 +08:00

8.2 KiB
Raw Blame History

MCP (Model Context Protocol) 协议规范

概述

MCPModel Context Protocol是由 Anthropic 创建的开放协议,用于将 AI 模型连接到外部工具和数据源。

核心定位MCP 为 AI 模型提供标准化的工具调用和上下文获取能力,类似于 USB 协议为设备提供的标准化连接方式。

核心功能

MCP 服务器通过三个构建块提供功能:

功能 说明 示例 控制方
Tools LLM 可以主动调用的函数 搜索航班、发送消息、创建日历事件 模型
Resources 被动数据源,为上下文提供信息 检索文档、访问知识库、读取日历 应用程序
Prompts 预构建的指令模板 规划假期、总结会议内容、起草电子邮件 用户

与 A2A/ACP 的关系

协议 定位 关系
MCP AI 模型与外部工具/数据源的连接 专注于"工具和上下文"
A2A Agent 之间的通信和协作 专注于"互操作"
ACP IDE 与本地 Agent 的紧密集成 专注于"本地控制"

互补关系

  • MCP 为 Agent 提供工具和数据访问能力
  • A2A/ACP 处理 Agent 之间的通信
  • 三者共同构成完整的 AI Agent 通信栈

架构

┌─────────────────────────────────────────┐
│           AI 应用 (Client)               │
│  - 模型                                 │
│  - 上下文管理                           │
└─────────────────────────────────────────┘
                      │ MCP 协议
                      ▼
┌─────────────────────────────────────────┐
│           MCP 服务器                     │
│  - Tools (工具)                         │
│  - Resources (资源)                     │
│  - Prompts (提示)                       │
└─────────────────────────────────────────┘

传输层

Stdio本地

  • 适用场景:基于本地子进程的 MCP 服务器
  • 协议:通过 stdin/stdout 的 JSON-RPC 2.0
  • 启动方式:使用配置的 command 启动子进程
{"jsonrpc":"2.0","method":"initialize","params":{...},"id":1}

HTTP/SSE远程

  • 适用场景:远程 MCP 服务器
  • 协议HTTP + Server-Sent Events (SSE) 用于服务器→客户端
  • 端点RESTful JSON-RPC over HTTP POST

核心方法

工具 (Tools)

协议操作

方法 目的 返回
tools/list 发现可用工具 带有架构的工具定义数组
tools/call 执行特定工具 工具执行结果

工具定义示例

{
  "name": "searchFlights",
  "description": "Search for available flights",
  "inputSchema": {
    "type": "object",
    "properties": {
      "origin": { "type": "string", "description": "Departure city" },
      "destination": { "type": "string", "description": "Arrival city" },
      "date": { "type": "string", "format": "date", "description": "Travel date" }
    },
    "required": ["origin", "destination", "date"]
  }
}

用户交互模型:工具由模型控制,但强调人工监督:

  • UI 中显示可用工具,允许用户定义是否可用
  • 针对单个工具执行的确认对话框
  • 预先批准某些安全操作的权限设置
  • 显示所有工具执行情况的活动日志

资源 (Resources)

协议操作

方法 目的 返回
resources/list 列出可用的直接资源 资源描述符数组
resources/templates/list 发现资源模板 资源模板定义数组
resources/read 检索资源内容 带有元数据的资源数据
resources/subscribe 监控资源变化 订阅确认

资源模板示例

{
  "uriTemplate": "weather://forecast/{city}/{date}",
  "name": "weather-forecast",
  "title": "Weather Forecast",
  "description": "Get weather forecast for any city and date",
  "mimeType": "application/json"
}

参数补全:动态资源支持参数补全,例如输入 "Par" 可能会提示 "Paris" 或 "Park City"。

用户交互模型:资源是应用程序驱动的:

  • 文件夹式结构的树状或列表视图
  • 用于查找特定资源的搜索和过滤界面
  • 基于启发式方法或 AI 选择的自动上下文包含

提示 (Prompts)

协议操作

方法 目的 返回
prompts/list 发现可用提示词 提示词描述符数组
prompts/get 检索提示词详情 带有参数的完整提示词定义

提示词示例

{
  "name": "plan-vacation",
  "title": "Plan a vacation",
  "description": "Guide through vacation planning process",
  "arguments": [
    { "name": "destination", "type": "string", "required": true },
    { "name": "duration", "type": "number", "description": "days" },
    { "name": "budget", "type": "number", "required": false },
    { "name": "interests", "type": "array", "items": { "type": "string" } }
  ]
}

用户交互模型:提示由用户控制,需要显式调用:

  • 斜杠命令(输入 "/" 查看可用提示词)
  • 操作面板 (Command palettes)
  • 常用提示词的专用 UI 按钮

消息格式

请求

{
  "jsonrpc": "2.0",
  "id": "unique-id",
  "method": "tools/call",
  "params": {
    "name": "searchFlights",
    "arguments": {
      "origin": "NYC",
      "destination": "Barcelona",
      "date": "2024-06-15"
    }
  }
}

响应

{
  "jsonrpc": "2.0",
  "id": "unique-id",
  "result": {
    "content": [
      {
        "type": "text",
        "text": "Found 3 flights..."
      }
    ]
  }
}

通知

{
  "jsonrpc": "2.0",
  "method": "notifications/resources/updated",
  "params": {
    "uri": "calendar://events/2024"
  }
}

能力 (Capabilities)

客户端能力

{
  "roots": {
    "listChanged": true
  },
  "sampling": {}
}

服务器能力

{
  "tools": { "listChanged": true },
  "resources": { "subscribe": true, "listChanged": true },
  "prompts": { "listChanged": true }
}

多服务器整合

MCP 的真正威力在多服务器协同工作时显现。

示例:多服务器差旅规划

┌─────────────────────────────────────────┐
│         AI 差旅规划应用                   │
└─────────────────────────────────────────┘
          │          │          │
          ▼          ▼          ▼
┌────────────┐ ┌──────────┐ ┌─────────────┐
│ 旅行服务器  │ │天气服务器 │ │日历/邮件服务器│
│ - 航班搜索  │ │ - 气候数据│ │ - 日程管理   │
│ - 酒店预订  │ │ - 预报    │ │ - 发送邮件   │
└────────────┘ └──────────┘ └─────────────┘

完整流程

  1. 用户调用提示词:plan-vacation(destination: "Barcelona", date: "2024-06-15")
  2. 用户选择资源:calendar://my-calendar/June-2024travel://preferences/europe
  3. AI 读取资源收集上下文
  4. AI 执行工具:searchFlights()checkWeather()
  5. AI 请求用户批准:bookHotel()createCalendarEvent()
  6. 结果:量身定制的巴塞罗那之旅规划和预订

错误码

码值 名称 描述
-32700 Parse Error 无效的 JSON
-32600 Invalid Request 格式错误的请求
-32601 Method Not Found 未知方法
-32602 Invalid Params 无效参数
-32603 Internal Error 服务器内部错误

实现注意事项

  • MCP 客户端使用指数退避管理重连
  • 工具调用结果序列化为 JSON
  • 资源可订阅变更通知
  • 工具执行前可能需要用户授权
  • 支持参数补全以帮助用户发现有效值