概念、架构、协议格式到裸协议实现,彻底搞懂 MCP 的本质

一、MCP 是什么?

 一句话概括:
MCP 定义了一套统一的接口规范,让 AI 模型能以标准化的方式发现并调用外部能力。

二、为什么需要 MCP?

MCP 被比作 "AI 的 USB-C 接口" —— USB-C 让所有设备用同一种接口连接外设,MCP 让所有 AI 应用用同一种协议连接工具。

image

 

三、MCP 架构:三个核心角色

image

 

四、三大核心能力

image

  提示:Tools 是最常用的,大多数 MCP Server 只实现 Tools 就够了。

五、完整交互流程:三个阶段

image

 

image

 

image

 

六、协议格式:一个端点 + JSON-RPC

image

 

通用信封格式

{ "jsonrpc": "2.0", // 固定版本 "id": 1, // 请求 ID(通知无 id) "method": "xxx", // 方法名 "params": {} // 参数 / result: 结果 }

核心协议消息示例

initialize

// 请求 { "jsonrpc": "2.0", "id": 1, "method": "initialize", "params": { "protocolVersion": "2025-03-26", "capabilities": {}, "clientInfo": {"name": "my-client", "version": "1.0"} } } // 响应 { "jsonrpc": "2.0", "id": 1, "result": { "protocolVersion": "2025-03-26", "capabilities": {"tools": {}}, "serverInfo": {"name": "my-server", "version": "1.0"} } }

 

tools/list

// 请求 { "jsonrpc": "2.0", "id": 2, "method": "tools/list", "params": {} } // 响应 { "jsonrpc": "2.0", "id": 2, "result": { "tools": [{ "name": "get_weather", "description": "获取指定城市的天气", "inputSchema": { "type": "object", "properties": { "city": {"type": "string", "description": "城市名称"} }, "required": ["city"] } }] } }

 

tools/call

// 请求 { "jsonrpc": "2.0", "id": 3, "method": "tools/call", "params": { "name": "get_weather", "arguments": {"city": "北京"} } } // 响应 { "jsonrpc": "2.0", "id": 3, "result": { "content": [{"type": "text", "text": "晴天 25°C"}] } }

七、补充:JSON-RPC 2.0 标准

 JSON-RPC 2.0 是一个已有的开放标准,和 MCP 无关。
MCP 聪明地借用了这个成熟标准,只需要定义具体的 method 有哪些,以及它们的 params 和 result 格式。

八、总结回顾

image

image

 

九、调试工具

通过调试工具抓包可以方便了解协议

1、安装:pnpm 

npm install -g pnpm

2、安装并启动官方调试工具

pnpm dlx @modelcontextprotocol/inspector

3、复制启动

image

 

image

十、常见问题

偶发超时

MCP工具请求超时

超时的问题有可能是因为 配的ingress地址,ingress也是一个反向代理,代理可能针对SSE长连接有超时时间,代理层直接推送超时响应。目前dify统一改为走k8s 直连的方式。我dify测试了几轮没发现超时

企业微信截图_17557683705364

404问题

MCP客户端通信 mcp/message?sessionId=770f849c-4ef9-4a8b-8032-d3ffc7cfb4a6 404

MCP客户端配置的是Ingrees地址,上线后未能评估出一期只支持1台MCP服务

由于MCP通信是采用SSE 加JSON RPC,当在服务A建立SSE后链接后, JSON RPC请求到服务B

导致找不到Session

 

方案一:广播模式(推荐)

  1. 当收服务收到请求后,发现此链接不存在,广播给集群中的所有MCP服务

方案二:Session使用中间件存储(redis)

  1. 建立SSE连接维护每个链接对应的服务
  2. 当集群中的服务收到JSON RPC请求从中间件中获取Sesson信息,如果发现不是自己创建的Session路由到对应的服务
posted @ 2025-08-21 18:31  意犹未尽  阅读(62)  评论(0)    收藏  举报