CLI VS MCP:最佳实践指南

37 阅读6分钟

2026 年初,CLI-first 已成为 AI Agent 工具层的主流共识。本文从 Token 经济学、架构设计、行业实践三个维度,总结 CLI-first Agent 的核心方法论。


一、为什么 CLI 是 Agent 的母语

1.1 Token 经济学

同一任务,CLI 和 MCP 的 token 消耗差距巨大:

维度CLIMCP
单个工具描述~68 tokens~3,600 tokens
差距50×

实测案例:

任务MCP tokensCLI tokens倍数
Playwright 15 步浏览器自动化~114K~27K
Claude Code 代码执行~150K~2K75×

膨胀根源:MCP 的 JSON-RPC schema 加载 + 状态内联到上下文窗口。CLI 的状态走磁盘文件,按需读取,不占上下文。

50 个 MCP 工具的 schema 就能塞满整个上下文窗口。CLI 把同样数量的工具压缩到 ~200 tokens。

1.2 训练数据优势

LLM 的训练语料包含数十亿行 CLI 命令——Stack Overflow、GitHub、man pages、Shell 脚本。对 CLI 的理解已内化到模型参数中。

MCP 的 JSON-RPC 是 2024 年末发布的新规范,训练数据中几乎没有。

CLI 是 LLM 的母语,MCP 是需要额外学习的外语。

1.3 Unix 哲学契合

CLI 输入输出是纯文本,LLM 处理的也是文本(token),两者之间零格式转换。MCP 在中间插入 JSON-RPC 编码层,对 Agent 而言是不必要的抽象。

Unix 管道与 Agent 的思维链天然同构——编排原子化 CLI 工具实现复杂自动化:

log-fetch --days 7 | grep "ERROR" | feishu-send --channel #ops

二、CLI vs MCP:各自的主场

不是 CLI vs MCP,是轻量灵活 vs 标准治理

2.1 对比矩阵

场景CLIMCP
Coding Agent / 个人使用✅ 轻量高效,按需加载
本地工具调用✅ 模型原生理解,进程隔离
企业级 / 多租户 / 安全敏感✅ 统一权限、审计、治理
远程服务(无本地 CLI)✅ 标准化发现与连接
跨客户端复用✅ 即插即用,无需安装二进制

2.2 CLI 的企业级短板

  • 权限继承 Shell 用户,无细粒度控制
  • 审计追溯困难
  • 幻觉可能导致危险操作(rm -rf / 等)

2.3 MCP 的独有能力

  • Resources 抽象:数据库表、日志流、设备状态 → URI + 动态提示词模板
  • 类似 USB 的标准化网络效应——即插即用

2.4 行业信号

  • Perplexity CTO Denis Yarats(Ask 2026):正从 MCP 转向 APIs 和 CLIs
  • YC 掌门人 Garry Tan:公开批评 MCP 的 context window 膨胀和 auth 机制
  • 头部产品集体验证:Claude Code、Codex CLI、Gemini CLI、OpenCode 均采用 CLI-native 架构

开发者三大痛点:上下文膨胀(50 个工具就爆)、管理负担(手动维护 MCP Server 生命周期)、中间层损耗(重复封装已有 CLI/API)。


三、混合架构决策树

需要给 Agent 添加一项新能力?
├─ 本地工具 / 个人使用 → CLI
├─ 多人复用 / 跨客户端 / 权限管控 → MCP Server
└─ 远程服务 + 本地高效执行 → MCP 发现连接 + CLI 实际执行

架构全景:

┌─────────────────────────────────────────────┐
│                Agent (LLM)                  │
├────────────────────┬────────────────────────┤
│   CLI 执行层(肌肉) │   MCP 连接层(神经)     │
│                    │                        │
│  本地工具调用      │  远程服务发现          │
│  高效 token        │  统一认证授权          │
│  模型原生理解      │  跨宿主即插即用        │
│  按需加载/用完即走  │  合规审计 / 资源抽象   │
│                    │                        │
│  git / rg / jq     │  DB / MQ / SaaS API    │
│  curl / ffmpeg     │  LSP / 浏览器自动化    │
└────────────────────┴────────────────────────┘

Playwright 团队的总结:有文件系统访问权限用 CLI,沙箱环境用 MCP。


四、CLI 工具自动发现模式

