MCP 没死,但我把大半 Agent 活儿换成了 CLI:Cursor 用户的工具取舍

Skill / MCP / CLI 分层详解 — 上下文开销实测 — 五类必留 MCP 场景 — gh + AGENTS.md 完整落地指南

通过邀请链接注册 Cursor,首月 Pro / Pro+ / Ultra 立享 5 折:

👉 立即注册(首月 5 折)
章节一

先把三个词摆清楚:Skill、MCP、CLI 不是同一层的东西

我在刚开始折腾 Cursor Agent 的时候,犯过一个很典型的错误:把这三样东西当成同类选项来比。其实它们根本不在一个维度上。

我现在用来解释它们的类比是:给 Agent 配工具,像给一个刚入职的聪明新同事配资源。

Skill(规则/知识层)相当于你给他准备了一份"内部操作手册"。这份手册里写着:我们这个项目有什么约定、危险操作要先确认、代码风格遵循哪个标准、提 PR 之前要跑哪些检查。这个同事会把手册里的规矩记住,以后做事就按这套来。常驻成本极低,消耗的上下文几乎可以忽略。

MCP(协议接入层)相当于你给他办了一批门禁卡和内部系统账号。GitHub、数据库管理后台、云平台控制台——这些系统你提前帮他接好了。每次他需要用某个系统,直接刷卡进去,接口是标准化的。但有一个隐性成本:每办一张卡,那张卡的说明书——这个系统有哪些功能、每个功能接受什么参数——都得先塞进他的脑子里,不管今天用不用得到。

CLI(终端执行层)相当于给他配了一台电脑,让他自己开终端敲命令。他本来就会用电脑,不需要你额外教他 git 怎么用、curl 怎么发请求——这些他在学校就学过了,工作语料里也全是。你让他干什么,他自己想好命令,敲进去看结果,不行就换个姿势再试。

💡 这三层是分层协作的关系,不是互相替代。Skill 管"懂规矩",MCP 管"接能力",CLI 管"动手干"。一个配置完善的 Agent 工作流,三样可以同时在用——只是不同任务的主力工具不一样。
章节二

MCP 到底"贵"在哪里

我说的"贵"不是钱,是上下文开销,以及随之而来的两个副效应。

MCP 的运作机制

MCP 是 Anthropic 提出的一套客户端-服务端协议,底层走 JSON-RPC。整个流程大概是这样:你启动一个 MCP Server(比如 GitHub 的、数据库的、某个 SaaS 的),Server 初始化完成后,会通过 tools/list 这个接口把它能提供的所有工具汇报给 Client——工具名字是什么、每个工具做什么、接受哪些参数、参数是什么类型,全部打包送过来。Client 拿到这份清单,把它注入到当前对话的上下文里。之后每轮对话,模型都能"看到"这些工具定义。当模型决定要用某个工具时,通过 tools/call 发起调用。

流程本身设计得很优雅。但代价就藏在"把工具定义注入上下文"这一步里。

第一层代价:工具定义是全量常驻的

不管你今天的任务用不用得到这个 Server 里的某个工具,只要你接了这个 Server,它所有工具的定义就先稳稳占住那块上下文预算。这个开销有多大?你自己可以去 Cursor 设置里看当前 MCP 工具定义吃掉了多少 token。如果你同时接了三四个功能丰富的 Server,上下文窗口里很大一块就被工具说明书占满了,留给真正的任务代码、对话历史和输出的空间就被压缩了。

第二层代价:注意力稀释

上下文里塞了大量和当前任务无关的工具定义,模型在"该用哪个工具"这件事上会变得更容易犯迷糊。假如你手边摆了 3 把工具,你拿对的概率很高;但如果摆了 30 把,其中还有几把功能描述相近,选错的概率就不是线性上升了。我自己遇到过好几次,Agent 明明可以直接用某个 MCP 工具做事,结果选了另一个参数不对的工具折腾半天——事后翻上下文,就是旁边有几个描述相近的工具把它给绕晕了。

第三层代价:运维复杂度

每个 MCP Server 是一个独立的进程或者网络服务。启动它需要配置,认证方式各家各异(有的是 API Key 塞环境变量,有的要 OAuth 流程,有的是本地文件 token),偶尔就是起不来——但起不来的原因可能是 Node 版本不对、端口被占、token 过期或者权限不够,要一层一层排查。这种排障链路对于"就想让 Agent 帮我查一下 PR"这种需求来说,实在是太重了。

章节三

CLI 为什么对 LLM 格外友好

这是我把大半任务迁到 CLI 的核心原因,展开说一下。

MCP 工具定义全量注入 vs CLI 按需发现的对比示意

