跳到主要内容

核心概念

三个核心原语: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-26Streamable HTTP 取代 HTTP+SSE;OAuth 2.1
2025-06-18新增 elicitation、结构化工具输出
2025-11-25消息字段 / 分页等修订
2026-07-28发布以来最大改动(截至本文):无状态协议核心、server/discoversubscriptions/listen、缓存接口、扩展框架(Tasks / MCP Apps)等

写 MCP 的注意:协议变化快,以官方 spec 对应日期的文档为准;SDK 会跟进标记废弃项(roots / sampling 等在 2026-07-28 起标为 deprecated)。入门阶段用最新的 TypeScript / Python SDK 即可,SDK 会帮你处理大部分协议细节。