Agent 常见的一个问题:它不知道当前环境装了什么工具,于是建议使用不存在的命令(幻觉)。

4.1 设计模式

┌─────────────┐     ┌──────────────┐     ┌─────────────────┐
│  Tool        │ ──▶ │  Detector    │ ──▶ │  System Prompt  │
│  Catalog     │     │  (which)     │     │  Injection      │
│  (纯数据)    │     │  (进程缓存)   │     │  (~200 tokens)  │
└─────────────┘     └──────────────┘     └─────────────────┘
  1. Catalog:预定义工具目录,纯数据。添加工具 = 添加一条记录
  2. Detector:进程启动时用 which 命令探测已安装的工具,结果进程级缓存
  3. Injection:将探测结果格式化为紧凑的 XML/Markdown 片段注入 System Prompt

4.2 关键设计要点

  • 极低开销which 扫描 ~25 个工具 <1ms,纯文件系统检查
  • 扩展 PATH:自动包含 /usr/local/bin~/.local/bin~/.cargo/bin 等常见路径
  • 进程级缓存:工具列表不会在进程生命周期内变化,缓存后结果稳定
  • 稳定输出:不破坏 Prompt Cache(结果在进程内不变)
  • 双语描述:根据用户语言偏好选择 desc_en / desc_zh
  • 优雅降级:探测失败不影响 Agent 正常运行

4.3 注入效果

<available_cli_tools>
The following CLI tools are installed and available via bash:
- ffmpeg: Audio/video processing (transcode, cut, merge, stream)
- jq: JSON processor (query, filter, transform)
- rg (ripgrep): Ultra-fast regex text search across files
- git: Version control (commit, branch, diff, log)
...
</available_cli_tools>

~200 tokens,远小于 MCP schema 的数万 tokens。


五、AI-Native CLI 设计 6 原则

如果你在开发给 Agent 使用的 CLI 工具,遵循以下原则:

#原则说明
1--help 即 Prompt帮助文档是给 AI 看的,多写 Examples(Few-shot)
2--json 输出结构化输出便于 Agent 解析,避免解析 ASCII 表格
3非交互模式提供 -y / --yes,避免阻塞 Agent
4原子操作只做一件事,通过管道组合
5幂等性重复执行无副作用,便于错误恢复重试
6明确退出码成功 0、失败非 0,Agent 据此判断结果

反面案例

# ❌ 交互式确认 → Agent 卡死
$ dangerous-tool --delete-all
Are you sure? [y/N]:

# ✅ 非交互模式
$ dangerous-tool --delete-all --yes
# ❌ ASCII 表格 → Agent 需要正则解析
NAME    STATUS  AGE
nginx   Running 3d
redis   Error   1h

# ✅ JSON 输出 → Agent 直接解析
$ tool list --json
[{"name":"nginx","status":"Running","age":"3d"},...]

六、CLI-native 实战场景

场景Agent 实际使用的 CLI 工具链不需要的 MCP
Monorepo 重构rg → 编辑 → git diffnpm testgit commitGitHub MCP
全栈调试git pullnpm run devtail -fcurldocker-composeDocker/Logging MCP
脚手架搭建cargo newcargo addcargo watchcurl 健康检查Rust/DB MCP
CI/CD 修复act → 编辑 YAML → docker buildgh pr createCI 集成层

共性:强推理模型 + bash/zsh 足矣。不需要自定义 Server、不需要 schema 膨胀上下文、Unix 管道天然组合。


总结

  • CLI 是 LLM 的母语:训练数据中有数十亿行 CLI 命令,MCP 是 2024 年的新外语
  • Token 经济学:CLI 工具描述比 MCP schema 小 50 倍
  • 不是二选一:CLI 做本地执行(肌肉),MCP 做远程连接和治理(神经)
  • 自动发现:让 Agent 只使用真实存在的工具,消除幻觉,~200 tokens 注入
  • 设计给 AI 用的 CLI:JSON 输出、非交互、幂等、原子操作

选择标准:有文件系统访问权限用 CLI,沙箱/远程/企业治理用 MCP。


参考资料:

  • Playwright CLI vs MCP 对比数据 — github.com/nicobailon/…
  • LLM 工具调用方式系统性对比 — arXiv 2601.11672
  • CLI Is All You Need — Marco Franzon
  • Denis Yarats (Perplexity CTO), Ask 2026 演讲