跳到正文
FunCoding
返回博客
MCP

MCP 是怎么设计的

MCP 把智能体接外部系统这件事统一成一个协议。本文从它借鉴的 LSP 讲起,介绍三种原语分别交给谁决定、2026 年 7 月新版规范为什么改成无状态,以及工具太多、提示注入这些实际问题怎么应对,最后给出在 Claude Code、Codex、Cursor 里添加 MCP Server 的方法。

阅读约需 9 分钟

#MCP#概念

本页目录

智能体能读写代码、跑命令,可它看不到你的工单系统、数据库和设计稿。于是常常要在两个窗口之间来回复制,把报错从监控面板贴进对话,把需求从工单里贴进对话。

Model Context Protocol,简称 MCP,管的就是这件事,把外部系统包装成智能体能直接调用的工具。Anthropic 在 2024 年 11 月把它开源。一年后的 2025 年 12 月,Linux 基金会成立 Agentic AI Foundation,MCP 是首批三个项目之一,另外两个是 Block 的 goose 和 OpenAI 的 AGENTS.md。从那以后它归一个中立的基金会管理。

从 M 乘 N 到 M 加 N

没有统一协议的时候,每个 AI 应用都要给每个外部系统单独写集成。

             GitHub  Slack  Postgres  Sentry  Notion
Claude Code    ✎      ✎       ✎        ✎       ✎
Cursor         ✎      ✎       ✎        ✎       ✎
Codex          ✎      ✎       ✎        ✎       ✎
你的应用        ✎      ✎       ✎        ✎       ✎

M 个应用、N 个系统,要写 M 乘 N 份集成,每份的接口格式、认证方式、错误处理都不一样。中间加一层统一协议以后,每个应用实现一次客户端,每个系统实现一次服务器,工作量变成 M 加 N。

MCP 的规范里写明了它借鉴的是 Language Server Protocol。LSP 解决的是同一类问题,在它之前,每个编辑器都要为每种语言单独实现补全、跳转和诊断;有了它,每种语言只要做一个 Language Server,所有支持 LSP 的编辑器都能用。今天 VS Code、Neovim、Zed 能支持那么多语言,靠的就是它。

三个角色

规范里有三个角色,入门时常被说成两个,分清楚对理解很有帮助。

角色是什么举例
Host用户直接使用的 AI 应用,由它发起连接Claude Code、Cursor、Claude 桌面端
ClientHost 里面的连接器,一个 Client 对应一个 ServerClaude Code 里连 GitHub Server 的那个组件
Server提供上下文和能力的服务GitHub MCP Server、Postgres MCP Server

一个 Host 可以同时连好几个 Server,每条连接由一个单独的 Client 负责。这样分的好处是隔离,Server 之间互相看不见,一个 Server 拿不到另一个 Server 的数据,也看不到完整的对话。把什么信息交给哪个 Server、哪些工具调用要用户确认,都由 Host 决定。

三种原语,各由谁决定

Server 能提供三种东西,区别在于由谁决定什么时候用。

工具由模型决定。它们是可以调用的函数,查询数据库、创建 issue、发消息,每个工具有名称、描述和参数的 JSON Schema。模型看当前任务,自己决定调哪个、传什么。大多数人说 MCP 时指的其实就是工具。

资源由应用或用户决定。它们是可以读取的数据,文件内容、表结构、API 文档,每个资源有一个 URI。在 Claude Code 里输入 @,补全菜单里会列出已连接 Server 提供的资源,选中后作为附件加进对话。

提示词模板由用户决定。它们是事先写好的消息或工作流,由用户主动选用。Claude Code 会把 MCP Server 提供的提示词变成斜杠命令,输入 / 就能看到。

这样划分,是因为有些信息该由用户决定给不给模型看,有些流程该由用户决定要不要启动,只有工具交给模型自己用。

工具可以带注解,标明是否只读、是否有破坏性之类,Host 可以据此决定要不要先问用户。规范的安全一节专门提醒,除非 Server 本身可信,这些注解都不能信。恶意的 Server 完全可以把一个删除操作标成只读。

协议本身

消息格式是 JSON-RPC 2.0。一次工具调用的请求和响应大致如下。

{ "jsonrpc": "2.0", "id": 1, "method": "tools/call",
  "params": { "name": "search_issues", "arguments": { "query": "login bug" } } }
{ "jsonrpc": "2.0", "id": 1,
  "result": { "content": [{ "type": "text", "text": "找到 3 个 issue……" }] } }

