主题
02-03 · MCP 详解(Model Context Protocol)
MCP 是 AI 的 USB-C。 它解决了"每接一个新数据源/新工具就得重新对接一遍"的问题,让任何 LLM 客户端(Claude、Codex、Cursor、Windsurf)都能用一套标准协议接入任何工具/数据。
来源:Anthropic 于 2024 年 11 月开源、并于 2025 年起被 OpenAI、Google、Microsoft 等普遍采纳,目前是 AI Agent 工具接入的事实标准。
一、MCP 是什么(一图秒懂)
┌─────────────────────────────┐
│ MCP Host(Claude / │
│ Windsurf / Codex …) │
└────────────┬────────────────┘
│ JSON-RPC over stdio / HTTP
┌────────────┴────────────────┐
│ MCP Client(内嵌) │
└────────────┬────────────────┘
│
┌────────────┴────────────────┐
│ MCP Server │ (由你或社区写)
│ - Tools(模型可调用的函数) │
│ - Resources(应用级数据) │
│ - Prompts(用户级模板) │
└────────────┬────────────────┘
│
┌────────────┴────────────────┐
│ 真实世界(GitHub API、本地 │
│ 文件、数据库、Slack、Notion) │
└─────────────────────────────┘三个原语必须分清楚(这是面试常考的):
| 原语 | 谁控制 | 例子 |
|---|---|---|
| Tools | 模型自主决定调用 | "读取这个文件"、"调用 GitHub API"、"跑这个 SQL" |
| Resources | 应用决定提供 | 一个项目的代码索引、一个数据库的 schema |
| Prompts | 用户主动选择 | "用户说『总结这次会议』时,触发会议总结模板" |
常见误区:很多人以为"MCP = Tool 调用"。错了,那只是 MCP 的三个原语之一。
二、为什么 MCP 比"自己写函数调用"好
Before MCP
- 每个产品自己定义 function calling schema
- 接 GitHub 要写一遍,接 Slack 又要写一遍
- 换个 LLM(从 OpenAI 到 Claude)所有 Tool 重写
After MCP
- 一个 MCP server 写完,所有 LLM 客户端通用
- 社区里已经有 200+ 个开源 MCP servers(GitHub、Slack、Notion、Postgres、文件系统、浏览器、Figma…)
- 你自己写的 MCP server 可以直接被 Claude Code、Windsurf、Codex 同时用
三、最小实战:在 Claude Code 里挂一个 MCP
3.1 装一个现成的(文件系统)
bash
# Claude Code 提供了 mcp 子命令
claude mcp add filesystem -s user -- npx -y @modelcontextprotocol/server-filesystem ~/projects进入 Claude Code 后:
> /mcp
# 应该看到 filesystem 这一项
> 帮我列出 ~/projects 目录下所有的 README.md 文件
# 它会通过 MCP 工具去读3.2 公司常用 MCP 清单
| MCP server | 用途 | 安装命令 |
|---|---|---|
| filesystem | 读写本地文件 | claude mcp add filesystem -s user -- npx -y @modelcontextprotocol/server-filesystem ~/ |
| github | 读 issue / PR / commit | claude mcp add github -s user -- npx -y @modelcontextprotocol/server-github |
| postgres | 读数据库(只读) | claude mcp add postgres -s user -- npx -y @modelcontextprotocol/server-postgres "$DATABASE_URL" |
| chrome-devtools | 浏览器调试(截图、网络) | 见 chrome-devtools-mcp 仓库 |
| codex | 双 AI 协同 | claude mcp add codex -s user -- codex -m gpt-5-codex -c model_reasoning_effort="high" mcp |
3.3 Windsurf 里挂 MCP
Windsurf 设置 → MCP servers → Edit mcp_config.json,参考:
json
{
"mcpServers": {
"filesystem": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/home/your/projects"]
},
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": { "GITHUB_PERSONAL_ACCESS_TOKEN": "ghp_xxx" }
}
}
}API Key 安全:永远用环境变量或本地 keychain,不要把 Key 写进 git 仓库。
四、写一个最小的自己的 MCP server
任何能"读环境/调 API/算东西"的能力都可以包成 MCP。下面是 Python 版最小骨架:
bash
mkdir my-mcp && cd my-mcp
python -m venv .venv && source .venv/bin/activate
pip install "mcp[cli]"python
# server.py
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("hello")
@mcp.tool()
def add(a: int, b: int) -> int:
"""把两个整数相加。"""
return a + b
@mcp.tool()
def now() -> str:
"""返回当前时间。"""
from datetime import datetime
return datetime.now().isoformat()
if __name__ == "__main__":
mcp.run()注册到 Claude Code:
bash
claude mcp add hello -s user -- python /absolute/path/to/server.py进入 Claude Code 后:
> 用 hello 工具帮我算 17 + 25,再告诉我现在几点恭喜,你已经造出了一个属于公司的 MCP server。
五、MCP vs Function Calling vs Plugin
| 维度 | OpenAI Plugin(已弃) | Function Calling | MCP |
|---|---|---|---|
| 谁定义 | OpenAI 单独 | 各家自己 | 开放协议 |
| 跨 LLM | ❌ | ❌ | ✅ |
| 工具发现 | OpenAPI 描述 | 调用方拼 schema | 服务自描述 |
| 资源/Prompt 概念 | 无 | 无 | 有(三原语) |
结论:在 Agent 工程里,优先使用 MCP。Function Calling 只在你做"某个特定 LLM 的产品壳子"时才用。
六、MCP vs Skills(最容易混淆的对比)
| 维度 | MCP | Skills |
|---|---|---|
| 形态 | 运行时服务(独立进程) | 静态文件夹 |
| 调用方式 | 模型主动调用 Tool | 模型读 SKILL.md 后按指令做 |
| 主要解决 | "怎么接外部世界" | "怎么把方法论沉淀给 Agent" |
| 是否常驻 | 是 | 否(按需加载) |
| 例子 | github、postgres、slack | 写 SOP、做品牌设计、做客户调研 |
黄金组合:用 Skill 描述"做一件事的步骤和判断标准",用 MCP 提供"做这件事所需的具体能力"。
详见 → 04 · Skills 详解
七、参考资料
- 📚 MCP 官网
- 📚 Anthropic 入门课程
- 📚 MCP GitHub 主仓库
- 📚 社区 MCP servers 列表
- 📚 [公司内部已用 MCP(IT 内网文档)]
继续 → 04 · Skills 详解