MCP 是什么?给开发者的完整指南
MCP 是什么?给开发者的完整指南
看完这篇,你会知道 MCP 解决了什么问题、它怎么运转,以及如何用一个真实 bug 案例理解它的价值。
一、你有没有遇到过这种场景
页面有个 bug,筛选功能点了没反应。
你把代码粘给 AI,AI 分析了一番,说「可能是事件绑定的问题」。你改了,没用。AI 又说「可能是异步时序」。你又改了,还是没用。
来回三四次之后,你关掉对话窗口,自己一行行 debug。
AI 不是不聪明,是它根本没看到你的程序在运行时发生了什么。
它只能看代码,看不到:
- 浏览器控制台里有什么报错
- 筛选操作有没有真正发出网络请求
- 请求参数是不是传对了
- 页面 DOM 结构和代码对不上
这是一堵墙。AI 在墙这边,你的运行环境在墙那边。
MCP 就是在这堵墙上开了一扇门。
┌─────────────────────────────────────────────────────────┐
│ 没有 MCP 有了 MCP │
│ │
│ AI │墙│ 运行环境 AI ←→ MCP ←→ 运行环境 │
│ │ │ │
│ 只能猜代码里的问题 能真正操作浏览器、读日志、查请求 │
└─────────────────────────────────────────────────────────┘
二、MCP 到底是什么
MCP(Model Context Protocol) 是 Anthropic 在 2024 年发布的开放协议。
一句话:
MCP 是一套标准,让 AI 能调用外部工具,获取真实世界的信息和操作能力。
注意几个关键词:
- 标准:不是某家公司的私有实现,任何人都可以按规范写工具
- 外部工具:文件系统、数据库、浏览器、API、Git……只要写了对应的 MCP Server,AI 都能用
- 真实世界:不是让 AI 凭代码猜测,而是让它真的去执行、去读数据、去操作界面
MCP 之于 AI 工具,就像 USB 之于外设——接口统一了,工具即插即用。
三、没有 MCP 之前有多痛
假设要给 AI 接入三个能力:读文件、查数据库、调 GitHub API。
大概会这样写:
# 每个能力单独定义一套 Function Call 格式
tools = [
{"name": "read_file", "parameters": {...}},
{"name": "query_db", "parameters": {...}},
{"name": "github_pr", "parameters": {...}},
]
# 还要写 dispatch 逻辑,每加一个工具就要改这里
def handle_tool_call(name, args):
if name == "read_file": ...
elif name == "query_db": ...
elif name == "github_pr": ...
问题接踵而来:
- 换个 LLM(Claude → GPT),工具定义格式不同,全部要重写
- 你写的工具,同事没法直接用,各自重复造轮子
- 工具越来越多,dispatch 越来越乱,维护地狱
MCP 解决这些问题的方式很直接:定一套所有人都遵守的格式。
工具按 MCP 标准写一次,任何支持 MCP 的 AI 应用都能用。
四、MCP 的三个角色
┌──────────────────────────────────────────────┐
│ Host(宿主应用) │
│ VSCode / Claude Desktop / 你自己写的 App │
│ │
│ MCP Client(内置) │
│ 负责和 Server 通信 │
└──────────────────┬───────────────────────────┘
│ JSON-RPC 协议
┌─────────┼──────────┐
▼ ▼ ▼
Playwright GitHub 数据库
MCP Server Server Server
│ │ │
真实浏览器 GitHub API PostgreSQL
| 角色 | 是什么 | 你需要关心吗 |
|---|---|---|
| Host | 运行 AI 的应用 | 用现成的即可(VSCode、Claude Desktop) |
| MCP Client | Host 内置的协议客户端 | 不需要自己写 |
| MCP Server | 对外暴露工具的服务 | 这是你主要关心的 |
一次完整调用的过程:
① 你提问
② AI 推理:需要查网络请求
③ AI 输出结构化指令 → { "tool": "browser_network_requests" }
④ Host 通过 MCP Client 发给 Playwright Server
⑤ Server 真正执行,返回结果
⑥ AI 拿到结果,继续推理下一步
↻ 循环,直到任务完成
AI 自己不打开浏览器。 AI 只是"说"要做什么,MCP Server 去真正执行。
五、实战案例:用 Playwright MCP 在 VSCode 里调试 bug
场景
前端「出版商筛选」功能点了没反应,用户反馈 bug。
环境准备:
- VSCode + GitHub Copilot(需开通,支持 Agent 模式)
- 前端项目运行在
localhost:3000
第一步:配置 Playwright MCP Server
在项目根目录创建 .vscode/mcp.json:
{
"servers": {
"playwright": {
"command": "npx",
"args": ["@playwright/mcp@latest"],
"type": "stdio"
}
}
}
保存后,文件上方出现 Start 按钮,点击启动。
用命令面板(Ctrl+Shift+P)输入 MCP: List Servers,看到状态为 Running 即成功。
没有 Chrome?加参数切换到 Edge:
"args": ["@playwright/mcp@latest", "--browser", "msedge"]
这个文件可以提交到 Git,团队所有人拉代码后自动获得相同配置,不需要每个人单独配置。
第二步:切到 Agent 模式,描述问题
打开 Copilot Chat,输入框下拉选 Agent,然后直接描述:
我的项目运行在 http://localhost:3000
页面右上角有一个「出版商」下拉筛选菜单
选择任意出版商后,下方书籍列表没有变化
请帮我:
1. 打开页面,实际操作筛选菜单,确认 bug 存在
2. 检查有没有控制台报错
3. 检查有没有发出筛选相关的 API 请求
4. 找到原因并修复,修复后再次验证
第三步:AI 的完整调试过程
下面是 AI 实际触发的 6 步工具调用——每一步都是真实发生的,不是 AI 在猜。
① 打开页面 — browser_navigate
AI 第一步先把页面打开,确认能正常访问,不做任何假设。
调用:browser_navigate
参数:{ "url": "http://localhost:3000" }
返回:{ "status": "success", "title": "书城 | 首页" }
② 读取页面结构 — browser_snapshot
AI 看到的不是截图,而是结构化的无障碍元素树,能精确定位每个元素。
返回(元素树片段):
combobox "出版商"
option "人民文学出版社"
option "中信出版集团"
option "商务印书馆"
因为是元素树而不是截图,就算页面样式大改,AI 依然能找到正确元素。
③ 操作筛选菜单 — browser_click
模拟用户点开下拉菜单,选中「人民文学出版社」,和真实用户操作完全一致,这是复现 bug 的关键一步。
调用 1:browser_click → combobox "出版商"
调用 2:browser_click → option "人民文学出版社"
返回:操作成功
④ 查网络请求 — browser_network_requests(关键发现)
选了出版商之后,AI 检查所有网络请求记录:
GET /api/books ← 初始加载(正常)
(筛选后,无任何新请求)
只有一条初始加载,筛选操作之后没有任何新请求发出。
结论锁定:问题一定在前端逻辑,和后端无关,不用去查 API。
⑤ 看控制台 — browser_console_messages
返回:(无任何报错)
没有 JS 报错,说明代码没有崩溃,只是逻辑没走到「发请求」那一步。
范围进一步缩小:事件触发了,但事件处理函数本身有问题。
⑥ 定位代码,找到根源
AI 翻查 FilterPanel.vue,找到问题:
// 有问题的代码
onFilter(val) {
this.filter = val
// 漏了这一行:
// this.fetchBooks()
}
onFilter 只更新了本地状态,但忘记调用 fetchBooks() 重新拉数据。
修复后,AI 用 Playwright 再验证一次:
GET /api/books?publisher=人民文学出版社 ← 出现了
筛选请求正常发出,列表正确更新,bug 修复,全程闭环。
这个过程里,MCP 做了什么
把上面的流程拆开:
你(自然语言)
→ AI(推理:下一步需要什么工具)
→ Function Call(结构化指令)
→ MCP Client(转发)
→ Playwright MCP Server(真正执行)
→ 真实浏览器
→ 返回结果 → AI 继续推理
↻ 循环
MCP 在中间做的三件事:
- 标准化:AI 输出通用格式,不管底层是 Playwright 还是其他工具,格式一样
- 隔离:AI 不直接操作浏览器,Server 负责执行,AI 只管思考
- 可插拔:今天用 Playwright 调浏览器,明天换数据库 Server,AI 的调用方式完全相同
六、Playwright MCP 能做什么
| 工具名 | 能力 |
|---|---|
browser_navigate |
打开 URL,前进/后退 |
browser_snapshot |
读取页面无障碍结构树 |
browser_click |
点击元素 |
browser_type |
输入文字,填写表单 |
browser_network_requests |
查看所有网络请求记录 |
browser_console_messages |
读取控制台输出 |
browser_screenshot |
截取当前页面 |
浏览器里人能做的事,AI 通过 Playwright MCP 基本都能做。
七、一句话记住 MCP
AI 之前只有大脑,没有手脚和感官。
MCP 给 AI 装上了手脚——操作浏览器、读数据库、调 API。
而且这双手是标准接口,任何工具都能接上去。
八、还能接什么
理解了 MCP 的工作方式,你会发现能接的东西远不止浏览器:
| MCP Server | AI 获得的能力 |
|---|---|
@modelcontextprotocol/server-filesystem |
读写本地文件 |
@modelcontextprotocol/server-github |
查 PR、Issue、提交记录 |
@modelcontextprotocol/server-postgres |
查询数据库 |
@playwright/mcp |
操作浏览器、截图、读网络请求 |
| 你自己写的 Server | 任何你想给 AI 的能力 |
不需要全部从头写,社区已有大量现成的 MCP Server,大多数场景直接拿来用。
更多推荐


所有评论(0)