MCP,全称 Model Context Protocol(模型上下文协议),主要应用于 AI 相关的工作流。
其实,这个概念已经出现挺久的了,但我一直没太悟透它的精髓。为了提升工作效率,我最近在 Cursor中大量使用 MCP,并积攒了一些粗浅的经验和感受,如下。写得不成熟的地方,还望家人们不吝斧正。
MCP的故事
纵观行业发展,规律高度一致:需求催生厂商,群雄逐鹿之后,头部企业共同敲定统一标准。花开两朵,各表一枝。
第一枝,先聊硬件设备接口。 我们手边五花八门的数据线,就是一部接口标准化历史:USB-A (1996) → Mini-USB → Micro-USB (2007) → Lightning (苹果私有) → Type-C (2014 至今)。 历经近 30 年竞争,物理接口最终固化为 Type-C,完成消费电子 “书同文,车同轨”。只是硬件定型后,USB4、雷电、PD 供电这类上层协议还在持续迭代。

另一枝,正是本文主角:MCP 协议。 它的演进路径和硬件接口如出一辙。2023–2024 年大模型爆发,但有一个无解困境:GPT、Claude 被禁锢在训练数据中。想要对接本地文件、GitHub、Slack,每新增一个数据源,就要从零开发一套对接代码。 M 个模型 × N 个外部工具 = M×N 套胶水集成,开发者陷入重复劳动,大模型始终被困在信息孤岛。
转机来自 Anthropic 工程师 David Soria Parra。他在用 Claude Desktop 开发时,总要来回在 IDE 与软件之间复制代码,不由得思考:既然模型能读懂代码,为什么不能自主读取本地资源? 他曾深度参与微软 LSP 语言服务器协议的设计。当年 IDE 与编程语言之间也是 M×N 的混乱生态,LSP 用一套统一协议,把复杂度从 M×N 降到 M+N,一统编辑器生态。 他立刻意识到:AI 模型调用外部工具,本质就是新一代的 “编辑器 — 服务端” 问题。
他和同事一拍即合:借鉴 LSP 思想,设计一套开放协议,依靠 JSON-RPC 标准化接口,打通大模型与外部数据、工具,MCP 就此诞生。 在内部黑客松验证后,团队给 Claude Desktop 批量接入各类工具,整体体验提升巨大。

MCP的演进
2024 年 11 月 25 日,Anthropic 正式发布公告,将 Model Context Protocol(模型上下文协议) 开源。并配了 Python/TypeScript SDK,还预置了 Google Drive、Slack、GitHub、Postgres 等 MCP Server。
后来 Block、Zed、Replit、Sourcegraph 跟进,2025 年 OpenAI 也宣布支持,MCP 从 Anthropic 的“私器”变成行业准标准,2025 年底捐给 Linux 基金会下的 Agentic AI Foundation,彻底中立化。截至 2026 年中,主流玩家已全部原生支持 MCP。
| |
|---|
| Claude Desktop / Claude Code 原生,MCP 首发方 |
| ChatGPT 桌面端 + Agents SDK 原生接入 |
| Gemini / Vertex AI / Chrome DevTools MCP Server |
| GitHub Copilot / VS Code MCP 扩展 |
| Cursor、Windsurf、Zed、Neovim、Replit 均原生 |
| 阿里云 ModelScope、腾讯、蚂蚁、百度均已接入 |
MCP 在"AI 连接外部工具/数据源"这个场景,已经是业界公认的事实标准(de facto standard),并且正在向正式开放标准过渡。
MCP 由什么组成
Host(应用)通过 Client(中介)连 Server(工具),用 JSON‑RPC 跑 Tools / Resources / Prompts 三类能力。拆开就是:
● 角色:Host(Cursor/Claude)←Client→ Server(文件/GitHub/DB)
● 能力:Tools(执行)、Resources(只读)、Prompts(模板)
● 通信:JSON‑RPC,本地走 stdio,远程走 HTTP/SSE

MCP解决了什么
它解决了“怎么说话”和“说什么”的问题:
● 统一方言:基于 JSON-RPC 2.0,全行业共用一套通信标准;
● 统一接口:无论是查数据库还是读文件,都被规范为 Tools / Resources / Prompts;
● 稳定内核:协议层一旦定型绝不乱改,给两端的开发者留出最大的创新空间。
实操
1. 工具插件
填写配置,这个AI编辑器是cursor,其他竞品也类似。

添加MySQL配置
local-mysql8 是本地数据库配置。
{"mcpServers": {"local-mysql8": {"command": "npx","args": ["-y","@f4ww4z/mcp-mysql-server","--host", "127.0.0.1","--port", "3307","--user", "root","--password", "password","--database", "journal" ] },"mcp-hello": {"command": "/Users/wuxian/.pyenv/shims/python3","args": ["/Users/wuxian/Desktop/codes/mcp-hello-py/src/server.py" ] } } }
mcp-hello 是本地 mcp 服务器。注意第二个红框,通过 mcp 能马上识别其中的 tools

