MCP Java SDK 源码深度拆解
作者:程序员马丁
Ragent AI —— 从 0 到 1 纯手工打造企业级 Agentic RAG,拒绝 Demo 玩具!AI 时代,助你拿个offer。
前面几篇 MCP 文章,你用 Spring AI 的 @McpTool 注解定义工具,用 @McpResource 暴露资源,用 @McpPrompt 注册提示词模板,60 行代码就能把一个 MCP Server 跑起来,Claude Desktop 和 Cursor 都能直接调。
但你有没有想过这么一个问题:当你在方法上标了 @McpTool,框架到底做了什么?
它是怎 么从你的方法签名里提取出参数名、参数类型、参数描述,然后生成一份完整的 JSON Schema 的?Client 发过来的 JSON-RPC 请求是怎么路由到你的方法的?工具列表是怎么动态返回给 Client 的?
如果你只是用 Spring AI 搭 MCP Server,不搞清楚这些也没关系,框架帮你兜底了。但如果你遇到了这些场景:
- 你的项目不用 Spring Boot(比如纯 Java 应用、或者 Android 端要嵌入一个 MCP Client)
- 你想自定义 Transport 实现(比如走 WebSocket 而不是 SSE)
- 你想理解 Spring AI 为什么能自动发现你的工具,出了 bug 好排查
- 你想参与 MCP 生态建设,给社区贡献一个 MCP Server
这些都绕不开 MCP 的官方 Java SDK。这篇文章就来拆开看看,Spring AI 底下那一层到底长什么样。
modelcontextprotocol:MCP 的官方大本营
1. 这个 GitHub 组织是什么
在 GitHub 搜索 MCP,前排结果基本都来自 modelcontextprotocol 组织——这是 Anthropic 主导成立的开放组织,专门维护 MCP 协议规范和各语言 SDK。
MCP 从设计之初就定位为开放标准:协议规范公开、SDK 全部 MIT 许可证、任何人都可以提 PR 贡献代码。这与 OpenAI 的 Function Call 形成对比——后者是 API 的一部分,由 OpenAI 单方面定义。MCP 的目标是成为大模型工具调用领域的通用协议。
2. 官方仓库全景
这个组织下有几个核心仓库,各自分工明确:
| 仓库 | 定位 | 说明 |
|---|---|---|
modelcontextprotocol | 协议规范 | MCP 协议的完整定义,所有接口、消息格式、行为约束都在这里。所有 SDK 都以这份规范为基准来实现 |
java-sdk | Java SDK | 这篇的主角,官方 Java 实现 |
typescript-sdk | TypeScript SDK | 最早的 SDK 实现,也是参考实现(Reference Implementation)。TypeScript 版是第一个跑通协议全流程的 |
python-sdk | Python SDK | 在 AI / ML 生态中使用最广的版本 |
servers | 社区 MCP Server 集合 | 各种现成的 MCP Server:文件系统、GitHub、数据库、Web 搜索等 |
三个 SDK 面向不同的生态:TypeScript SDK 最早最全,是其他 SDK 的参照标准;Python SDK 在 AI 和数据科学领域用得最多;Java SDK 面向企业级应用,和 Spring AI 深度集成。
不同语言的 SDK 很多,这里仅列举三个语言举例。
Java SDK 当前稳定版本是 1.1.0,由 Anthropic 团队维护。
Java SDK 全景:6 个模块各司其职
1. 模块总览
打开 Java SDK 的仓库,你会看到它不是一个单体模块项目,而是拆成了 6 个 Maven 模块:
| 模块 | Maven ArtifactId | 作用 |
|---|---|---|
mcp-bom | mcp-bom | BOM(Bill of Materials),统一管理所有模块的版本号,引入后不用逐个指定版本 |
mcp-core | mcp-core | 核心实现,Client、Server、Transport、Schema 全部核心代码都在这里 |
mcp-json-jackson2 | mcp-json-jackson2 | Jackson 2.x 的 JSON 序列化实现 |
mcp-json-jackson3 | mcp-json-jackson3 | Jackson 3.x 的 JSON 序列化实现 |
mcp | mcp | 便捷包,等于 mcp-core + mcp-json-jackson3,引入这一个就够了 |
mcp-test | mcp-test | 测试工具和集成测试 |
大多数场景下,你只需要在 pom.xml 里引入一个依赖:
<dependency>
<groupId>io.modelcontextprotocol.sdk</groupId>
<artifactId>mcp</artifactId>
<version>1.1.0</version>
</dependency>
这个 mcp 便捷包已经帮你打包了 mcp-core(核心实现)和 mcp-json-jackson3(JSON 序列化),拿来就能用。
2. 为什么 JSON 序列化要单独拆模块
你可能会好奇:JSON 序列化为什么不直接写在 mcp-core 里,还要单独拆两个模块出来?
原因是 Jackson 的版本冲突问题。Java 生态里 Jackson 几乎是 JSON 处理的事实标准,但 Jackson 存在大版本分裂:
- Jackson 2.x:Spring Boot 2.x 时代的标配,目前仍有大量项目在用
- Jackson 3.x:2025 年发布的新大版本,包名从
com.fasterxml.jackson改成了tools.jackson,不向后兼容
MCP SDK 把 JSON 序列化抽象成了 McpJsonMapper 接口,具体实现可以是 Jackson 2 或 Jackson 3。这样一来:
- 你的项目如果用 Jackson 2,就引入
mcp-core+mcp-json-jackson2,不会和现有依赖冲突 - 你的项目如果用 Jackson 3(或者新项目没有历史包袱),直接引入
mcp便捷包,默认走 Jackson 3
这个设计在 Java 生态里很常见,Spring 框架对很多第三方库也是这么处理的——核心模块定义接口,具体实现按版本拆开。
3. Spring AI 集成模块去哪了
如果你翻过 Java SDK 早期版本(0.18.1 及之前) ,会发现仓库里还有两个模块:mcp-spring-webflux 和 mcp-spring-webmvc。但现在不见了。
从 1.0.0 版本开始,这两个 Spring 集成模块迁移到了 Spring AI 2.0 中。Maven 坐标也变了:
| 迁移前(SDK 仓库) | 迁移后(Spring AI) |
|---|---|
io.modelcontextprotocol.sdk:mcp-spring-webflux | org.springframework.ai:mcp-spring-webflux |
io.modelcontextprotocol.sdk:mcp-spring-webmvc | org.springframework.ai:mcp-spring-webmvc |
这也是为什么你用 Spring AI MCP Server 时,引入的是 org.springframework.ai 的依赖,而不是 io.modelcontextprotocol.sdk。
这个拆分的逻辑很清楚:SDK 本身保持轻量,只负责 MCP 协议的纯 Java 实现,不绑定任何框架;Spring 集成由 Spring AI 团队维护,和 Spring Boot 的自动配置、生命周期管理深度绑定。各管各的,互不耦合。
SDK 核心架构:四层分明
了解完模块划分,接下来看 SDK 内部的代码结构。整个 mcp-core 模块的代码分成四层,从下往上依次是:

