Skip to content

MCP

概览

  • 与host, llm端的交互

1753238260544

通讯协议

https://modelcontextprotocol.io/introduction

https://www.cnblogs.com/lori/p/18879637

  • MCP传输层将MCP协议消息转换为JSON-RPC格式进行传输, 并将接收到的JSON-RPC消息转为MCP协议消息

1752648439105

stdio

  • 本地进程工具使用stdio的通信方式

http+sse

  • 流程:
    • 客户端通过配置的mcp-server的url, 向服务端发起get请求, 建立连接(服务端默认端点为/sse)
    • 服务端返回向客户端推送消息的端点url, 如/messages, 后续服务端将通过这个端点向客户端推送sse消息
    • 客户端发送post请求, 将问题通过/messages端点, 发给服务端, 服务端返回响应

1752648961579

  • 这种模式存在问题:
    • 不支持断线重连/恢复 当 SSE 连接断开时,所有会话状态丢失,客户端必须重新建立连接并初始化整个会话。例如,正在执行的大型文档分析任务会因 WiFi 不稳定而完全中断,迫使用户重新开始整个过程。
    • 服务器需维护长连接 服务器必须为每个客户端维护一个长时间的 SSE 连接,大量并发用户会导致资源消耗剧增。当服务器需要重启或扩容时,所有连接都会中断,影响用户体验和系统可靠性。
    • 服务器消息只能通过 SSE 传递 即使是简单的请求-响应交互,服务器也必须通过 SSE 通道返回信息,造成不必要的复杂性和开销。对于某些环境(如云函数)不适合长时间保持 SSE 连接。
    • 基础设施兼容性限制 许多现有的 Web 基础设施如 CDN、负载均衡器、API 网关等可能不能正确处理长时间的 SSE 连接,企业防火墙可能会强制关闭超时连接,导致服务不可靠。

Streamable HTTP

https://zhuanlan.zhihu.com/p/1898065587650946984

  1. 统一 Endoint:移除专门的 /sse 端点,所有通信通过单一端点(当前官方 sdk 实现为 /mcp)进行
  2. 按需流式传输:服务器可灵活选择是返回普通 HTTP 响应还是升级为 SSE 流
  3. 会话标识:引入会话 ID 机制,支持状态管理和恢复
  4. 灵活初始化:客户端可通过空 GET 请求主动初始化 SSE 流

MCP-Inspector

https://mcp-docs.cn/docs/tools/inspector

  • 运行调试
npx @modelcontextprotocol/inspector

1753238154038

java-sdk

client端与server端的交互流程

  • HTTP+SSE 模式:

1753238507038

源码解析

  • WebFluxSseServerTransportProvider
    • SSE 端点配置与路由注册: SSE 端点配置与路由注册
    • HTTP 与 SSE 协议转换: 将传统的 HTTP 请求转换为 SSE 流式传输协议,处理 SSE 的 data:、event: 等协议头,确保消息的流式传输符合 SSE 规范
    • 连接生命周期管理: 管理客户端连接的建立、心跳维护和优雅关闭,支持高并发下的连接状态跟踪
  • McpServerSession
    • 会话状态维护: 管理单个客户端连接的会话状态,包括协议版本协商、能力交换(如工具支持)、消息序列化/反序列化(JSON-RPC)
  • McpAsyncServer
    • 异步服务编排:作为异步服务器的核心入口,协调工具调用、资源访问和提示模板的异步执行流程,支持响应式编程模型
    • 工具与资源的动态加载: 根据配置动态加载工具(如 @Tool 注解的方法)和资源(如文件系统或数据库访问),支持热更新和版本控制
    • 并发与性能优化: 通过 WebFlux 的非阻塞特性处理高并发请求,利用线程池隔离 I/O 密集型任务(如网络 I/O)和 CPU 密集型任务(如工具计算)

1753238979153

AI网关mcp-server-proxy

  • 核心功能是将微服务转为mcp-server, 微服务的api转为tool

1753248885207

补充

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"]
  }
}