MCP 完全指南:协议原理、生态现状与接入实战
过去一年 AI 工具链最大的变化,不是某个模型变强了,而是模型与外部世界的接口被标准化了。这个标准叫 Model Context Protocol(MCP),由 Anthropic 在 2024 年底开源。
它解决什么问题
在 MCP 之前,每接入一个工具你都要写一套定制胶水代码:A 框架的插件不能给 B 编辑器用,C 产品的连接器换个客户端就失效。M 个 AI 应用 × N 个工具 = M×N 份适配工作。
MCP 把这个矩阵压成了一根轴:工具方发布一个 MCP Server,任何支持 MCP 的客户端都能直接用。多了一次标准化,少了一整片重复劳动。
三个核心原语
- Tools(工具):可被模型调用的函数,带 JSON Schema 描述参数——这是用得最多的一类;
- Resources(资源):可被读取的数据,类似文件或数据库视图,由用户或客户端决定是否加载;
- Prompts(提示模板):服务端预置的可复用提示词模板,常被忽略但很适合标准化工作流。
传输方式
- stdio:本地进程通过标准输入输出通信,最简单、最常用,适合本地工具;
- HTTP + SSE / Streamable HTTP:远程服务,适合多用户共享的托管型 Server。
生态现状
目前生态已相当可观:官方参考实现覆盖文件系统、Git、数据库、搜索;社区清单 awesome-mcp-servers 收录了数百个场景化 server;GitHub、Supabase、Cloudflare 等厂商都发布了官方 MCP。客户端侧,Claude、Cursor、Cline、Continue 等都已原生支持。
五分钟接入第一个 Server
以最常用的文件系统 server 为例,在客户端配置里加一条:
{
"mcpServers": {
"filesystem": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/path/to/data"]
}
}
}
重启客户端后问它「列出 /path/to/data 下的文件」,能看到工具被调用就说明通了。
自己写一个 Server
Python 生态用 FastMCP 最省事,一个装饰器就是一个工具:
from fastmcp import FastMCP
mcp = FastMCP("demo")
@mcp.tool()
def word_count(text: str) -> int:
"""统计文本的词数"""
return len(text.split())
if __name__ == "__main__":
mcp.run()
三个实践建议
- 工具描述比实现更重要:模型靠 description 决定是否调用,写清「什么时候用、参数什么含义」比优化代码收益更大;
- 控制工具数量:单次暴露给模型的工具超过 20 个,选择准确率会明显下降,按场景拆分 server;
- 权限最小化:能只读就别给写权限,尤其是文件系统与数据库类 server。
协议仍在快速演进,具体字段以官方规范最新版本为准。