MCP
MCP, Model Context Protocol, 可以理解为连接 AI 应用和外部工具、数据源的通用协议。它让模型客户端用统一方式访问文件、数据库、浏览器、业务系统和内部服务。
MCP 解决的核心问题
没有 MCP 时,每个 AI 客户端都要用自己的方式接工具:
AI 客户端 A -> 自定义文件工具
AI 客户端 B -> 自定义数据库工具
AI 客户端 C -> 自定义浏览器工具
这会导致重复开发、权限难统一、工具难复用。MCP 的目标是让工具提供方按统一协议暴露能力,让客户端按统一方式发现和调用。
你可以把 MCP 理解成“AI 应用的工具连接层”。
为什么要学 MCP
- AI 应用需要连接越来越多工具
- 每个工具单独接入会造成重复开发
- MCP 可以把工具能力封装成可复用服务
- 对 AI 编程工具、Agent 平台和企业内部工具都很重要
MCP 适合哪些人先学
如果你只是调用模型做聊天或简单 RAG,可以晚一点学 MCP。如果你想做下面这些事情,就很值得提前学:
- 给 AI 编程工具接入本地项目能力。
- 把公司内部 API 封装给多个 AI 客户端复用。
- 构建企业内部工具市场。
- 做多工具 Agent,需要统一工具描述和权限。
- 希望把数据库、文件、浏览器、知识库都接到一个 AI 工作台。
用一句话理解 MCP
MCP 就像 AI 应用和外部工具之间的 USB-C 接口。工具只要按照协议暴露能力,支持 MCP 的客户端就可以用统一方式发现和调用这些能力。
你应该掌握什么
- MCP Client 和 MCP Server 的关系
- Tool、Resource、Prompt 的区别
- 如何定义工具输入输出 schema
- 如何处理权限、错误和敏感数据
- 如何把本地脚本、数据库或 HTTP API 封装成 MCP Server
Client 和 Server 怎么协作
MCP Client 通常在 AI 应用或 AI 编程工具里,负责:
- 连接一个或多个 MCP Server。
- 发现 server 暴露的 tools、resources、prompts。
- 把工具描述提供给模型。
- 在模型需要时发起工具调用。
MCP Server 负责:
- 定义工具和输入输出 schema。
- 执行真实操作,例如读文件、查数据库、调用 API。
- 返回结构化结果。
- 做权限、安全和错误处理。
模型本身不直接访问你的文件或数据库。真正的访问应该发生在 MCP Server 或后端服务里。
可做的 MCP Server
| Server | 能力 |
|---|---|
| 文件管理 | 搜索、读取、写入项目文件 |
| 数据库查询 | 执行受限 SQL、返回表结构和结果 |
| 浏览器工具 | 打开网页、截图、提取内容 |
| 团队知识库 | 搜索 Notion、飞书、Confluence |
| 运维工具 | 查询日志、部署状态和告警 |
Tool、Resource、Prompt 的区别
| 类型 | 用途 | 例子 |
|---|---|---|
| Tool | 执行动作或计算 | 搜索文件、查询数据库、发起请求 |
| Resource | 暴露可读取的上下文 | 当前项目文件、数据库 schema、文档内容 |
| Prompt | 提供可复用提示词模板 | 代码审查模板、日报生成模板 |
Tool 设计原则
MCP 工具要尽量小而清晰。一个工具应该完成一个明确动作。
推荐:
search_files(query: string, root: string, limit: number)
read_file(path: string)
query_database(sql: string, max_rows: number)
不推荐:
run_anything(command: string)
do_task(task: string)
工具越模糊,模型越难正确使用,也越难做权限控制。
Resource 适合放什么
Resource 更适合暴露稳定、可读取的上下文,例如:
- 当前项目的 README。
- 数据库 schema。
- API 文档。
- 配置说明。
- 用户选择的文件内容。
如果某个能力需要计算、搜索、写入或调用外部服务,更适合做成 Tool。
实战路线
- 写一个只读文件搜索 MCP Server。
- 给工具加 schema 和错误处理。
- 接入一个真实 AI 客户端。
- 加入权限白名单和日志。
- 把一个业务 API 封装成 MCP 工具。
权限和安全
MCP Server 经常连接本地文件、数据库和内部系统,所以安全设计非常重要。
最低要求:
- 明确白名单目录或白名单 API。
- 默认只读,写操作单独设计。
- 不返回
.env、密钥、cookie、token。 - 对 SQL、shell、文件写入等高风险能力做限制。
- 记录调用日志,包括工具名、参数摘要、调用方和时间。
- 错误信息不要泄露敏感路径或密钥。
不要依赖模型“自觉不做危险事”。权限应该由 server 端代码保证。
错误处理
MCP 工具返回错误时,要让模型知道如何恢复。
坏例子:
{ "error": "failed" }
好例子:
{
"status": "error",
"error_code": "ROOT_NOT_ALLOWED",
"message": "root 不在允许搜索目录内",
"hint": "请选择 /workspace 下的目录"
}
清晰错误能帮助 Agent 调整下一步,而不是反复调用同一个失败工具。
项目检查点
- 工具命名是否能让模型理解
- 参数是否足够结构化
- 返回结果是否简洁且可继续推理
- 是否避免暴露 token、cookie、密钥等敏感信息
- 是否给危险操作加确认机制
新手练习:只读文件搜索工具
目标:做一个 MCP Server,提供 search_files 工具。
输入:
- query:关键词
- root:允许搜索的目录
- limit:最多返回多少条
输出:
- 文件路径
- 匹配行号
- 匹配内容摘要
注意:
- 只允许搜索白名单目录
- 不返回隐藏密钥文件
- 错误信息要告诉调用方如何修正
进阶练习
- 给
search_files增加文件类型过滤,例如只搜.md和.py。 - 增加
read_file工具,但限制最大读取行数。 - 给工具调用加日志,记录 query、耗时和返回数量。
- 把一个只读 HTTP API 封装成 MCP 工具。
- 设计一个需要用户确认的写操作工具,但先不真正执行。