MCP(Model Context Protocol)作为AI与外部系统互联的标准化协议,其核心价值在于提供统一的通信规范,解决多模型、多工具的集成困境。不同于理论层面的解读,本文将从开发者视角出发,聚焦MCP协议核心细节、依赖协议关联、完整实现流程,重点拆解必实现接口的技术要点与代码实操,全程围绕“可落地、可复用”展开,助力开发者快速完成MCP Server/Client的开发与调试。

本文适用于有一定编程基础(Python/Go优先)、需对接MCP协议的开发者,内容涵盖协议规范、依赖协议解析、端到端实现流程,以及必实现接口的代码示例与异常处理,避开理论冗余,直击技术核心。

一、MCP协议核心细节(开发者必知)

MCP协议本质是一套基于C/S架构的标准化通信协议,核心定位是“AI(通过MCP Client)与外部工具(通过MCP Server)的即插即用交互”,其协议规范围绕“消息格式、通信规则、能力声明”三大核心展开,也是后续开发的基础前提,无需冗余理论,仅提炼开发必备细节。

1. 协议核心定位与通信架构

MCP采用标准C/S架构,核心角色分为3类,开发者重点关注MCP Server的实现(MCP Client已由Claude、Cursor等主流AI客户端内置,无需重复开发):

  • MCP Host:用户交互入口(如Claude Desktop、Cursor),负责权限管控与会话调度;

  • MCP Client:协议处理层(客户端内置),负责与Server通信、消息路由、格式校验;

  • MCP Server:能力提供层(开发者需实现),封装自定义工具/资源,响应Client的请求。

核心通信规则:Client与Server通过“请求-响应”模式交互,所有消息严格遵循JSON-RPC 2.0格式,传输方式重点采用HTTP+SSE(生产级远程部署首选),禁止使用非标准传输方式(避免协议解析失败)。其中Streamable HTTP是HTTP+SSE的升级版本,本文重点讲解HTTP+SSE的实现与应用。

2. 协议消息格式(必守规范)

MCP协议所有交互消息均为JSON格式,分为“请求消息”“响应消息”“通知消息”三类,开发者需严格遵循格式规范,否则会导致Client解析失败,以下是开发中高频使用的消息格式(简化冗余字段,仅保留必传项)。

(1)请求消息(Client → Server)

{
  "jsonrpc": "2.0",  // 固定值,JSON-RPC版本
  "id": "req-123456", // 请求唯一标识,响应需对应此ID
  "method": "tools/call", // 调用的MCP接口方法名
  "params": {          // 接口参数,根据method不同有所差异
    "name": "add",     // 工具名(tools/call方法必传)
    "arguments": {"a": 10, "b": 20} // 工具参数
  }
}
    
(2)响应消息(Server → Client)

分为“成功响应”与“失败响应”,需严格对应请求ID,失败响应需携带标准化错误码:


// 成功响应
{
  "jsonrpc": "2.0",
  "id": "req-123456", // 与请求ID一致
  "result": {
    "content": "计算结果:30", // 自然语言描述(LLM友好)
    "structuredContent": 30   // 结构化数据(Client机器解析)
  }
}

// 失败响应(标准化错误码)
{
  "jsonrpc": "2.0",
  "id": "req-123456",
  "error": {
    "code": -32601, // 错误码,MCP标准定义(下文详解)
    "message": "Tool 'add' not found", // 错误描述
    "data": "工具名错误,当前支持的工具:add、get_time" // 错误详情(可选,便于调试)
  }
}
    
(3)MCP标准错误码(开发必记)

错误码直接决定Client的异常处理逻辑,需严格遵循MCP规范,核心常用错误码如下(无需记忆全部,重点掌握高频项):

  • -32600:无效请求(消息格式不符合JSON-RPC 2.0规范);

  • -32601:方法未找到(调用的method不存在,如错误调用“tool/call”);

  • -32602:参数错误(参数缺失、类型不匹配);

  • -32603:内部错误(Server端代码异常);

  • -32001:权限不足(调用未授权的工具/资源);

  • -32002:资源不存在(请求的资源未找到)。

二、MCP依赖协议解析(底层支撑,必懂关联)

MCP协议并非独立存在,其底层依赖核心协议实现通信与消息解析,其中JSON-RPC 2.0是核心依赖,传输层重点依赖HTTP+SSE(本文核心讲解),无需额外引入其他协议,以下拆解依赖协议的关联逻辑与开发注意事项,同时明确Streamable HTTP与HTTP+SSE的关系。

1. 核心依赖:JSON-RPC 2.0(必懂)