氛围编程
下图是我与cursor的对话。手动写 SQL 查询和氛围编程调用 MCP 结果表现一致,如下图

2. 智能体调用
服务端
一个简单mcp服务器,用于学习原理
#!/usr/bin/env python3"""Simple Hello MCP Server功能:姓名英文问候,支持Tools/Resources/Prompts,提供Streamable HTTP与健康检查接口传输方式:stdio / streamable-http"""import sysimport osfrom mcp.server.fastmcp import FastMCPfrom mcp.server.transport_security import TransportSecuritySettingsfrom starlette.responses import JSONResponse, PlainTextResponse# 初始化MCP服务mcp = FastMCP( name="mcp-hello", instructions="接收姓名并用英语打招呼", stateless_http=True, json_response=True, host="0.0.0.0", transport_security=TransportSecuritySettings(enable_dns_rebinding_protection=False),)# 工具:单人问候@mcp.tool()defsay_hello(name: str) -> str:ifnot name.strip():return"Hello!"returnf"Hello, {name}!"# 工具:多人问候@mcp.tool()defsay_hello_multiple(names: list[str]) -> str:ifnot names:return"" lines = [f"• {say_hello(name)}"for name in names]return"\n".join(lines)# 资源文档@mcp.resource("docs://hello/readme")defget_readme() -> str:return"""# Hello MCP Server Documentation## 可用工具### say_hello参数: name(string)返回: Hello, {name}!### say_hello_multiple参数: names(string[])返回多条带项目符号的问候## 接口/mcp MCP协议入口/health 健康检查"""# 提示词模板@mcp.prompt()defgreeting_message(recipient: str) -> str: greeting = say_hello(recipient)returnf"""以{greeting}开头,给{recipient}写3-5句亲切礼貌的问候消息"""# 自定义路由@mcp.custom_route("/health", methods=["GET"])asyncdefhealth_check(request):return JSONResponse({"status": "healthy", "service": "mcp-hello", "version": "1.0.0"})@mcp.custom_route("/", methods=["GET"])asyncdefroot(request):return PlainTextResponse("MCP Hello Server\n/mcp MCP入口\n/health 健康检查")# HTTP服务启动defrun_http_server(): port = int(os.environ.get("PORT", 8080)) mcp.settings.port = port print(f"服务启动于 0.0.0.0:{port}") mcp.run(transport="streamable-http")# 主入口defmain():if"--http-stream"in sys.argv: run_http_server()else: mcp.run(transport="stdio")if __name__ == "__main__": main()
客户端
顺手写个客户端,实际项目中这个客户端是嵌在 agent 中的
import jsonimport urllib.requestMCP_URL = "http://localhost:8080/mcp"defrpc(request):"""发送一个 JSON-RPC 请求""" req = urllib.request.Request( MCP_URL, data=json.dumps(request).encode(), headers={"Content-Type": "application/json"}, )with urllib.request.urlopen(req) as resp:return json.load(resp)defmain():# 1. 初始化 init_req = {"jsonrpc": "2.0","id": 1,"method": "initialize","params": {"protocolVersion": "2024-11-05","clientInfo": {"name": "minimal-client", "version": "1.0.0"}, }, } init_resp = rpc(init_req) print("✅ initialize:") print(json.dumps(init_resp, indent=2))# 2. 查询工具列表 list_req = {"jsonrpc": "2.0","id": 2,"method": "tools/list", } list_resp = rpc(list_req) print("\n✅ tools/list:") print(json.dumps(list_resp, indent=2))# 3. 调用say_hello工具 call_req = {"jsonrpc": "2.0","id": 3,"method": "tools/call","params": {"name": "say_hello","arguments": {"name": "World"}, }, } call_resp = rpc(call_req) print("\n✅ tools/call(say_hello):") print(json.dumps(call_resp, indent=2))if __name__ == "__main__": main()
示例
下面是postman模拟客户端调用 mcp服务器的例子
总结
MCP 本质就是 AI 时代的 Type‑C 接口:一套标准协议,让大模型无需定制开发,就能任意调用本地文件、数据库、第三方 API,彻底终结 M×N 的重复集成工作。
在标准上,MCP 已经是一种工程实践标准:
- 端点只有一个 http://localhost:8080/mcp,类似 GraphQL;
- 动作上就 3 种核心操作——initialize、tools/list、tools/call;
- 协议上,就是一个 json-rpc格式包装。MCP 选中它,主要是因为它的生态成熟、兼容性好、稳定性强。
至此,MCP 就讲完了。我对它的理解,就像美国汉堡包 vs 陕西肉夹馍——本质都是两块饼夹块肉;或者说,它是AI圈的 RPC。体验上,就是标准化、模块化的连接,让 AI 智能体能“即插即用”。