MCP消息协议和传输协议(Java角度)

发布于:2025-07-23 ⋅ 阅读:(14) ⋅ 点赞:(0)

作为Java程序员,你可以将 MCP的消息协议传输协议 的关系类比为 HTTP协议中“应用层”和“传输层”的分工。以下是具体解析:


MCP 定义了三种主流传输方式,适应不同场景需求:

传输类型 原理 适用场景 优缺点
Stdio(标准输入/输出) 通过本地进程的 stdin/stdout 通信 本地命令行工具、敏感数据处理(如隐私计算) 优点:简单、低延迟;缺点:仅限本地,不支持远程或高并发。
SSE(Server-Sent Events) 基于 HTTP 的单向推送(服务器→客户端) 实时数据推送(如股票行情、新闻更新) 优点:浏览器兼容性好;缺点:单向通信,服务器压力大。
Streamable HTTP 基于 HTTP 的双向流式传输,支持边传边处理 分布式系统、高并发场景(如云服务、实时交互应用) 优点:灵活高效,支持远程;缺点:网络稳定性要求高。

演进趋势

  • 早期:SSE + HTTP POST 组合实现逻辑双向通信(如客户端通过 POST 发送请求,SSE 接收响应)。
  • 当前:Streamable HTTP 成为主流,支持双向流式交互,更适合复杂任务(如多轮对话、大文件传输)。

1. 核心区别(一句话总结)

协议类型 作用 Java生态类比
消息协议 定义数据格式(API调用长什么样) 类似HTTP的请求/响应结构(如REST API的JSON格式)
传输协议 定义数据如何传输(怎么发/收) 类似TCP/IP或HTTP/2的底层字节流传输机制

2. 消息协议(Message Protocol)

是什么?
  • 功能:规定 工具调用请求和响应数据结构,即模型与工具之间“对话的语法”。
  • 核心内容
    • 工具调用的JSON字段(如tool_callparameters)。
    • 错误码、元数据描述(类似OpenAPI的Schema)。
  • 示例(高德地图天气查询):
    // 请求
    {
      "tool_call": {
        "name": "maps_weather",
        "parameters": {"city": "北京"}
      }
    }
    // 响应
    {
      "result": {"temp": 25, "weather": "晴"},
      "metadata": {"timestamp": "2025-07-23T10:00:00Z"}
    }
    
Java类比
  • 类似你定义的 DTO类(如WeatherRequest/WeatherResponse),用于序列化为JSON:
    public class WeatherRequest {
        private String city;
        // getter/setter...
    }
    

3. 传输协议(Transport Protocol)

是什么?
  • 功能:规定消息 如何从A点传到B点(如TCP连接、数据分块、加密等)。
  • MCP的实现
    • 默认传输:基于HTTP/1.1或HTTP/2(类似Spring Boot的RestTemplate调用)。
    • 高性能场景:可选gRPC(基于HTTP/2)或WebSocket(长连接)。
  • 关键点
    • 不关心消息内容(无论是天气查询还是SQL执行),只负责可靠传输字节流。
    • 处理连接池、超时、重试等网络问题(类似OkHttp的Interceptor链)。
Java类比
  • 类似 网络库的选择
    • HttpURLConnection还是Netty发HTTP请求。
    • 是否启用SSL/TLS加密(传输层安全)。

4. 两者协作流程(以Java代码为例)

// === 消息协议层(定义数据格式) ===
record McpRequest(String toolName, Map<String, Object> params) {}
record McpResponse(Object result, Map<String, Object> metadata) {}

// === 传输协议层(发送/接收数据) ===
public class McpClient {
    private final HttpClient httpClient; // 传输协议实现(HTTP/2)

    McpResponse callTool(McpRequest request) {
        // 1. 消息协议:Java对象 → JSON
        String jsonBody = new Gson().toJson(request); 

        // 2. 传输协议:发送HTTP请求(处理连接、超时、编码等)
        HttpRequest httpRequest = HttpRequest.newBuilder()
                .uri(URI.create("https://mcp-server/api"))
                .header("Content-Type", "application/json")
                .POST(HttpRequest.BodyPublishers.ofString(jsonBody))
                .build();
        
        HttpResponse<String> response = httpClient.send(httpRequest, 
            HttpResponse.BodyHandlers.ofString());

        // 3. 消息协议:JSON → Java对象
        return new Gson().fromJson(response.body(), McpResponse.class);
    }
}

5. 为什么需要分离?

维度 消息协议 传输协议
变更影响 修改字段需更新模型和工具 升级HTTP/2无需改业务代码
优化方向 增强语义描述(如新增错误码) 提升吞吐量(如改用gRPC)
开发者关注点 业务逻辑(工具参数是否完整) 运维逻辑(连接是否稳定)

6. 实际场景对比

场景:调用高德地图API
  1. 消息协议

    • 定义maps_navigation工具的请求需包含origindestination字段。
    • 约定错误响应格式:{"error": {"code": 404, "message": "地址不存在"}}
  2. 传输协议

    • 选择HTTP/2传输(多路复用降低延迟)。
    • 配置TLS加密和OAuth2鉴权头。

总结

  • 消息协议 ≈ DTO + 接口文档:规定“说什么”(业务语义)。
  • 传输协议 ≈ HttpClient + 网络配置:规定“怎么传”(技术实现)。
  • 对Java程序员的意义
    • 像设计REST API一样设计MCP消息协议(关注Schema)。
    • 像优化微服务调用一样选择传输协议(关注性能/安全)。
  • 一句话:MCP通过分层设计,让开发者能像写Spring Boot应用一样开发AI工具集成。

网站公告

今日签到

点亮在社区的每一天
去签到