MCP协议完全基于JSON-RPC 2.0构建,并非简单复用,而是针对AI交互场景进行了针对性扩展,核心关联点如下(开发中需重点关注扩展部分):

  • 复用部分:JSON-RPC 2.0的“jsonrpc字段、id字段、method字段、params字段”,确保跨语言、跨平台兼容性;

  • MCP扩展部分:

    • 响应消息必须包含“content”(自然语言描述)与“structuredContent”(结构化数据),兼顾LLM理解与Client机器解析;

    • 强化通知机制,支持Server向Client异步推送消息(如工具调用进度、资源更新),无需Client主动请求;

    • 新增MCP专属错误码(-32000~-32099),补充JSON-RPC 2.0错误码的不足,适配AI交互场景。

开发注意:无需单独实现JSON-RPC 2.0解析逻辑,可复用成熟库(Python:jsonrpcserver,Go:go-jsonrpc),重点关注MCP的扩展要求,避免解析失败。

2. 传输层核心依赖:HTTP+SSE(本文重点讲解)

MCP协议的远程通信核心依赖HTTP+SSE(Server-Sent Events,服务器推送事件),这也是本文重点讲解的传输方式,适用于生产级远程部署场景,核心依赖细节与关联逻辑如下,同时明确Streamable HTTP与HTTP+SSE的区别与联系。

MCP协议的“传输无关性”,本质是依赖不同的传输协议实现不同场景的通信,开发者需根据部署场景选择对应的传输方式,核心依赖细节如下:

(1)HTTP+SSE核心细节(本文重点)

HTTP+SSE是MCP协议远程通信的基础方式,利用HTTP请求与服务器推送事件(SSE)实现客户端与服务端的消息交互,是早期MCP版本的主流远程传输方式,也是本文重点讲解的内容,核心细节如下:

  • 通信逻辑:采用“双端点”通信模式,客户端通过POST /mcp向服务端发送JSON-RPC请求,服务端通过GET /mcp以SSE(text/event-stream)格式向客户端推送响应或异步通知,实现双向通信;

  • 核心优势:基于标准HTTP协议,无需额外开发传输层逻辑,兼容性强,可直接适配现有Web基础设施,开发成本低,适合中小型远程部署场景;

  • 开发注意:需确保客户端支持text/event-stream格式,服务端推送的SSE消息需符合规范(包含event、data等字段),同时处理HTTP连接的心跳检测与断线重连,避免通信中断。

(2)Streamable HTTP与HTTP+SSE的关系

Streamable HTTP并非HTTP+SSE,而是MCP 2025年版本推出的、基于HTTP+SSE升级后的传输方式,二者的核心关系与区别如下:

  • 关联:Streamable HTTP继承了HTTP+SSE的实时消息推送能力,底层仍基于HTTP协议,兼容HTTP+SSE的核心通信逻辑,可理解为“HTTP+SSE的增强版”;

  • 区别:Streamable HTTP采用“单一HTTP端点”实现双向流通信,无需双端点区分请求与推送,同时优化了连接稳定性和数据传输弹性,支持大型响应的流式传输和内置会话管理,更适合高性能、高并发的企业级场景;

  • 本文说明:因本文重点讲解HTTP+SSE,后续实现流程、代码示例均围绕HTTP+SSE展开,Streamable HTTP仅作关联说明,不深入探讨其实现细节。

依赖HTTP协议实现远程双向通信,是MCP 2025年后的推荐传输方式,核心细节:

  • 通信逻辑:通过单一HTTP端点(如/mcp)实现双向流通信,Client与Server通过同一连接完成请求发送与消息推送,减少连接冗余;

  • 依赖扩展:原生支持OAuth2.0、API Key认证,无需额外开发认证逻辑,适配企业级权限管控需求;

  • 开发注意:需处理HTTP连接的心跳检测与断线重连,避免远程通信中断。

3. 其他依赖(可选,按需引入)

根据开发场景可额外引入依赖,非必选:

  • 加密依赖:Kyber-1024抗量子加密算法(敏感场景,如金融、医疗),用于消息传输与存储加密;

  • 校验依赖:JSON Schema(用于工具参数校验,确保输入参数符合规范);

  • 日志依赖:loguru(Python)、zap(Go),用于日志收集(需输出到stderr,避免污染stdout)。

三、MCP客户端与服务端通信流程图

以下是MCP官方标准的通信流程(基于HTTP+SSE传输方式),清晰展示客户端与服务端的交互步骤,结合后续代码实现可快速理解整体逻辑,全程适配HTTP+SSE的双端点通信模式:


