MCP
概览
- 与host, llm端的交互
通讯协议
- MCP传输层将MCP协议消息转换为JSON-RPC格式进行传输, 并将接收到的JSON-RPC消息转为MCP协议消息
stdio
- 本地进程工具使用stdio的通信方式
http+sse
- 流程:
- 客户端通过配置的mcp-server的url, 向服务端发起get请求, 建立连接(服务端默认端点为/sse)
- 服务端返回向客户端推送消息的端点url, 如/messages, 后续服务端将通过这个端点向客户端推送sse消息
- 客户端发送post请求, 将问题通过/messages端点, 发给服务端, 服务端返回响应
- 这种模式存在问题:
- 不支持断线重连/恢复 当 SSE 连接断开时,所有会话状态丢失,客户端必须重新建立连接并初始化整个会话。例如,正在执行的大型文档分析任务会因 WiFi 不稳定而完全中断,迫使用户重新开始整个过程。
- 服务器需维护长连接 服务器必须为每个客户端维护一个长时间的 SSE 连接,大量并发用户会导致资源消耗剧增。当服务器需要重启或扩容时,所有连接都会中断,影响用户体验和系统可靠性。
- 服务器消息只能通过 SSE 传递 即使是简单的请求-响应交互,服务器也必须通过 SSE 通道返回信息,造成不必要的复杂性和开销。对于某些环境(如云函数)不适合长时间保持 SSE 连接。
- 基础设施兼容性限制 许多现有的 Web 基础设施如 CDN、负载均衡器、API 网关等可能不能正确处理长时间的 SSE 连接,企业防火墙可能会强制关闭超时连接,导致服务不可靠。
Streamable HTTP
- 统一 Endoint:移除专门的 /sse 端点,所有通信通过单一端点(当前官方 sdk 实现为 /mcp)进行
- 按需流式传输:服务器可灵活选择是返回普通 HTTP 响应还是升级为 SSE 流
- 会话标识:引入会话 ID 机制,支持状态管理和恢复
- 灵活初始化:客户端可通过空 GET 请求主动初始化 SSE 流
MCP-Inspector
- 运行调试
npx @modelcontextprotocol/inspector
java-sdk
- 官方sdk: https://github.com/modelcontextprotocol/java-sdk
- java8sdk: https://github.com/krrr/mcp-java8-sdk
client端与server端的交互流程
- HTTP+SSE 模式:
源码解析
- WebFluxSseServerTransportProvider
- SSE 端点配置与路由注册: SSE 端点配置与路由注册
- HTTP 与 SSE 协议转换: 将传统的 HTTP 请求转换为 SSE 流式传输协议,处理 SSE 的 data:、event: 等协议头,确保消息的流式传输符合 SSE 规范
- 连接生命周期管理: 管理客户端连接的建立、心跳维护和优雅关闭,支持高并发下的连接状态跟踪
- McpServerSession
- 会话状态维护: 管理单个客户端连接的会话状态,包括协议版本协商、能力交换(如工具支持)、消息序列化/反序列化(JSON-RPC)
- McpAsyncServer
- 异步服务编排:作为异步服务器的核心入口,协调工具调用、资源访问和提示模板的异步执行流程,支持响应式编程模型
- 工具与资源的动态加载: 根据配置动态加载工具(如 @Tool 注解的方法)和资源(如文件系统或数据库访问),支持热更新和版本控制
- 并发与性能优化: 通过 WebFlux 的非阻塞特性处理高并发请求,利用线程池隔离 I/O 密集型任务(如网络 I/O)和 CPU 密集型任务(如工具计算)
AI网关mcp-server-proxy
- 核心功能是将微服务转为mcp-server, 微服务的api转为tool
补充
JSONSchema/OpenApi/Mcp
JsonSchema:JSON数据结构的标准化描述语言;
是一种基于JSON的开放标准,用于定义、验证和描述JSON数据的结构。它规定了JSON数据的类型(如字符串、数字、对象、数组)、格式(如邮箱、日期)、约束(如必填字段、数值范围)等规则,是JSON数据的“元数据描述”。
解决JSON数据的“结构不一致”问题,广泛应用于数据验证(如API请求/响应校验)、API文档生成(如OpenAPI中的schema字段)、代码生成(如根据Schema自动生成数据模型)等场景
OpenAPI:RESTful API的标准化描述规范
- OpenAPI(前身为Swagger规范)是用于描述RESTful API的开放标准,采用YAML或JSON格式,定义API的端点(Endpoints)、请求方法(GET/POST等)、参数(Query/Header/Body)、请求/响应格式、认证方式(如OAuth2)等,是API的“契约文档”。
- 解决API文档“碎片化、不一致”问题,支持“设计优先”(Design-First)开发模式,通过自动化工具(如Swagger UI、Postman)生成API文档、客户端SDK、Mock服务等,提升API全生命周期效率
MCP协议:Model Context Protocol(模型上下文协议)
- MCP(Model Context Protocol)是Anthropic公司(Claude大模型所属公司)于2024年11月推出的开放标准协议,旨在标准化大型语言模型(LLM)与外部工具、数据源的交互方式,解决LLM“数据孤岛”问题(无法直接访问实时数据库、文件系统等),使LLM能安全、高效地调用外部资源
- 作为“AI世界的USB-C接口”,MCP定义了LLM与外部资源的“通信规则”,支持本地/远程工具调用、敏感数据代理(如医疗数据)、多系统协作(如企业工单处理)等场景
三者之间的关系:
- OpenAPI直接依赖JsonSchema作为其“数据结构描述工具”。在OpenAPI规范中,components/schemas字段用于定义API的数据模型(如请求体、响应体的结构),这些字段的内容遵循JsonSchema语法。例如
# OpenAPI 3.0示例(定义用户对象的结构)
openapi: 3.0.3
info:
title: 用户管理系统
version: 1.0.0
paths:
/users:
get:
responses:
'200':
description: 用户列表
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/User' # 引用JsonSchema定义的User对象
components:
schemas:
User:
type: object
properties:
id:
type: integer
name:
type: string
- MCP协议的核心组件“Tools(工具)”强制使用JsonSchema定义输入/输出参数的结构。例如,开发MCP Server时,每个工具的inputSchema字段需通过JsonSchema约束参数类型(如字符串、数字)、必填字段(如param)、格式(如邮箱)等,确保LLM调用工具时的数据一致性
{
"name": "demo-tool",
"description": "获取数据工具",
"inputSchema": {
"type": "object",
"properties": {
"param": { "type": "string", "description": "参数" }
},
"required": ["param"]
}
}