如果你过去半年里试过让 AI 帮你操作浏览器、抓取页面数据、跑一轮接口回归,大概率遇到过这样的尴尬场景:模型倒是很懂,但手不够长。你让它打开某个页面截图,它只能甩给你一段 Playwright 代码;你让它查一下线上服务的报错日志,它建议你先 SSH 上去再 grep。剩下的动作得你自己去终端里执行,再把输出粘回来喂给它。问题不在模型的智商,而在于我们给它的“工具接口”还是几十年前那套命令行。
CLI 当然不会死,但 AI 时代的工具接口正在悄悄换赛道。MCP(Model Context Protocol,模型上下文协议)的出现,把“工具接口”从一段文本命令,升级成一套有 schema、有状态、可远程调用的协议体系。这篇文章我会从 CLI 为什么长期是默认答案讲起,再拆 MCP 的协议设计,最后落到真实的选型、配置和踩坑经验。如果你正在做 AI Agent 集成、IDE 插件,或者只是想让 AI 助手真正帮你干点活,这篇应该能给你一些参考。
1. 命令行能成为“默认接口”,靠的是三十年沉淀下来的 Unix 哲学
1.1 从管道到 AI:文本就是最好的中间语言
CLI 的底子是 Unix 那套“一个命令只做一件事,输出永远是文本流”的设计。ls | grep log这种管道写法,本质上是在说:“前一个程序的输出,可以直接变成后一个程序的输入。”这个哲学有一个被忽略的好处:文本是人和机器之间最好的交换格式,不需要解析二进制、不需要理解内存布局,谁都能读、谁都能写。
LLM 本身就是一个纯文本输入输出的系统,所以当 AI 要调用工具时,CLI 天然是最小摩擦的选择。模型生成git diff、curl https://api.example.com/data,人类看到的就是一串字符串,没有任何结构化包袱。这也是为什么最早一批 AI 编程工具都倾向于让模型直接操作终端——成本最低,兼容性最好,几乎不需要为某个工具单独写适配层。
我一开始做 AI 自动化时也是这么干的:让模型写 shell 脚本,我用 Bash 执行,再把 stdout/stderr 贴回去。对一次性任务来说,这套流程够用,甚至很顺。
1.2 但 CLI 的能力描述是残缺的:模型需要“说明书”而不是“帮助文本”
CLI 真正的问题出现在模型需要自己发现工具的时候。人类可以读man ffmpeg,翻 8000 行参数说明,然后挑出自己需要的那几个 flag。LLM 也能读,但读起来非常痛苦——帮助文本的结构不统一、参数之间耦合关系复杂、错误信息也不够结构化。
举个例子:你让 AI 用 ffmpeg 把一段视频转成 HLS 流,模型可能会生成这样的命令:
ffmpeg -i input.mp4 -codec copy -start_number 0 -hls_time 10 -hls_list_size 0 -f hls output.m3u8看着合理,但如果你不告诉它输入文件的编码格式、目标服务器的网络环境,它可能漏掉-hls_playlist_type vod这类和播放器兼容性强相关的参数。问题不在于模型笨,而在于 CLI 这个接口根本不蕴含“能力描述”。命令名、参数名、帮助文本,全得靠模型自己猜,猜错了只能来回试。
MCP 要解决的第一个痛点就是这个:工具不仅要能被“调用”,还要能被“描述”。模型在决定调用之前,应该先拿到一份结构化的、机器可读的工具说明书:这个工具叫什么、需要哪些参数、参数类型是什么、返回什么结构。这就像从“看黑板上的手写通知”升级到“给你一份带字段说明的 API 文档”。
1.3 中间状态无处安放:CLI 的每次调用都是一次“失忆”
CLI 的另一个根深蒂固的问题是进程状态隔离。每次执行命令都是一个新的进程,环境变量、工作目录、历史输出、session 上下文,统统不保留。人用起来无所谓,因为我们的大脑会记住“刚才我 cd 到了哪个目录”“上一次 curl 返回了什么”。但模型没有这个记忆能力——它只能看到当前这轮对话的上下文,而且这上下文还得靠外部拼凑。
真实场景里,这意味着 AI 执行一个多步任务时,所有中间产物都得落到文件里。比如:先让模型写一个爬虫脚本,执行完把结果存到result.json,然后再让模型读result.json做分析。听起来没问题,但一旦任务变成“抓取 10 个页面的数据,每个页面抓完判断下一步去哪”,这条链路会瞬间爆炸——每一步都需要根据上一步的结果决定下一步参数,而 CLI 只能通过“人把输出粘回去”的方式把信息喂回给模型。
我最早做端到端测试时就是这么被坑的。让 AI 帮我在浏览器里走一遍用户注册流程,它生成一段 Cypress 脚本,执行报错,我把报错贴给它,它改脚本,我再跑。一轮、两轮、三轮……人变成了数据传输管道。效率全耗在复制粘贴和等待上了。
1.4 各种“AI CLI 包装器”:看到了希望,也暴露了天花板
后来出现了 Codex CLI、Trae CLI、GitLab CLI 这类产品,本质上是给模型套了一层终端外壳,让 AI 自己能执行命令、捕获输出、继续推理。这个方向是对的,但我用了之后明显感觉还是隔着一层:模型依然拿不到“工具能做什么”的结构化信息,只能靠命令文档和试错。
比如你在 Codex CLI 里让它“帮我查一下 gitlab 项目的 CI 状态”,它可能需要先拼glab ci status这个命令,但如果你没告诉它 GitLab 实例的域名、token 的环境变量名,它就得反复踩坑。CLI 外壳只是把“人类执行命令”换成了“AI 执行命令”,但接口范式的根本问题——描述能力、状态管理、远程通信——一个都没解决。
所以,与其说 MCP 是在取代 CLI,不如说是把 CLI 里那些藏在命令参数背后的语义,显式地变成了机器可读的协议。
2. MCP 到底改了什么:从“文本命令”升级为“能力描述 + 上下文交换”
2.1 为什么会有人想做一套“工具的 HTTP”?
这个问题的答案藏在各家模型厂商的重复劳动里。2024 年底 Anthropic 开源 MCP 之后,我第一反应是:这不就是给工具调用定了个标准吗?后来才发现,标准的价值远远大于“方便”两个字。
以前每家 AI 工具都在自己造轮子:给 Claude 做工具调用要自己写 JSON Schema,给 GPT 做要按 OpenAI function calling 的格式,给开源模型做可能又要适配不同的 prompt 约定。如果你同时要接多个模型,就得写好几套适配层,每套适配层还只能暴露你预先定义好的那几种工具。MCP 做的事,是把这个适配过程标准化了:能力如何描述、请求如何发送、结果如何返回,都变成一套公开协议。
类比一下:CLI 是“打电话给客服”,你每次都要把自己的需求描述一遍,客服可能还要转接几个部门;MCP 是“给你发一张有标准字段的表单”,你填完提交,后台自动路由处理,不需要解释流程。协议层一旦统一,上面的应用层就可以随便长。
2.2 三个核心原语:tools、resources、prompts 分别解决什么问题
MCP 的定义其实不复杂,核心就三个原语:
- tools(工具):可执行的动作,类似于 API 端点。比如“打开网页”“发送 HTTP 请求”“执行 SQL”“给指定手机号发短信”。tools 必须有 schema,描述参数和返回值,模型根据这些描述决定是否调用。
- resources(资源):可读取的数据对象,类似于“文件系统的文件”或“数据库的一行记录”。resources 不需要执行动作,只需要提供数据给模型读。典型的例子:当前打开的文件内容、某台服务器的日志、某个项目的配置信息。
- prompts(提示词模板):可复用的指令模板,让模型知道“这个任务应该怎么拆解”。比如“生成单元测试”这个 prompt 可能包含断言风格、测试框架选择、覆盖率要求等预设指令。
这三者合起来,正好覆盖了 AI 干活时的三类需求:要做什么(tools)、要看什么(resources)、该怎么做(prompts)。说实话这个划分并不复杂,但它解决了 LLM 工具调用的一个致命问题——模型终于有了一个标准化的“信息获取 + 动作执行”闭环,而不是只能依赖人类在对话里贴代码和日志。
2.3 协议的细节:JSON-RPC 2.0 加上灵活的传输层
MCP 的底层通信用的是 JSON-RPC 2.0。这是很老牌的协议,选它而不是 REST 的原因也很实际:模型调用工具时,需要的是“一次性请求-响应”,不需要 REST 那套资源路径、状态码、幂等性设计;JSON-RPC 的方法名加参数字段足够简单直接,适合嵌入 LLM 推理流程。
一次典型调用长这样:
{ "jsonrpc": "2.0", "method": "tools/call", "params": { "name": "get_stock_price", "arguments": { "code": "000001" } }, "id": 1 }返回结果也遵循同一套结构,把执行结果、错误信息、结构化数据包成一个 JSON 对象返回给客户端。模型拿到这个对象后,可以直接把它纳进上下文继续推理,不需要像 CLI 那样解析 stdout。
传输层有三种主流模式:stdio(本地进程内通信,适合和 IDE、本地工具配对使用)、Streamable HTTP + SSE(适合远程 http 服务但只能服务端单向推送)和WebSocket(wss)(真正支持双向实时通信,也是现在远程 MCP server 的主流形态)。远程 MCP server 的地址通常长得像wss://your-server/mcp?token=xxxxx,握手阶段完成鉴权,后续的请求和推送都走同一条连接。
到这一步,MCP 已经和 CLI 有了本质区别:CLI 是“传一段文本,拿回一段文本”,MCP 是“传一个结构化请求,拿回一个结构化结果”,而且模型在调用前就能看到工具 schema。对 LLM 来说,这就像从“只有纸质说明书”升级到了“有标准 API 文档+自动代码补全”。
2.4 生态现状:我看到 MCP 已经渗透到了各种意想不到的场景
聊到生态我比较兴奋,因为最近几个月 MCP server 的数量增长非常快,而且覆盖的领域远超“让 AI 帮我写代码”。
- 浏览器自动化:Playwright MCP、Chrome DevTools MCP,可以让 AI 自己控制浏览器,读取 DOM,执行 JS,甚至分析性能数据。
- 安全测试:Trae IDE 搭配 Burp Suite MCP Server,可以让模型直接驱动抓包工具,自动分析请求和响应。
- DevOps 场景:GitLab 除了传统 CLI 之外也出了 MCP,模型可以创建 MR、查看 pipeline 状态、触发 CI。
- 业务系统:有团队把同花顺行情接口包成 MCP,AI 可以直接查股票、看行情;还有人在 RuoYi-Vue-Pro 这类后台管理系统里合并了 MCP 功能,让 AI 能直接操作后台的 CRUD 接口。
- 游戏和三维:Unity MCP 也出来了,模型可以读取场景对象、修改组件参数。
如果说 2023 年大家还在争论“该用 function calling 还是 ReAct”,2025 年已经变成了“你的项目接入 MCP 了吗”。标准一旦形成,迁移成本会急剧下降,因为任何人只要写一个 MCP server,理论上就能被任何支持 MCP 的客户端使用——Claude Desktop、Cursor、Cline、甚至你自己写的 Agent 框架。
3. 同一个任务,用 CLI 和 MCP 做一遍,差别在“谁在回路里”
3.1 任务设定:抓取一个页面里的外链并做分类统计
为了不空谈,我拿一个真实做过的任务来对比。任务是:让 AI 助手打开某个文档站点的首页,找出页面上所有外链(a 标签的 href 属性),按“指向站内”“指向外部站点”“指向社交平台”三类做统计,最后输出一张汇总表。
这个任务看起来简单,但对工具的依赖很强:要打开页面、要等待 JS 渲染完成、要提取 DOM、要做字符串分类。用不同接口范式做,过程完全不一样。
3.2 用 CLI 跑:AI 当“编剧”,人当“跑腿”
CLI 路径是这样的:我先让 AI 写一个 Python 脚本,用 requests 加 BeautifulSoup 去抓页面。AI 写完之后,我在终端执行,发现页面是 React 渲染的,requests 拿不到最终 DOM。我把空输出贴回给 AI,它会建议改用 Playwright,我再执行一遍新的脚本。执行中发现某些链接是相对路径,需要拼接域名;某些外链有rel=noopener但统计逻辑里没考虑;还有登录才能看到的动态内容,脚本直接 403。每一轮都要“人执行-人贴结果-人再执行”。
整套流程下来,大概跑了五轮。每轮失败的原因都是模型在生成代码时无法直接感知真实页面结构,只能靠“猜”和“试”。人作为数据传输管道的角色,被无限放大了。CLI 的好处是每一步都可控,坏处是每一步都要人肉参与,AI 永远没法真正“自己完成”一个长链路任务。
3.3 用 MCP 跑:AI 自己导航、自己改错、自己收尾
换成 Playwright MCP server 之后,整个体验变了。我对助手说的指令很简单:“打开这个文档站首页,找出所有 a 标签的 href,按站内、外部、社交分类统计,输出表格。”
AI 会先把打开浏览器这个动作映射到 MCP 的browser_navigate工具上,它会感知到页面加载完成;然后调用browser_get_dom或browser_evaluate来抓取 DOM 里的信息。如果第一步它选错了选择器,拿回来的数据是空的,它会根据上下文自己调整:先看看页面结构,再重新提取。所有中间状态都保留在同一会话里,模型始终知道自己“刚才做了什么、现在看到了什么”。
我对比了一下两边的产出质量:CLI 方案最后也完成了任务,但每一步都要我介入,总共花了约 20 分钟;MCP 方案在无人干预的情况下,大约 3 分钟就给出了统计表,而且它还能顺带解释分类的逻辑依据。我知道有人会说这是因为 Playwright MCP 封装好了,但这恰恰就是范式差异——工具能力不再靠“让 AI 自己拼命令”,而是直接以结构化 schema 暴露给模型。
3.4 差异的本质:CLI 是“异步回路”,MCP 是“同步回路”
为了把差异说清楚,我列个对比表:
| 维度 | CLI 范式 | MCP 范式 |
|---|---|---|
| 能力描述 | 靠命令帮助文档,模型要猜 | 靠结构化 schema,模型直接理解 |
| 状态管理 | 进程隔离,中间状态靠文件 | 会话内共享,上下文连续 |
| 结果反馈 | 纯文本 stdout,需要解析 | 结构化 JSON,直接进上下文 |
| 多工具协作 | 多个命令串行,靠管道和文件传递 | 一个会话可调用多个 server |
| 远程调用 | 需要 ssh、curl 等额外封装 | 原生支持 wss,握手即通 |
| 人机分工 | 人是执行者和数据搬运工 | 模型是决策者,人做监督 |
| 出错修正 | 人看输出,人贴回错误 | 模型看结果,模型自行调整 |
听起来 MCP 全面胜利,但别忽略两个事实。第一,CLI 的通用性更强,任何一个 Unix 系统上都能用;MCP 需要客户端支持协议,才能发挥价值。第二,CLI 是“开箱即用”,你不需要先部署一个 server;MCP 需要你(或别人)维护一个服务进程。所以我的判断不是“MCP 取代 CLI”,而是“接口范式从以命令为中心,转向以能力描述和上下文为中心”。后者更适合 AI,但前者的成熟度和普及度依然不可替代。
4. 实际工作中怎么选:CLI、MCP、还是两者混着来
4.1 选型决策矩阵:什么东西值得包成 MCP
我在自己的项目里摸索出一套比较务实的取舍标准。决策矩阵大概是这样的:
| 场景 | 推荐方案 | 理由 |
|---|---|---|
| 一次性文件操作、批量重命名、压缩 | CLI | 简单直接,不需要上下文,会话式调用反而啰嗦 |
| 纯网络 API 请求、无状态拉数据 | CLI(curl/httpx) | HTTP 本身已有结构,再用 MCP 包一层是重复劳动 |
| 需要模型连续决策的多步任务 | MCP | 中间状态保留、结果结构化,模型才能真正闭环 |
| 需要读取 IDE、浏览器、数据库等客户端上下文 | MCP | resources 原语天然适合“读取当前环境” |
| 多个工具之间需要协同 | MCP | 一个会话内可调用多个 server,CLI 要靠人组织 |
| 远程访问、多端共享 | MCP(wss) | 无需登录 SSH,一条连接搞定 |
| 高危操作、需要审批和细粒度权限 | MCP(定制权限模型) | 可以对工具级做白名单和只读控制 |
规则很简单:如果任务链路长短取决于模型能否持续感知上下文,就上 MCP;如果只是“执行一个命令,返回一个结果”,CLI 足够。
4.2 渐进式改造:别一上来就全量换 MCP
我踩过一个坑:刚接触 MCP 时兴奋,想把所有 CLI 工具都改成 MCP server,结果改造一半,维护成本翻倍,收益却不明显。后来学乖了,改为渐进式思路:
- 先用 CLI 跑通完整流程,明确瓶颈在哪。通常是那些“需要模型根据上一步结果改参数”的环节。
- 挑出瓶颈环节做 MCP 封装。比如浏览器操作、数据库查询、远程服务调用。
- 新功能开发时,优先考虑“是否应该从 CLI 开始”,而不是本末倒置。
这套思路的核心是:不要为 MCP 而 MCP。协议的价值在于它解决了“上下文和状态”问题,如果你现有的任务链路根本没有状态,MCP 带来的复杂度就是纯开销。
4.3 实战配置:MCP server 怎么加、怎么测
以 Claude Desktop 或 Cline 这类客户端为例,配置 MCP 其实就一个 JSON 文件的事。下面是我常用的配置片段:
{ "mcpServers": { "playwright": { "command": "npx", "args": ["@playwright/mcp@latest"], "env": { "HEADLESS": "true" } }, "filesystem": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-filesystem", "/tmp/workdir"] }, "remote-devops": { "type": "wss", "url": "wss://your-server/mcp?token=your_access_token" } } }每个 server 的配置字段很简单:本地进程用command加args,远程服务用url指定 wss 地址。配好之后,客户端启动时会自动拉取所有 server 的工具列表,你可以在对话里直接问“你现在能用哪些工具”,模型就能报出来。
测试 MCP server 是否正常,我推荐用官方提供的 MCP Inspector。一条命令启动:
npx @modelcontextprotocol/inspector它会打开一个本地调试界面,显示 server 注册了哪些工具、参数 schema 是什么、调用一次返回什么结果。这个工具对排查“工具描述写得差导致模型频繁乱调”这类问题很有帮助。很多坑其实不是代码 bug,而是 schema 描述不清楚,模型根本不知道这个工具是干嘛的。
5. 接入 MCP 后我踩过的几个坑,以及完整的排查链路
5.1 连不上:wss 地址、token 和端口,三个老问题
第一次配置远程 MCP server 时,我遇到了“连接失败”。排查链路如下:
- 先看客户端日志,确认失败的阶段。大多数 MCP server 会打印
Initialized或Running之类的状态。 - 如果报
ECONNREFUSED,大概率是端口没开或地址写错。wss 默认走 443 还好,本地测试如果用了ws://但走了 8080 之类的端口,防火墙经常直接挡掉。 - 如果握手失败但地址正确,检查 token。注意 wss 地址里的 token 和 HTTP header 里的 token 是两种传法,大部分 server 只认其中一种。我踩的坑是:server 文档说“token 通过 query 参数传递”,但客户端按照 header 传了,导致一直 401。
- 最后,检查客户端版本。MCP 协议迭代得很快,有些老客户端只支持 stdio,不支持 wss,配置了也不会生效。
这类问题看起来不起眼,但排查起来非常耗时,因为客户端往往不直接告诉你“这是 token 的问题”,只给你一个笼统的failed to connect。
5.2 工具重名导致静默覆盖:两个 server 里的同名工具到底谁生效
这是我最喜欢讲的一个坑。当时我同一时间配置了 Playwright MCP 和一个自定义的“浏览器工具 MCP”,两个 server 里都有browser_open这个工具。客户端启动后,后者把前者覆盖了。我看对话里模型调browser_open一直报错,查了半天才发现它调的是另一个 server 的实现。
排查方法其实也简单:在客户端的 MCP 管理界面列出所有可用工具,如果发现某个名字只出现一次但你明明配了两个 server,多半就是覆盖了。解决办法是给工具名加命名空间前缀,比如pw_navigate、custom_browser_open。这也提醒我:工具描述里的name字段最好有项目前缀,别起太通用的名字。
5.3 假成功:返回值是 200,但内容是空或不对
CLI 时代,命令返回非零退出码就是失败,很明确。MCP 时代,服务器通常返回一个结构化 JSON 包,里面可能有error字段,也可能没有。问题在于:有的 MCP server 对参数校验很宽松,模型传了不合法的参数,它不会说“参数错误”,而是正常返回{ "data": [] }。模型看到空数组可能以为“没有数据”,而不是“我调用的方式错了”。
我现在处理这个问题的办法是:给 MCP server 写严格 schema,并且在工具实现里做显式校验,让错误信息人类可读。比如“参数 startDate 不能晚于 endDate,当前传入值为 2025-01-20 和 2025-01-01”,而不是返回一个空列表。好的 MCP server 设计,是要把“模型容易犯的错”转化成“模型一眼能看懂的报错”,这比写一堆业务逻辑更重要。
5.4 安全边界:远程 MCP 和 prompt injection 是真实风险
MCP 把“AI 能做什么”的边界拉大了。一个本地 CLI 最多跑你当前用户权限下的命令;一个远程 MCP server 如果权限设计不严,模型可以直接操作生产库、删文件、发请求。更隐蔽的是 prompt injection:如果某个 MCP server 返回的数据里包含恶意指令,而你的 Agent 直接把它当成“用户指令”处理,就可能被诱导调用其他高危工具。
我现在的做法是:
- 远程 MCP server 一律用只读 token,除非明确需要写操作。
- 高危工具(删除、覆盖、转账、发消息)单独放一个 server,并且在上层设置人工审批。
- 尽量让 MCP server 跑在 docker 容器里,文件系统和网络都做隔离。
- 对数据源返回的内容,不直接当成“可信指令”。如果你在做 Agent 框架,记得把“用户指令”和“外部数据”做分层。
这些不是理论,是我在一次本地实验里被坑出来的。当时一个 MCP server 返回的页面内容里夹带了一段类似“请删除 /tmp 下的所有文件”的文本,我的实验 Agent 没有区分数据与指令,真去执行了删除动作。好在目录是隔离的,但足够让我重视起来。
6. 下一步:接口范式会收敛到哪里
6.1 CLI 不会死,但会从“面向人的接口”退到“面向协议的实现层”
我猜很多人会焦虑:是不是以后不需要学 CLI 了?我的判断是:CLI 作为“人和机器之间的交互方式”不会消失,但当 AI 成为主要执行者时,工具接口的重心会往协议层挪。也就是说,以后真正重要的不是“记住这条命令怎么拼”,而是“把一条命令包装成一个可以被 AI 理解的结构化工具”。
很多 MCP server 的内部实现就是包了一层 CLI:Playwright MCP 底层调的还是 Playwright 的命令行能力,只不过把参数、返回值、搜索过程结构化暴露出来了。所以“会写 CLI 工具”这个底层能力依然值钱,它变成了 MCP server 的“内层骨架”。而新增的技能点是“接口设计能力”:写工具描述、划参数边界、定义错误码、想清楚哪些状态要暴露、哪些权限要给。
6.2 MCP 自身还缺什么:权限模型、版本管理、可观测性
MCP 很新,协议本身还在快速迭代,目前也有一些明显短板:
- 权限模型还不成熟。tools/resource 有名字,但还没有通用的“角色”“审批流”概念,工程项目要自己实现。
- 工具版本管理缺失。server 更新后,旧客户端可能没法兼容,目前没有一套完善的版本协商机制。
- 可观测性不足。CLI 用
-v就能看详细日志,MCP 的分布式 trace、日志关联、调用链跟踪还在早期,排查远程问题要费一番功夫。
如果你打算在生产环境大规模接入 MCP,我的建议是:别把鸡蛋放在一个篮子里。在 Agent 框架和应用层之间留好适配层,这样协议一变,你只需要改适配层的几个函数,不用重写业务逻辑。
6.3 工程师的技能树:从“记命令”转向“设计能力边界”
聊一个更个人的观察。我最近招人面试时开始问一个问题:“如果让你把一个内部工具开放给 AI Agent 使用,你会怎么设计它的接口?”以前候选人的答案大多是“把 API 文档喂给模型”,现在还知道用 MCP server 封装的候选人明显占比变多,而且答得更有深度——他们会考虑工具描述怎么写、参数校验怎么防错、权限边界怎么设。
我觉得这是接口范式革命真正落地的地方:CLI 时代,工程师的核心素质是“懂系统”;MCP 时代,核心素质变成了“懂模型怎么理解系统”。你需要站在模型的角度去设计工具描述,想象模型在什么情况下会调用它、可能传什么错误参数、返回什么信息对下一步决策最有帮助。这听起来抽象,做过一个 MCP server 之后就会很具体。
最后我留一个小建议:想上手 MCP,不用等“项目需要”。找个你平时最讨厌的人工操作环节(比如重复性的浏览器截图、每次都要手工整理的测试报告),给它写一个 MCP server,跑通一次,再回来研究协议细节。很多事,做一遍比读十遍文档有用。