客户端                                 服务端
  │                                      │
  │         1. 建立HTTP连接(HTTP+SSE)    │
  │─────────────────────────────────────>│
  │                                      │
  │         2. 客户端发送initialize请求    │
  │─────────────── POST /mcp ───────────>│
  │                                      │
  │         3. 服务端返回initialize响应    │
  │<────────────── GET /mcp(SSE)────────│
  │                                      │
  │   4. 客户端发送notifications/initialized通知
  │─────────────── POST /mcp ───────────>│
  │                                      │
  │         5. 客户端发送tools/list请求    │
  │─────────────── POST /mcp ───────────>│
  │                                      │
  │         6. 服务端返回tools/list响应    │
  │<────────────── GET /mcp(SSE)────────│
  │                                      │
  │         7. 客户端发送tools/call请求    │
  │─────────────── POST /mcp ───────────>│
  │                                      │
  │         8. 服务端执行工具并返回响应    │
  │<────────────── GET /mcp(SSE)────────│
  │                                      │
  │            9. 客户端发送shutdown请求   │
  │─────────────── POST /mcp ───────────>│
  │                                      │
  │            10. 双方关闭HTTP连接        │
  │<─────────────────────────────────────│
          

流程说明:核心分为“连接建立→初始化握手→能力发现→工具调用→会话关闭”5个阶段,所有步骤必须按顺序执行,否则会导致通信失败。

四、MCP完整实现流程(以Python为例,端到端可落地)

MCP开发的核心是实现MCP Server(Client无需开发,主流AI客户端已内置),以下以Python为例,基于HTTP+SSE传输方式,实现一个完整的MCP Server,涵盖“环境准备、代码实现、调试验证”全流程,贴合实际开发场景,可直接复用(本文重点讲解HTTP+SSE,不涉及STDIO相关实现)。

1. 环境准备(必做)

核心依赖库(无需复杂环境,Python 3.8+即可):


# 安装核心依赖(JSON-RPC解析+HTTP+SSE支持)
pip install jsonrpcserver flask  # flask用于实现HTTP+SSE服务
# 安装可选依赖(参数校验)
pip install jsonschema
          

2. 实现流程(5步完成,必按顺序)

步骤1:定义工具与参数校验规则

MCP Server的核心是提供工具能力,需先定义工具函数、工具描述与参数校验规则(符合MCP规范),示例实现3个常用工具(add、get_time、echo):


import time
from jsonschema import validate

# 1. 定义工具函数(实际业务逻辑)
def add(a: int, b: int) -> int:
    """两数相加工具"""
    return a + b

def get_time() -> str:
    """获取当前系统格式化时间工具(无参数)"""
    return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())

def echo(text: str) -> str:
    """回声工具(原样返回输入文本)"""
    return text

# 2. 定义工具描述(MCP规范要求,Client通过tools/list接口获取)
def get_tool_definitions():
    """返回工具列表描述,符合MCP规范"""
    return [
        {
            "name": "add",
            "description": "两数相加,返回计算结果",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "a": {"type": "integer", "description": "第一个加数"},
                    "b": {"type": "integer", "description": "第二个加数"}
                },
                "required": ["a", "b"]  # 必传参数
            }
        },
        {
            "name": "get_time",
            "description": "获取当前系统的格式化时间,无输入参数",
            "inputSchema": {
                "type": "object",
                "properties": {},
                "required": []
            }
        },
        {
            "name": "echo",
            "description": "原样返回输入的文本,用于测试MCP通信是否正常",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "text": {"type": "string", "description": "需要返回的文本"}
                },
                "required": ["text"]
            }
        }
    ]

# 3. 定义参数校验函数(可选,提升鲁棒性)
def validate_tool_params(tool_name, params):
    """校验工具参数是否符合inputSchema规范"""
    tools = get_tool_definitions()
    for tool in tools:
        if tool["name"] == tool_name:
            validate(instance=params, schema=tool["inputSchema"])
            return True
    raise ValueError(f"Tool '{tool_name}' not found")
    
步骤2:实现MCP必选接口(核心,缺一不可)

MCP Server必须实现3个核心接口(MCP规范强制要求),否则无法与Client建立连接,分别是:initialize(初始化握手)、tools/list(返回工具列表)、tools/call(执行工具调用),以下是完整实现:


from jsonrpcserver import method, run, Result, Error

# 必选接口1:initialize(初始化握手,Client启动后首先调用)
@method
def initialize() -> Result:
    """
    MCP初始化接口,返回协议版本、支持能力与服务信息
    规范要求:必须返回protocolVersion、capabilities、serverInfo
    """
    return Result({
        "protocolVersion": "2025-06-18",  # MCP协议固定版本号
        "capabilities": {"tools": {
Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