核心概念
三个核心原语:Tools / Resources / Prompts
MCP Server 对外暴露能力,只有三种标准原语:
| 原语 | 是什么 | 类比 | 例子 |
|---|---|---|---|
| Tools(工具) | 可执行、有副作用的函数,输入用 JSON Schema 校验 | "能做的事" | 执行 SQL、提交代码、发邮件 |
| Resources(资源) | 只读的数据,用 URI 定位 | "能读的东西"(AI 的虚拟文件系统) | 配置文件、数据库查询结果、文档内容 |
| Prompts(提示词) | 预定义的模板 / 工作流起点 | "能套的模板" | review-pr、生成周报 等指令模板 |
一句话记:Tools 是"动手",Resources 是"读数据",Prompts 是"给指令模板"。
// 三种原语的形状(TypeScript SDK 里都是这样声明的)
server.tool('query_db', { sql: { type: 'string' } }, async ({ sql }) => ({ ... })); // Tool
server.resource('config://app', async () => ({ contents: [...] })); // Resource
server.prompt('review_pr', async ({ pr }) => ({ messages: [...] })); // Prompt
两种标准传输:stdio 与 Streamable HTTP
MCP 传输(transport)只负责"消息怎么传",协议语义在任何传输上是一致的:
| 传输 | 适用 | 特点 |
|---|---|---|
| stdio | 本地 | Client 启动 Server 子进程,通过标准输入输出传 JSON-RPC 消息;stdout 只能写 MCP 消息(日志走 stderr);无鉴权、无会话、无法水平扩展 |
| Streamable HTTP | 远程 | 每个消息是发到单一 MCP 端点的 HTTP POST(如 https://example.com/mcp);回复是 JSON 对象或按请求范围的 SSE 流;远程场景需鉴权(OAuth) |
还有"自定义传输"(如 Unix socket / TCP),但要保持 JSON-RPC 帧格式不变。老的 HTTP+SSE 双端点传输已被废弃。
选型:本地开发、给本机 AI 应用用 → stdio;部署成团队/公网服务 → Streamable HTTP。
消息模型:JSON-RPC
所有消息都是 JSON-RPC 风格:
Client ──request──▶ Server
Client ◀─response── Server
Client ──notification──▶ Server (单向通知,无响应)
请求按类型分:请求(request)、通知(notification)、结果(result)。initialize 握手、能力协商等细节随协议版本演进。
生命周期与能力发现
- Client 连接 Server 后会发现能力:Server 暴露了哪些 Tools / Resources / Prompts、支持哪些协议版本;
- 所以 Client 不需要预先写死"这个服务器能干嘛"——连上问一下就知道,这是 MCP 复用性的关键;
- 工具/资源/提示词列表变化时,Server 可以通知 Client 更新。
版本:协议是"按日期版本化"的
MCP 规范按发布日期版本化,且持续演进:
| 版本 | 里程碑 |
|---|---|
| 2024-11-05 | 首发 |
| 2025-03-26 | Streamable HTTP 取代 HTTP+SSE;OAuth 2.1 |
| 2025-06-18 | 新增 elicitation、结构化工具输出 |
| 2025-11-25 | 消息字段 / 分页等修订 |
| 2026-07-28 | 发布以来最大改动(截至本文):无状态协议核心、server/discover、subscriptions/listen、缓存接口、扩展框架(Tasks / MCP Apps)等 |
写 MCP 的注意:协议变化快,以官方 spec 对应日期的文档为准;SDK 会跟进标记废弃项(roots / sampling 等在 2026-07-28 起标为 deprecated)。入门阶段用最新的 TypeScript / Python SDK 即可,SDK 会帮你处理大部分协议细节。