作者:没有四次元口袋的蓝胖
日期:2026-10-05
标签:MCP协议, AI工具
MCP协议基础
2024年底Anthropic开源了MCP(Model Context Protocol),短短一年多就成了AI工具生态的事实标准。Claude Desktop、Cursor、VS Code、ChatGPT全都接入了它,GitHub上相关服务器已经超过6000个。面试中问到AI Agent、工具调用、大模型应用架构,MCP几乎绑绑会涉及。
这篇笔记聚焦MCP协议的基础知识——从它是什么、核心架构、三大原语,到常用的官方Server(Filesystem和Fetch),帮你建立对MCP的完整认知。
核心掌握:MCP是什么、Host/Client/Server三层架构、Tools/Resources/Prompts三大原语、JSON-RPC 2.0通信、stdio与HTTP传输、FileSystem与Fetch服务。
一、MCP是什么
1.1 一句话定义
MCP(Model Context Protocol)是一个开源的标准化协议,定义了AI应用如何与外部工具和数据源进行通信。
用一个类比:MCP就是AI世界的USB-C接口。在USB-C之前,每个手机品牌用自己的充电口;在MCP之前,每个AI应用要对接每个工具,都得写一套定制集成。MCP把这件事标准化了——任何MCP Client都能连任何MCP Server,不用写胶水代码。
1.2 解决了什么问题
假设你有5个AI应用、10个外部工具(数据库、GitHub、文件系统、Slack……):
传统方式:5 × 10 = 50 个定制集成 MCP方式:5 个 Client + 10 个 Server = 15 个组件这就是从M×N 问题到 M+N 问题的转变。写一个MCP Server,所有支持MCP的AI应用都能用。
在传统模式下,OpenAI有Function Calling的格式,LangChain有自己的Tool抽象,Anthropic有Tool Use规范——同一个数据库要对接三个AI平台,就得写三套完全不同的集成代码。MCP的出现终结了这种混乱。
1.3 发展时间线
| 时间 | 事件 |
|---|---|
| 2024.11 | Anthropic发布MCP协议,开源规范与SDK |
| 2025年上半年 | Cursor、VS Code、Zed等开发工具率先接入 |
| 2025年下半年 | OpenAI的Agents SDK和Responses API也支持MCP |
| 2025.12 | MCP捐赠给Linux基金会(AAIF),成为中立治理的开放标准 |
| 2026年 | 生态爆发,公开MCP Server超过6000个,成为AI工具对接的事实标准 |
1.4 谁在用MCP
- AI助手:Claude Desktop、ChatGPT
- 开发工具:Cursor、VS Code、Zed、Windsurf、Continue.dev
- Agent框架:LangChain、OpenAI Agents SDK
- 企业场景:Block、Apollo等公司已将MCP集成到内部系统
二、核心架构:Host / Client / Server
MCP采用三层架构,理解这三个角色是理解整个协议的基础。
┌─────────────────────────────────┐ │ Host(宿主) │ │ 如 Claude Desktop / Cursor │ │ │ │ ┌──────────┐ ┌──────────┐ │ │ │MCP Client│ │MCP Client│ │ │ └────┬─────┘ └────┬─────┘ │ └───────┼──────────────┼─────────┘ │ │ JSON-RPC 2.0 JSON-RPC 2.0 │ │ ┌─────┴─────┐ ┌────┴──────┐ │MCP Server │ │MCP Server │ │ (文件系统) │ │ (GitHub) │ └───────────┘ └───────────┘2.1 三个角色
| 角色 | 职责 | 举例 |
|---|---|---|
| Host | 包含LLM的AI应用,负责编排交互、管理Client实例 | Claude Desktop、Cursor、VS Code |
| MCP Client | 嵌入在Host内部,与MCP Server维持1:1连接,发送JSON-RPC请求 | Host内部的协议模块 |
| MCP Server | 独立进程,对外暴露Tools/Resources/Prompts,不知道模型是谁 | filesystem server、fetch server |
几个关键点:
- Host可以管理多个Client:Claude Desktop同时连接Filesystem Server和GitHub Server
- 每个Client只连一个Server:Client和Server之间是1:1关系
- Server是无感知的:Server不知道对面是Claude还是Cursor,只处理JSON-RPC请求
2.2 通信协议:JSON-RPC 2.0
所有Client与Server之间的通信都基于JSON-RPC 2.0,这是一种轻量级的远程过程调用协议。消息格式如下:
// 请求{"jsonrpc":"2.0","method":"tools/call","params":{"name":"read_file","arguments":{"path":"/home/demo.txt"}},"id":1}// 响应{"jsonrpc":"2.0","result":{"content":[{"type":"text","text":"文件内容..."}]},"id":1}关键字段:
method:调用的方法名(如tools/list、tools/call、resources/read)params:方法参数id:请求/响应关联ID,确保异步通信中能正确匹配
2.3 两种传输方式
| 传输方式 | 适用场景 | 特点 |
|---|---|---|
| stdio | 本地进程 | Host启动Server子进程,通过标准输入/输出通信,无需网络端口,安全默认 |
| Streamable HTTP | 远程服务 | Server暴露HTTP端点,支持多租户、云端部署、远程API |
stdio的工作流程:Host把Server作为一个子进程启动(类似npx -y @modelcontextprotocol/server-filesystem),然后通过stdin发送JSON-RPC请求、通过stdout接收响应。整个过程不需要打开任何网络端口,安全性天然有保障。
注意:早期版本使用HTTP+SSE(Server-Sent Events),2025年11月规范已将其废弃,统一为Streamable HTTP。面试时别再说"SSE传输"了。
2.4 连接生命周期
一次完整的MCP交互流程:
1. 初始化:Client发送 initialize 请求 → Server返回能力声明 2. 能力发现:Client发送 tools/list → Server返回可用工具列表 3. 工具调用:模型决定调用某工具 → Client发送 tools/call → Server执行并返回结果 4. 结果回传:Client将结果交给模型 → 模型生成最终回复这个流程中,步骤2的动态发现是MCP的精髓——Client不需要提前知道Server有什么工具,运行时查询即可。
三、三大原语:Tools / Resources / Prompts
MCP Server对外暴露三种能力(称为primitives),理解它们是掌握MCP的核心。
3.1 Tools(工具)
可被模型调用的动作。有名称、描述、输入Schema,模型根据描述判断何时调用。
- 类比:后端API的POST接口
- 特点:可以有副作用(写文件、发消息、执行计算)
- 示例:
read_file、search、send_email
{"name":"get_weather","description":"获取指定城市的天气信息","inputSchema":{"type":"object","properties":{"city":{"type":"string","description":"城市名称"}},"required":["city"]}}模型的决策链:看到description→ 判断用户是否需要天气 → 构造参数调用 → 拿到结果 → 组织回答。所以description写得越清晰,模型调用的准确率越高。
3.2 Resources(资源)
只读数据源。模型可以拉取Resources作为上下文,但不能修改。
- 类比:后端API的GET接口
- 特点:通过URI标识(如
file:///config.json、db://users/123),无副作用 - 示例:配置文件、数据库记录、API响应
- 与Tools的区别:Resources是被动拉取的"数据",Tools是主动执行的"动作"
3.3 Prompts(提示模板)
可复用的提示词模板。封装与特定服务交互的最佳实践。
- 类比:API的使用说明书 / 预设的对话工作流
- 特点:接受参数,生成结构化的消息列表
- 示例:代码审查模板、SQL查询引导模板、调试流程模板
- 使用场景:当你的工具比较复杂时,Prompt可以教模型"怎么用效果最好"
3.4 三者对比
| 原语 | 读写 | 谁触发 | 类比 | 典型场景 |
|---|---|---|---|---|
| Tools | 可写 | 模型决定调用 | POST接口 | 执行操作、计算、API调用 |
| Resources | 只读 | 模型/用户拉取 | GET接口 | 读取文件、查询数据库 |
| Prompts | 只读 | 用户选择 | API文档 | 预定义交互模板 |
四、基本使用:配置与启动MCP Server
4.1 配置文件位置
MCP Client(如Claude Desktop)通过JSON配置文件声明要连接的Server:
| 系统 | 配置文件路径 |
|---|---|
| macOS | ~/Library/Application Support/Claude/claude_desktop_config.json |
| Windows | %APPDATA%\Claude\claude_desktop_config.json |
| Linux | ~/.config/Claude/claude_desktop_config.json |
4.2 配置结构
{"mcpServers":{"server-name":{"command":"npx","args":["-y","包名","参数..."],"env":{"API_KEY":"xxx"}}}}关键字段说明:
command:启动Server的命令(npx、uvx、node、python、docker等)args:命令参数,通常包含包名和业务参数env:环境变量,常用于传递API Key等敏感信息
Cursor也支持项目级配置:在项目根目录创建.cursor/mcp.json,可以为不同项目配置不同的Server,提交到Git后团队共享。
五、FileSystem文件服务
让AI读写本地文件的MCP Server,是使用最广泛的官方Server之一。
5.1 配置示例
{"mcpServers":{"filesystem":{"command":"npx","args":["-y","@modelcontextprotocol/server-filesystem","/Users/bluep/Documents","/Users/bluep/Projects"]}}}args中从第三个参数开始,每个都是允许访问的目录路径(白名单机制)。可以配多个,但务必只开放必要目录。
5.2 提供的Tools
| 工具名 | 功能 |
|---|---|
read_file | 读取文件内容 |
write_file | 写入文件 |
list_directory | 列出目录内容 |
create_directory | 创建目录 |
move_file | 移动/重命名文件 |
search_files | 按正则模式搜索文件 |
get_file_info | 获取文件元信息(大小、修改时间等) |
5.3 使用场景
- 让AI分析本地代码项目结构,帮你写README
- 读取配置文件并解释每个字段含义
- 批量重命名或整理文件
- 读取日志文件排查线上问题
5.4 安全注意点
- 最小权限原则:只开放必要目录,绝不要开放根目录
/或C:\ - Server无法访问白名单之外的路径,这是代码层面的安全约束
- 修改配置后需重启AI应用才能生效
- 不要在开放目录中存放敏感文件(如
.env、密钥文件)
六、Fetch网页服务
让AI抓取网页内容的MCP Server,将HTML转换为Markdown格式,方便模型理解。
6.1 配置示例
方式一:通过uvx(推荐,Python)
{"mcpServers":{"fetch":{"command":"uvx","args":["mcp-server-fetch"]}}}方式二:通过npx(Node.js)
{"mcpServers":{"fetch":{"command":"npx","args":["-y","mcp-fetch-server"]}}}方式三:通过Docker
{"mcpServers":{"fetch":{"command":"docker","args":["run","-i","--rm","mcp/fetch"]}}}6.2 提供的Tools
| 工具名 | 功能 |
|---|---|
fetch | 抓取URL,HTML转Markdown返回 |
6.3 可选参数
| 参数 | 说明 |
|---|---|
url | 必填,要抓取的网页地址 |
max_length | 最大返回字符数(默认5000) |
start_index | 从第几个字符开始返回(支持分块读取大页面) |
raw | 是否返回原始HTML,不做Markdown转换 |
6.4 高级配置
{"mcpServers":{"fetch":{"command":"uvx","args":["mcp-server-fetch","--ignore-robots-txt","--user-agent=MyBot/1.0","--proxy-url=http://proxy:8080"]}}}--ignore-robots-txt:忽略网站的robots.txt限制(谨慎使用)--user-agent=xxx:自定义请求的User-Agent--proxy-url=xxx:配置代理地址
6.5 使用场景
- 让AI获取网页上的最新信息(新闻、文档、API说明)
- 抓取技术博客内容做总结
- 读取在线文档作为上下文
- 获取GitHub Issue或PR的内容
🗺️ 思维导图速览
MCP协议(Model Context Protocol) ├── 是什么 │ ├── Anthropic 2024.11开源的标准化协议 │ ├── AI世界的"USB-C接口" │ └── 将M×N集成问题降为M+N ├── 三层架构 │ ├── Host:AI应用(Claude/Cursor/VS Code) │ ├── Client:嵌入Host,维持JSON-RPC连接(1:1连Server) │ └── Server:独立进程,暴露Tools/Resources/Prompts ├── 通信基础 │ ├── JSON-RPC 2.0协议(请求/响应/通知) │ ├── stdio传输(本地子进程,安全默认) │ └── Streamable HTTP传输(远程,多租户) ├── 三大原语 │ ├── Tools:可执行的动作(模型调用,可有副作用) │ ├── Resources:只读数据(URI标识,被动拉取) │ └── Prompts:可复用的提示模板(教模型用好工具) ├── 配置使用 │ ├── 配置文件:JSON格式,声明command/args/env │ └── 支持全局配置与项目级配置 └── 常用Server ├── Filesystem:读写本地文件(白名单目录) └── Fetch:抓取网页内容(HTML→Markdown)📝 写在最后
学习建议
- 先用起来:先配置Filesystem和Fetch两个官方Server,在Claude Desktop或Cursor里体验AI操作文件、抓取网页的感觉,建立直觉。
- 理解架构:重点理解三层架构和三大原语,这是面试考察的核心。能画出Host/Client/Server的关系图就差不多了。
- 动手配置:熟悉JSON配置文件的写法,搞清楚command、args、env各字段的含义,理解stdio传输的安全机制。
- 关注生态:GitHub上
modelcontextprotocol/servers仓库有大量官方和社区Server,看看别人怎么写的,比读文档有效。
面试高频问题速答
Q:什么是MCP?
MCP(Model Context Protocol)是Anthropic开源的标准化协议,定义了AI应用与外部工具/数据源的通信方式。它采用Host/Client/Server三层架构,基于JSON-RPC 2.0通信,通过Tools、Resources、Prompts三大原语暴露能力。核心价值是将M×N的集成问题简化为M+N,实现"一次开发,到处接入"。2025年底已捐赠给Linux基金会。
Q:MCP的通信协议是什么?
JSON-RPC 2.0。一种轻量级的远程过程调用协议,基于JSON格式。请求包含
method、params、id三个核心字段。
Q:stdio和HTTP传输怎么选?
本地开发、单用户场景用stdio(简单、安全、无需网络端口)。远程服务、多租户、云端部署用Streamable HTTP。
Q:MCP的安全性如何保证?
①权限隔离:每个Server只暴露声明的能力,无法越权操作;②凭证隔离:API Key等敏感信息存在Server端的环境变量中,不会传给模型;③最小权限:如Filesystem Server只开放配置的目录白名单;④用户确认:模型调用工具前通常需要用户确认(取决于Host实现)。