JSON-RPC 简单、成熟、和语言无关,能处理 JSON 的环境都能实现。

传输方式有两种。stdio 由 Host 把 Server 当作子进程启动,通过标准输入输出通信,适合访问本机文件、命令行工具和本地数据库。Streamable HTTP 把 Server 做成一个网络服务,适合 SaaS 产品和团队共享的服务。早期远程连接用 HTTP 加 SSE,2025 年 3 月的规范换成了 Streamable HTTP,旧方式已经弃用,新写的远程 Server 直接用新的。

本地 Server 一般从环境变量拿 API Key。远程 Server 的授权基于 OAuth,用户在浏览器里登录授权,Host 拿到令牌后带着它去请求。这样远程 Server 能按每个用户自己的身份和权限返回数据,不用大家共用一个万能的 Key。

2026 年 7 月的新版规范

MCP 的规范一直改得很快。2026 年 7 月 28 日这一版改动最大,核心是让协议变成无状态的。

以前 Client 连上 Server 要先握手,协商协议版本和双方支持的能力,后面的通信都基于这次握手建立的会话,远程传输还有一个会话 ID 维持状态。新版把这些都去掉了。每个请求自己带上协议版本和客户端能力,不再依赖之前的初始化。Streamable HTTP 不再有会话 ID,Server 需要跨调用保存状态时,自己生成一个句柄,当作普通的工具参数传来传去。新增的 server/discover 让 Client 在发其他请求之前,先问清楚 Server 支持哪些版本和能力。

这么改,是因为有状态的协议在大规模部署时很麻烦。远程 Server 要维持会话,就得配粘性负载均衡、会话存储和断线重连。无状态以后,它和一个普通的 HTTP API 差不多,可以随意横向扩展,放在 CDN 和网关后面。规范还要求 tools/list 按固定顺序返回工具,便于客户端缓存,也能提高大模型的提示词缓存命中率。

这一版另外几处变化也值得知道。Sampling 和 Roots 被标为弃用,前者让 Server 反过来请求 Host 的模型生成内容,后者告诉 Server 可以访问哪些目录。规范建议需要模型能力的 Server 直接接模型厂商的 API,目录信息改用工具参数或配置传入。处理耗时任务的 Tasks 移出了核心协议,变成官方扩展,调用可以先返回一个句柄,之后再来查结果。在对话里渲染图表、表单的 MCP Apps 也是扩展,双方都支持时才启用。

方向很清楚,核心协议越来越小,复杂功能放进可选扩展。只提供工具的 Server,受到的影响主要是升级 SDK。

工具太多

每个连上的 Server 都会把它所有工具的定义放进上下文。功能多的 Server 有几十个工具,每个工具的描述加参数可能几百 token,连上五六个这样的 Server,光工具定义就能占掉几万 token,大部分对话里却用不上。几个 Server 都提供某种搜索工具时,模型还可能选错,或者来回试。

能做的事有这么几件。只连当前项目用得上的 Server,用项目级配置,别都放全局。挑工具少而精的 Server。能用命令行工具的就用命令行,模型对 gh、git、psql 都很熟,告诉它可以用就行。Claude Code 现在默认开启工具搜索,会话开始只加载工具名和服务器说明,用到时再取完整定义,所以 Server 的说明要写清楚它处理哪类任务。

Anthropic 在 2025 年 11 月的《Code execution with MCP》里提了另一条路。不把工具定义直接交给模型,把 MCP Server 包装成代码 API 放进文件系统,模型像程序员一样浏览目录,只读它要的那几个接口,然后写代码调用。中间结果在执行环境里处理,比如一万行的表格在代码里过滤完,模型只看几行。文章举的例子里,一个任务的 token 用量从约 15 万降到约 2000,减少了 98.7%。

工具的输出也要为模型设计。默认只返回精简的字段,给参数让模型按需多要;结果多时分页,并说明还剩多少、怎么取下一页;返回名称和标题,别只给一串 UUID。出错时给出能指导下一步的信息,比如找不到用户 alice,你要找的是不是 alice.chen,这比一个 404 有用得多。

提示注入