MCP 把所有工具定义一次性塞进上下文(左);CLI 让 Agent 按需一条条查、用完即走(右)。

(a) 渐进式发现,信息按需加载

CLI 工具的用法不需要提前全部塞进上下文。Agent 想用 gh 做点什么,先跑一下 gh --help,看到命令目录;发现自己要的是 PR 相关操作,再跑 gh pr --help,看子命令;确定要列出 PR,gh pr list --help 看参数。每次 --help 的输出只有几十行,加载的都是当前步骤需要的信息,用完就不占了。这和 MCP"开局把整本手册塞进去"的方式正好相反。

(b) 模型对 CLI 工具天生熟悉

LLM 的训练语料里有几十年积累的 Unix 文档、无数 Stack Overflow 问答、海量 shell 脚本和教程。gitcurlgrepghdockerjq 这些工具,模型见过太多遍了,不需要你额外教。相比之下,一个私有的 MCP Server 或者小众的 SaaS MCP,模型在训练时可能根本没见过,完全靠你在上下文里提供的工具描述来理解——描述写得模糊,理解就偏。

(c) 管道组合,天然支持后处理

Unix 管道这个设计实在是太好用了。gh pr list 出来的结果要按字段筛选?接个 jq。要统计行数?接个 wc -l。要格式化成表格?接个 column。这些后处理不需要 Agent 额外写程序,一个 | 就串起来了。如果是 MCP 返回了一坨结构化数据,Agent 要做后处理,通常得写段代码、存中间变量、再处理——链路更长,出错点也更多。

(d) 可调试,出错直接复现

这一点我自己感触特别深。Agent 用 MCP 调了个接口出错了,你要调试,得看 Client 日志、看 Server 日志、对比 JSON 请求和响应,整个链路是黑盒的。Agent 用 CLI 跑了条命令出错了,你把那条命令复制到自己终端敲一下,看到的结果和 Agent 看到的完全一样。问题一目了然。这种"我能直接复现 Agent 的视角"的能力,在排查问题时价值极大。

(e) 生态成熟,工程惯例稳定

成熟 CLI 工具有几十年的工程实践积累:退出码 0 代表成功,非 0 代表失败;正常输出走 stdout,错误信息走 stderr;不少现代工具还支持 --json 或者 -o json 输出机器可读的格式。这些惯例是稳定的,Agent 可以依赖它们做判断,不需要为每个工具单独处理输出格式的特殊情况。

章节四

一个真实的对照:同一个需求,两条路

说说一个我自己真实做过的对照。

需求很简单:列出仓库里所有 open 状态的 PR,看看每个人有几条、分别是哪些。

同一需求下 MCP 路线与 CLI 路线的链路长短对比

同一个需求:MCP 路线要走装 Server、配 key、注入工具、调用、拿结果五步;CLI 路线只要"已登录 → 一句命令 → 完成"。

路线 A:MCP 方式

当时我用的是 GitHub 的 MCP Server。步骤大概是:找到 MCP Server 的包、搞清楚认证方式(需要创建一个 Fine-grained token 并给对应仓库权限)、在 Cursor 的 MCP 配置文件里写好 Server 定义、重启 Cursor 让 Server 生效、确认 Agent 能看到工具列表。整个配置过程花了差不多二十分钟——主要时间在搞 token 权限,GitHub 的 Fine-grained token 权限选项挺细的,一项一项勾。配好以后能用,但上下文里多了一大块 GitHub 工具定义。

路线 B:CLI 方式

我本机的 gh 之前已经装好并且 gh auth login 过了。Agent 模式下,我直接说:"用 gh 列出这个仓库所有 open 的 PR,按作者分组显示"。Agent 自己组了这条命令:

gh pr list --state open --json number,title,author \
  --jq 'group_by(.author.login)[] | "\(.[0].author.login): \(map("#" + (.number|tostring))|join(", "))"'

跑完,输出直接就是我要的格式。从发出需求到拿到结果,不到一分钟。如果 jq 表达式写错了,我自己在终端把这条命令跑一下,能立刻看到报错信息,改起来也快。

⚠️ 体感结论:对于"就这一个需求、本机 gh 已经装了"的场景,CLI 这条路配置几乎为零、上下文几乎不占、出错能当场复现。MCP 那条路每一步都是成本,而且配好之后那堆工具定义就常驻了,即便你今天只用了一个"列 PR"的功能。但这不代表 MCP 没用,也不代表应该全换成 CLI。

还没有 Cursor?通过邀请通道注册,首月 Pro / Pro+ / Ultra 立享 5 折(Pro 仅需 $10):

👉 立即注册(首月 5 折)
章节五