每一层的职责很清晰,从下往上看:Schema 层定义协议里有哪些消息类型,Transport 层负责把消息送达,Session 层管理一次完整的连接会话,Client/Server 层是开发者直接打交道的 API。
1. Schema 层:协议的字典
McpSchema 是整个 SDK 里最大的一个类——2786 行代码,全是数据结构定义。它就像一本字典,规定了 Client 和 Server 之间能说哪些话、每句话的格式是什么。

之前讲 MCP 协议规范 JSON-RPC 2.0 那篇文章里,大家已经知道 MCP 底层用 JSON-RPC 2.0 通信。McpSchema 做的事情就是把协议规范里定义的所有消息类型,都变成了 Java 的 Record 类(Java 16+ 的不可变数据类)。
挑几个你最常接触的类型:
| 类型 | 对应的协议操作 | 说明 |
|---|---|---|
McpSchema.Tool | 工具定义 | 包含工具名称、描述、参数的 JSON Schema |
McpSchema.CallToolRequest | tools/call 请求 | Client 调用工具时发的请求,包含工具名和参数 |
McpSchema.CallToolResult | tools/call 响应 | Server 执行工具后返回的结果 |
McpSchema.Resource | 资源定义 | 包含资源 URI、名称、描述、MIME 类型 |
McpSchema.Prompt | Prompt 模板定义 | 包含模板名称、描述、参数列表 |
McpSchema.InitializeRequest | initialize 请求 | 连接建立时的握手请求 |
McpSchema.InitializeResult | initialize 响应 | 握手响应,包含 Server 的能力声明 |
这些类型最终会被包装成 JSON-RPC 的 Request / Response 在 Client 和 Server 之间传输。比如 Client 调用工具时,实际发出的 JSON-RPC 消息长这样:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "getUserAnnualLeave",
"arguments": { "employeeId": "E001" }
}
}
其中 params 部分就是 McpSchema.CallToolRequest 对象序列化后的结果。