先给结论
MCP(Model Context Protocol,模型上下文协议)是一套让 AI 应用连接外部工具与数据的开放协议,作用是给大模型装上「 USB-C 接口」:一次对接,处处可用。它不绑定任何模型厂商,任何实现了这套协议的服务(称为 MCP 服务器)都能被任何支持 MCP 的客户端发现和调用,你不需要为每个 AI 应用单独写一遍集成代码。
一句话区分:Function Calling 是「模型怎么表达我想调工具」,MCP 是「工具怎么被发现、怎么被连接、怎么被复用」。两者解决的是不同层的问题,不是替代关系。
三个角色:Host 、 Client 、 Server
| 角色 | 是什么 | 例子 |
|---|---|---|
| Host(宿主) | 用户直接使用的 AI 应用 | Claude Desktop 、 Cursor 、各类 IDE 插件 |
| Client(客户端) | Host 内部负责与某一个服务器通信的组件 | 由 Host 实现,用户通常看不到 |
| Server(服务器) | 对外提供能力的服务程序 | 文件系统、数据库、 GitHub 、地图服务 |
一个 Host 可以同时连多个 Server,每个连接相互独立。这也是为什么「装了三个 MCP 之后 AI 突然变聪明」——它真的多了三组外部能力。
Server 能提供的三种东西
1. Tools(工具)
模型可以调用的函数,是唯一会改变外部世界的能力。比如「执行 SQL 查询」「创建 GitHub Issue 」「发送文件」。工具调用通常需要用户确认,这是安全边界所在。
2. Resources(资源)
可以被读取的数据,类似「 GET 接口」——读文件、取数据库表结构、拉一份文档。资源是只读的,用于给模型补充上下文。
3. Prompts(提示模板)
服务器预置的提示词模板,用户在客户端里显式选择后触发,用来把「常见任务」标准化。
一次完整调用发生了什么
- 初始化握手:客户端连上服务器,双方交换协议版本与各自支持的能力。
- 能力发现:客户端请求工具列表,服务器返回所有工具的名称、描述与参数结构(JSON Schema)。
- 模型决策:用户提问后,模型结合工具描述判断是否需要调用,需要则生成调用参数。
- 执行与回传:客户端调用服务器,服务器执行后把结果作为上下文返回给模型。
- 生成回答:模型基于结果组织最终回复。
这里有个关键细节:工具描述的质量直接决定调用是否准确。描述含糊的工具,模型要么不用、要么用错。写工具描述时要像写 API 文档一样具体。
两种传输方式,先记住这个区别
当前标准定义了两种传输:
- stdio:客户端把服务器当子进程启动,通过标准输入输出交换消息。官方建议客户端尽可能支持它。优点是无网络开销、天然本地、凭证走环境变量即可。铁律是:服务器不能往 stdout 写任何非协议内容,日志必须走 stderr,否则就是随机卡死的元凶。
- Streamable HTTP:服务器是独立服务,客户端通过 HTTP POST 向单一端点发消息,回复可以是单个 JSON 对象,也可以是请求级的 SSE 流。适合远程部署、多客户端共享。
最小可用配置长什么样
{
"mcpServers": {
"filesystem": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/path/to/dir"],
"env": {}
}
}
}
就这三行:命令、参数、环境变量。改完重启客户端,工具列表里就会多出文件读写能力。
新手最容易踩的三件事
① 路径写错:命令或目录路径不对,表现为「服务器连不上」,先用绝对路径排查。
② 日志污染 stdout:stdio 模式下任何 print / console.log 都会被当成协议帧,轻则被忽略,重则整个响应丢失导致超时。
③ 环境变量没生效:改了配置一定要完全退出再启动客户端,热重载经常不生效。
② 日志污染 stdout:stdio 模式下任何 print / console.log 都会被当成协议帧,轻则被忽略,重则整个响应丢失导致超时。
③ 环境变量没生效:改了配置一定要完全退出再启动客户端,热重载经常不生效。
安全边界,务必先想清楚
- 工具是能力也是风险:一个能执行 shell 的 MCP 服务器,等于把终端交给了模型,务必限制目录范围。
- 只装可信来源的服务器:第三方服务器可能读取本地文件或外传数据,安装前看清楚它申请了哪些权限。
- 远程服务要鉴权:走 HTTP 传输的服务器必须验证来源、做好身份验证,本地服务也应只绑定本机地址。
- 注意间接提示词注入:模型读到的外部内容里可能藏着指令,凡是「读外部内容 + 调工具」的组合都要有人工确认环节。
相关阅读
MCP 和插件、 Function Calling 是什么关系?
Function Calling 解决模型如何表达调用意图;MCP 解决工具如何被发现、连接和复用,是更外一层的协议。插件通常是某个厂商私有的扩展机制,MCP 是开放的、跨客户端通用。
一定要会写代码才能用 MCP 吗?
不用。使用现成服务器只需要改一段 JSON 配置;写自己的服务器才需要编程,Python 与 TypeScript 都有官方 SDK,入门门槛不高。
MCP 会泄露我的数据吗?
本地 stdio 服务器的数据不出本机,除非它自己去调外部 API 。远程服务器则取决于对方实现,建议只用可信服务,并留意它申请的权限范围。
为什么官方文档说客户端应该优先支持 stdio?
因为它最简单也最安全:无需开放端口、无需处理网络认证,凭证通过环境变量注入,适合访问本地文件与本机服务的绝大多数场景。









评论 (0)