我实际怎么分工:不是非此即彼

默认走 CLI 的场景

以下这些,我基本不考虑 MCP,直接让 Agent 用 CLI:

这些场景的共同特点是:有成熟的 CLI 工具、操作是读取或者可以预期的写入、出错成本可控、需要的上下文轻

我反而坚持留 MCP 的场景

以下这些场景,我用了 CLI 之后又退回到 MCP,因为 CLI 确实不够用:

① 根本没有等价 CLI。浏览器自动化是最典型的例子。让 Agent 去打开某个页面、点按钮、读取 DOM 里的内容、截图做视觉验证——这件事没有 CLI 能干。你得用 Playwright 的 MCP Server 或者类似的浏览器自动化 MCP。还有一些 SaaS 工具只提供了 API 和 MCP,没有像样的命令行工具——这时候 MCP 也是没得选的选项。

② 需要稳定的结构化返回。有些任务里 Agent 要基于返回结果的某几个字段做判断,比如"如果这次部署的状态是 failed,去取 failure_reason 字段的值再决定下一步"。MCP 工具的返回是有类型的结构,比 CLI 文本输出稳定得多。有些老命令行工具的输出格式每个版本可能都有细微差异,Agent 解析起来偶尔会翻车。

③ 跨客户端、跨团队复用。如果你在团队里维护一套内部工具——比如封装了部署审批流程、或者数据库的受控查询接口——做成 MCP Server 的好处是:团队里用不同 Agent 客户端的人(Cursor、Claude Desktop 或其他 MCP 兼容客户端)都能用同一套接口,权限控制和审计也能集中做。

④ 没有 shell 的运行环境。某些沙箱环境、某些 CI 步骤的 Agent 插件、某些受限的远程容器——根本不给你开终端。这时候 MCP 是接入外部能力的唯一方式。

⑤ 危险操作需要收口和审计。对于真正危险的操作,把它封装成 MCP 工具——明确定义这个工具能做什么、参数边界是什么、每次调用有日志——比放开一个无边界的 shell 更可控。

Skill 放哪层

Skill(也就是 .cursor/rules 或者 AGENTS.md 里的规则文件)不和 MCP、CLI 抢活,它是完全不同的一层。Skill 解决的是"让 Agent 懂这个项目的规矩"——用哪种风格提交、危险命令怎么处理、这个仓库有哪些约定、优先用哪些工具。它的开销极轻(几百到几千 token 的规则文本),但收益明显:你不需要每次都在对话里重复交代背景。

💡 Skill 配合 CLI 用是最香的组合:用规则告诉 Agent"本项目优先走 CLI、陌生命令先 --help 再执行、涉及删除和修改的命令必须先停下来跟我确认",然后让它用 CLI 动手——规矩在 Skill 里,手脚在 CLI 里。
章节六

在 Cursor 里怎么把这套跑起来

装 gh 并登录

gh 是 GitHub 官方命令行工具,是这套方案里最核心的一块:

# Windows(推荐用 winget)
winget install --id GitHub.cli

# 装完验证
gh --version

# macOS
brew install gh

装完之后:

gh auth login

按提示选 GitHub 官网、选 HTTPS、用浏览器完成 OAuth 登录。登录完跑一下 gh auth status 确认没问题。这一步必须提前做好,不能指望 Agent 帮你做——认证流程有交互式确认环节,Agent 替不了你。

在 Cursor 里配 Agent 的命令执行策略

Cursor Agent 模式自带终端能力,可以直接运行命令。但我强烈建议把命令的确认策略配清楚:

给 Agent 立规矩(AGENTS.md 模板)

在项目根放一份规则文件,我用的是 AGENTS.md(纯 Markdown,简单直接;老一点的 Cursor 版本也可以放成 .cursor/rules/agent-cli.mdc)。以下是我自己用的规则模板,可以直接拿去改:

# Agent CLI 操作规范

## 工具优先级
1. 优先使用 CLI 工具(gh、git、docker、curl 等)完成任务
2. 使用前不熟悉的命令,先跑 `<命令> --help` 查看用法再执行
3. 只有 CLI 无法覆盖时,才考虑使用 MCP 工具

## 命令执行规则
- 只读/查询命令可自动执行(gh pr list、git log 等)
- 涉及写入、推送、合并的命令:执行前向用户展示命令并等待确认
- 涉及删除、重置、不可逆操作的命令:禁止自动执行,必须由用户手动确认并执行

## 跨平台注意
- 当前环境是 Windows + PowerShell
- 需要 Unix 命令时,优先找 PowerShell 等价写法
- 不要假设 bash 命令在 PowerShell 里可以直接用

