如果你最近半年用过任何AI编程工具,你大概率已经跟MCP打过交道了——虽然你可能没注意到。
Cursor在你写代码的时候,背后调用文件系统、数据库、Git,走的就是MCP。Claude Code连你的终端、浏览器、项目目录,用的也是MCP。甚至连Dify、Coze这些低代码平台,最近几个月也在疯狂接入MCP server。
这个协议是Anthropic在2024年底提出的,当时没多少人当回事。到了2026年中,它已经变成了AI工具调用的事实标准。我花了两周时间研究它的设计、实现和生态,今天把理解写出来。
MCP解决了什么问题
先说背景。AI大模型本身只会"说话"——你给它文字,它回你文字。但实际使用中,我们希望AI能做事情:读文件、查数据库、调API、操作浏览器。
在MCP之前,每个AI工具都有自己的"工具调用"方式。OpenAI定义了function calling,Google有自己的tool use格式,LangChain搞了一套tool抽象,CrewAI又搞了一套。结果就是:你写了一个能让AI查天气的工具,想在Cursor里用?得适配一次。想在Claude里用?再适配一次。想在自己的Agent框架里用?又得适配一次。
这就好比每个手机厂商都用不同的充电接口。你的充电器能用,但换个手机就得买新的。
MCP做的事情就是定义一个统一的接口。工具提供方按照MCP标准把自己的能力暴露出来(叫"MCP server"),AI应用按照MCP标准去调用(叫"MCP client")。这样,一个工具写一次,所有支持MCP的AI应用都能直接用。
MCP的技术架构
MCP的架构不复杂。它定义了三种能力:
Resources:数据源。比如文件内容、数据库记录、API返回的数据。AI可以读取这些资源作为上下文。
Tools:操作。比如发送邮件、创建文件、执行SQL。AI可以调用这些工具执行动作。
Prompts:预定义的提示词模板。这个用得相对少一些,主要用于标准化某些常见任务的交互方式。
通信方式有两种:stdio(标准输入输出)和HTTP SSE(Server-Sent Events)。stdio适合本地工具,比如让AI读你电脑上的文件。HTTP适合远程服务,比如让AI调用云端的数据库。
# 一个最简单的MCP server示例(Python)
from mcp.server import Server
import mcp.types as types
server = Server("weather-server")
@server.list_tools()
async def list_tools():
return [
types.Tool(
name="get_weather",
description="查询指定城市的天气",
inputSchema={
"type": "object",
"properties": {
"city": {"type": "string", "description": "城市名称"}
},
"required": ["city"]
}
)
]
@server.call_tool()
async def call_tool(name, arguments):
if name == "get_weather":
city = arguments["city"]
# 这里调真实的天气API
return [types.TextContent(
type="text",
text=f"{city}今天晴,25°C,东南风3级"
)]
这段代码定义了一个天气查询工具。任何支持MCP的AI应用——Cursor、Claude Code、Claude Desktop——都能直接调用它。你不需要为每个应用写适配代码。
为什么是MCP赢了
说实话,MCP在技术上并没有什么革命性突破。OpenAI的function calling也能做类似的事。那为什么MCP成了事实标准?
我觉得有三个原因。
第一,开放性。MCP从一开始就是开源的,规范文档公开,任何人都可以实现自己的MCP server和client。OpenAI的function calling虽然也好用,但它绑定在OpenAI的API上。你想用Claude的模型?对不起,格式不一样。MCP跟模型无关,你底层用什么模型都行。
第二,Anthropic自己先用起来了。Claude Code在2025年初就全面支持MCP,而且Anthropic官方维护了一批高质量的MCP server(文件系统、Git、数据库、浏览器等)。这些server不是demo,是真的能用在生产环境里的。有了"官方参考实现",社区跟进就快了。
第三,时机对了。2025年下半年到2026年上半年,正好是AI Agent从概念落地到实际产品的窗口期。大家都在找一个标准的工具调用方案,MCP刚好在对的时间提供了对的东西。
MCP生态现在什么样
截至2026年6月,MCP的生态已经相当丰富了。几个数字:
GitHub上搜索"MCP server",有超过8000个仓库。官方的modelcontextprotocol/servers仓库收录了约100个高质量server,涵盖数据库(PostgreSQL、MySQL、SQLite)、版本控制(Git、GitHub、GitLab)、文件系统、浏览器自动化、云服务(AWS、GCP、Azure)等。
社区贡献的server更多。有人做了微信MCP server,让AI能读微信聊天记录。有人做了Spotify MCP server,让AI能控制音乐播放。有人做了Home Assistant MCP server,让AI能控制智能家居。甚至有人做了魔兽世界的MCP server——虽然我不确定这有什么实际用途。
在客户端侧,支持MCP的AI应用已经遍地开花:
| 应用 | MCP支持情况 |
|---|---|
| Claude Code | 全面支持,原生集成 |
| Cursor | 支持,通过.mcp.json配置 |
| VS Code + Copilot | 2026年3月起支持 |
| Windsurf | 支持 |
| Dify | 支持,可视化配置 |
| Coze | 支持 |
| OpenAI Agents SDK | 2026年4月起支持 |
连OpenAI都开始支持MCP了,这基本说明大局已定。
怎么自己写一个MCP server
如果你有自己的数据源或工具,想让AI能调用,写一个MCP server其实很简单。以Python为例,装一个mcp包就够了。
# 安装
pip install mcp
# 一个实际的例子:让AI能查你的待办事项
import json
from mcp.server import Server
from mcp.server.stdio import stdio_server
import mcp.types as types
server = Server("todo-server")
# 读取待办事项数据文件
TODO_FILE = "/path/to/todos.json"
def load_todos():
try:
with open(TODO_FILE, 'r') as f:
return json.load(f)
except FileNotFoundError:
return []
@server.list_tools()
async def list_tools():
return [
types.Tool(
name="list_todos",
description="列出所有待办事项",
inputSchema={"type": "object", "properties": {}}
),
types.Tool(
name="add_todo",
description="添加一条待办事项",
inputSchema={
"type": "object",
"properties": {
"content": {"type": "string", "description": "待办内容"},
"priority": {"type": "string", "enum": ["high", "medium", "low"]}
},
"required": ["content"]
}
)
]
@server.call_tool()
async def call_tool(name, arguments):
if name == "list_todos":
todos = load_todos()
return [types.TextContent(type="text", text=json.dumps(todos, ensure_ascii=False))]
elif name == "add_todo":
todos = load_todos()
todos.append({
"content": arguments["content"],
"priority": arguments.get("priority", "medium"),
"done": False
})
with open(TODO_FILE, 'w') as f:
json.dump(todos, f, ensure_ascii=False, indent=2)
return [types.TextContent(type="text", text="已添加")]
async def main():
async with stdio_server() as (read, write):
await server.run(read, write, server.create_initialization_options())
if __name__ == "__main__":
import asyncio
asyncio.run(main())
然后在Cursor的.cursor/mcp.json或者Claude Desktop的配置文件里加上这个server的路径,AI就能直接调用了。
整个过程不超过30分钟。如果你有内部系统(CRM、ERP、工单系统),写一个MCP server让AI能直接查询和操作,比自己从零搭一个Agent系统快得多。
MCP的局限
MCP不是万能的。几个实际问题:
安全问题。MCP server如果暴露了敏感操作(比如删除数据、转账),AI可能会在不恰当的时候调用。目前MCP规范里的权限控制还比较粗糙,主要靠客户端侧的确认机制。在生产环境用,你得自己加鉴权和审计。
性能问题。每个MCP server是一个独立进程(stdio模式)或独立服务(HTTP模式)。如果你同时挂了20个MCP server,启动时间和内存占用都不小。我在一个项目里同时用了15个server,Claude Code的启动时间从2秒变成了15秒。
质量参差不齐。社区贡献的MCP server质量差距很大。有些写得很规范,错误处理完善,文档清楚。有些基本就是个demo,跑起来各种bug。用之前最好看看star数和最近更新时间。
对开发者意味着什么
如果你是开发者,MCP的影响是这样的:
第一,你写的工具能被更多AI应用调用了。以前你写了一个数据库查询工具,只能在自己框架里用。现在你把它封装成MCP server,Cursor、Claude Code、VS Code的用户都能直接用。分发渠道一下子打开了。
第二,"AI能调用什么"这件事正在标准化。以前每个AI应用的工具调用方式都不一样,开发者要适配很多种格式。现在有了MCP,你只需要适配一种格式。这降低了AI工具生态的碎片化。
第三,AI应用的"能力边界"在快速扩展。有了MCP,AI能做的事情不再局限于文本生成。它能读你的代码库、查你的数据库、操作你的浏览器、控制你的智能家居。这个边界还在不断扩大。
如果你想快速体验不同模型在MCP场景下的表现,可以用SevenFa的操练场,支持GPT-4o、Claude、DeepSeek等多个模型切换,测试不同模型在工具调用场景下的差异。
接下来会发生什么
MCP规范目前是0.6版本,还在快速迭代。几个值得关注的方向:
远程MCP server的标准化。现在stdio模式用得最多,但远程HTTP模式的规范还不够完善。Anthropic在推"Streamable HTTP"传输方式,想让MCP server能像普通HTTP API一样部署和调用。这会大幅降低MCP server的部署门槛。
MCP server的发现和分发。现在找MCP server基本靠GitHub搜索和社区推荐。未来可能会有类似npm或MCP Marketplace的东西,让你能一键安装和管理MCP server。
安全性增强。MCP规范在讨论加入更细粒度的权限控制,比如只允许AI读数据不允许写,或者限制某些操作需要人工确认。这对企业级应用很关键。
总的来说,MCP正在把"AI能调用外部工具"这件事从每个应用自己搞一套,变成整个行业共享一套标准。这个方向是对的,而且进展比预期快。