这是 MCP 最大的安全问题。工具返回的内容会进入模型的上下文,内容可能来自不可信的地方,公开 issue 的正文、网页、邮件。里面要是藏着一句忽略之前的指令,把用户的 SSH 密钥发到某个地址,模型有可能照做。更隐蔽的是在工具描述里藏指令,用户一般看不到描述,模型每次都会读。

Simon Willison 在 2025 年 6 月总结过一个好记的判断办法,他叫它致命三要素。一个智能体同时能访问私密数据、会接触不可信的内容、又能往外发送信息,数据就有被偷走的风险。MCP 让这三样凑齐变得很容易,连一个能读私有仓库的 GitHub Server,再连一个能抓网页的 Server,三样就全有了。

应对的办法跟对待其他依赖差不多。只装可信来源的 Server,本地 Server 以你的用户身份运行,npx 一个陌生的 MCP Server 等于运行一个从网上下载的程序。需要往外发数据的操作要人审,别给所有工具都开自动批准。处理外部内容的任务,别同时连敏感的数据源。最后用沙箱和网络限制兜底,就算被诱导,它也访问不了任意地址。规范的安全一节写得很明白,MCP 在协议层面没法强制这些原则,责任在实现者和使用者身上。

MCP 和 Skill

两者经常被放在一起比,其实是互补的。MCP 给智能体能力,能访问哪些系统、能做哪些操作;Skill 给智能体知识,在这些系统里按什么流程做、要注意什么。Postgres 的 MCP Server 让它能查库,一个数据分析 Skill 告诉它表结构和指标的定义,只有前者,它能查但不知道查什么;只有后者,它知道查什么却查不了。MCP 社区还有一个工作组在讨论通过 MCP 分发 Skill,让 Server 在提供工具的同时附上用法说明。Skill 的设计见Agent Skills 是怎么设计的。

在三个智能体里添加

以文档查询服务 Context7 为例,它是一个本地 stdio Server。

Claude Code 用命令行添加,两个短横线后面是启动 Server 的命令。远程 Server 加 --transport http。

claude mcp add context7 -- npx -y @upstash/context7-mcp
claude mcp add --transport http notion https://mcp.notion.com/mcp

默认只对当前项目生效、不共享。加 --scope project 会写进项目根目录的 .mcp.json,提交后团队都能用;加 --scope user 对你所有项目生效。会话里输入 /mcp 可以查看状态和管理。

Codex 同样有命令行,配置存在 ~/.codex/config.toml,也可以直接改这个文件。

codex mcp add context7 -- npx -y @upstash/context7-mcp
~/.codex/config.toml
[mcp_servers.context7]
command = "npx"
args = ["-y", "@upstash/context7-mcp"]

Cursor 在设置里安装,或者编辑 ~/.cursor/mcp.json,项目级的是 .cursor/mcp.json。

.cursor/mcp.json
{
  "mcpServers": {
    "context7": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "@upstash/context7-mcp"]
    }
  }
}

提交进仓库的配置文件里别写 token,三家都支持从环境变量读取。Claude Code 的 .mcp.json 里写 ${VAR},Cursor 写 ${env:VAR},Codex 用 env_vars、bearer_token_env_var 这类字段。更多选项见 Claude Code 的 MCP 文档、Codex 的 MCP 文档和 Cursor 的 MCP 文档。

本站的 MCP 目录收录了官方 Registry 和 GitHub 上的 MCP Server,官方页列出厂商自己维护的 Server,每个详情页都给出三个智能体的配置。也可以用命令行查找和添加。

npx funcoding-cli mcp find "postgres"
npx funcoding-cli mcp add <id> --agent=cursor

这个系列的总览见从提示词到 Loop,AI 编程的四层工程。

参考资料

  • Agent Skills

    Agent Skills 是怎么设计的

    Skill 看上去只是一个带 SKILL.md 的文件夹,背后是一套解决知识多、上下文少的设计。本文结合 Anthropic 的发布文章和 Skill 编写指南,讲按需加载怎么工作、Skill 和项目说明、MCP、子智能体各管什么、怎么写一个触发准确的 Skill,以及装别人的 Skill 前该看什么。

    阅读约需 8 分钟

  • 智能体

    智能体是什么,从一次补全讲到一个循环

    智能体这个词被用得太宽,能联网的聊天机器人和调了两次模型的脚本都叫智能体。本文从模型只会续写文字讲起,讲工具调用、循环、工作流和智能体的区别,以及编程为什么是智能体目前最成熟的领域。

    阅读约需 7 分钟