## 输出处理
- 优先在命令里直接用 --json + --jq 或 PowerShell 管道处理输出
- 避免把大量原始输出塞回对话——先过滤再返回相关部分

把高频操作固化成脚本

当你和 Agent 合作排查过一个问题、或者完成了一个需要多条命令配合的任务,让 Agent 把这次用到的命令整理成可重复运行的脚本,存进 scripts/ 目录:

scripts/
  list-open-prs-by-author.sh
  check-ci-status.sh
  cleanup-merged-branches.sh

下次有同样需求,一条命令搞定,不用重新教 Agent。把一次性经验固化成可复用工具,这是整套方案里投入产出比最高的操作。

章节七

CLI 不是银弹:几个我踩过的坑

写入操作有副作用,失误了不一定能回滚

git push --force 是 Agent 如果理解错了需求很可能给出的命令。docker system prune 会清掉你所有没用的容器和镜像。文件删除更是直接的。Agent 组命令的思路不一定和你的完全一致——在你完全信任一条命令之前,自己读一遍,特别是带 --force-f-r 这类 flag 的。我的习惯是:凡是有副作用的命令,都在自己终端先 dry-run 一下,或者把命令参数再对一遍,确认没问题再执行。

有些操作 CLI 也需要交互式确认,Agent 替不了你

gh auth login、很多包管理器的首次安装、交互式的 git rebase -i——这些流程里有交互式步骤,等你输入、等你在浏览器里点确认。Agent 跑到这一步会卡住,它没办法替你按键。你需要自己接手,把交互式的部分做完,让 Agent 接着往下。

Windows + PowerShell 的跨平台坑

这个在 Windows 上用 Cursor Agent 跑命令的时候很高频出现,单独说一下。最典型的坑之一:sc 命令。在 bash/zsh 环境里 sc 可能什么都不是,但在 PowerShell 里 scSet-Content 的别名。如果 Agent 想用 sc.exe(Windows 的服务控制工具),它得显式写 sc.exe——不然 PowerShell 会把它当成 Set-Content 执行,结果会很奇怪。

类似的坑还有:ls 在 PowerShell 里是 Get-ChildItem 的别名,输出格式和 Unix ls 完全不同,ls -la 这种 flag 在 PowerShell 里是不认的。rm -rf 在 PowerShell 里也得改写成 Remove-Item -Recurse -Force。在规则文件里专门加一条"当前环境是 Windows + PowerShell"来提醒 Agent,效果明显。

文本输出解析不稳定

有些老旧命令行工具的输出格式不是为机器解析设计的——列宽会随内容变化、字段之间用空格而不是分隔符、不同版本的输出格式可能略有差异。Agent 解析这种输出写的代码,有时候在你本地跑好的,换一台机器因为工具版本不同就挂了。遇到这种情况,老老实实上 --json 输出。大多数现代工具都支持。如果工具实在没有结构化输出选项,这反而是用 MCP 的好理由。

小结

分层,不是决赛

回到最开始那个问题:MCP 死了吗?

没有。它解决了一类 CLI 解决不了或者解决得很别扭的问题。但对我自己的日常 Agent 工作流来说,把常用执行任务迁到 CLI 是一次非常值得的重构——更轻、更快、更透明、更容易调试。MCP 退到了它最擅长的位置:无 CLI 等价物的能力接入、需要结构化返回的复杂场景、需要权限收口的危险操作。

分层是关键词,不是非此即彼:

如果你现在想把这套方案在自己的项目里跑起来,4 件事优先级最高:

  1. gh 并完成登录。这是成本最低、收益最快的一步,装完你的 Agent 就能处理绝大多数 GitHub 工作流。
  2. 给 Agent 立 --help 优先的规则。在规则文件里写明"陌生命令先 --help 查用法再执行",能避免很多 Agent 因为参数猜错搞出意外的情况。
  3. 涉及写入和删除的命令,要求 Agent 先展示再执行。无论如何,先看一眼,这个习惯值得养成。
  4. 把高频排查操作固化成 scripts/ 里的脚本。第一次合作解决了某个问题,让 Agent 整理成脚本存起来——下次直接用,经验变工具。
💡 "2026 年最值得搭的 Agent 干活方式"——CLI + 一层薄薄的规则,MCP 按需补位。不追标题党,按场景选工具。

通过邀请通道注册 Cursor,首月 Pro / Pro+ / Ultra 立享 5 折——Pro 仅需 $10、Pro+ 仅需 $30、Ultra 仅需 $100。

👉 立即开通(首月 5 折)

邀请通道仅对首月生效,次月起恢复原价;可随时取消订阅。