Mcp2cli 实战指南:一条 CLI 命令调用所有 API,Token 节省 99%
MCP(Model Context Protocol)正在成为 AI Agent 连接外部工具的标准协议,但它有一个被广泛吐槽的问题:每次工具调用都要传输完整的工具 Schema(模式定义)。一个典型的 MCP 服务器可能有几十个工具,每个工具的 JSON Schema 动辄几百个 token,累计下来每个交互回合都要浪费几千甚至上万个 token。
Mcp2cli 正是为解决这个问题而生的开源工具。它把 MCP 服务器、OpenAPI 规范和 GraphQL 端点统一转换成 CLI 命令,让 AI Agent 用极其简洁的语法调用任何 API,在 token 消耗上实现了 96-99% 的压缩。项目发布在 Hacker News 上获得了 146 个点赞和大量讨论,受到开发者社区的高度关注。
核心思路:为什么 CLI 比 MCP 省 Token?
要理解 mcp2cli 的 token 节省原理,先看一个对比场景。
传统 MCP 调用方式:每次工具调用,AI Agent 需要发送完整的工具定义到 LLM。一个中等规模的文件系统 MCP 服务器可能定义 8-10 个工具,每个工具带 JSON Schema 参数定义。这些定义加起来一次对话回合就要消耗 1000-3000 token。而且——每次对话回合都要重新发送。
mcp2cli 的 CLI 方式:把工具调用变成简单的命令行参数。mcp2cli --mcp-stdio "npx server" read-file --path /tmp/hello.txt——就这么简单。Agent 只需要知道工具名称和几个参数,不用每次都传输 Schema。
根据项目的实际测试,对于一个包含 96 个工具的 MCP 服务器:
- 默认的
--list输出:约 1400 tokens - 使用
--top 10 --compact按使用频率排序:仅 20 tokens
这不是渐进式优化,而是量级上的跨越。
安装与快速上手
mcp2cli 基于 Python,安装极其简单:
# 直接运行,无需安装 uvx mcp2cli --help # 或全局安装 uv tool install mcp2cli
项目依赖 uv(Python 的现代包管理器),如果你的环境还没有安装 uv,先跑 curl -LsSf https://astral.sh/uv/install.sh | sh 即可。
装好后,连接一个 MCP 服务器试试:
# 列出远程 MCP 服务器的可用工具 mcp2cli --mcp https://mcp.example.com/sse --list # 调用某个工具 mcp2cli --mcp https://mcp.example.com/sse search --query "test"
四种连接模式
mcp2cli 支持四种数据源,覆盖了几乎所有 API 形式:
1. MCP HTTP/SSE 模式
连接远程 MCP 服务器(支持 SSE 和 Streamable HTTP 传输):
mcp2cli --mcp https://mcp.example.com/sse --list # 带认证头 mcp2cli --mcp https://mcp.example.com/sse \ --auth-header "x-api-key:sk-..." \ query --sql "SELECT 1" # 搜索指定工具(不区分大小写) mcp2cli --mcp https://mcp.example.com/sse --search "task"
mcp2cli 还内置了 OAuth 支持,自动处理令牌获取、缓存和刷新:
# 授权码 + PKCE 流程(浏览器交互) mcp2cli --mcp https://mcp.example.com/sse --oauth --list # 客户端凭证流程(机器对机器) mcp2cli --mcp https://api.example.com/sse \ --oauth-client-id "my-client-id" \ --oauth-client-secret "my-secret" \ --list
2. MCP stdio 模式
连接本地运行的标准 I/O MCP 服务器,这是 Claude Code、Cursor 等 AI 编码工具最常用的方式:
# 列出本地文件系统 MCP 服务器的工具 mcp2cli --mcp-stdio "npx @modelcontextprotocol/server-filesystem /tmp" --list # 调用工具 mcp2cli --mcp-stdio "npx @modelcontextprotocol/server-filesystem /tmp" \ read-file --path /tmp/hello.txt # 给服务进程传递环境变量 mcp2cli --mcp-stdio "node server.js" --env API_KEY=xxx --env DEBUG=1 \ search --query "test"
3. OpenAPI 模式
直接把 Swagger/OpenAPI 规范变成 CLI 命令,零代码生成:
# 从远程 OpenAPI 规范列出所有端点
mcp2cli --spec https://petstore3.swagger.io/api/v3/openapi.json --list
# 调用端点
mcp2cli --spec ./openapi.json --base-url https://api.example.com \
list-pets --status available
# 从 stdin 传递 JSON body
echo '{"name": "Fido", "tag": "dog"}' | \
mcp2cli --spec ./spec.json create-pet --stdin
这对那些只有 REST API 却没有 MCP 服务器的老项目来说简直就是救命稻草——不需要写任何适配代码,直接点对点映射。
4. GraphQL 模式
内省 GraphQL 端点,自动发现查询和变更操作:
# 列出所有查询和变更 mcp2cli --graphql https://api.example.com/graphql --list # 调用查询 mcp2cli --graphql https://api.example.com/graphql users --limit 10 # 自定义选择集字段 mcp2cli --graphql https://api.example.com/graphql users \ --fields "id name email"
GraphQL 模式自动生成选择集和参数化查询,不需要 SDL 解析或代码生成——真正做到即连即用。
Bake 模式:告别重复参数
如果你每天都要连接同一个 API,反复输入 --spec、--auth-header 等参数会很烦。mcp2cli 的 bake 模式可以保存连接配置:
# 把 OpenAPI 规范烘焙成一个命名工具 mcp2cli bake create petstore \ --spec https://api.example.com/spec.json \ --exclude "delete-*,update-*" \ --methods GET,POST --cache-ttl 7200 # 使用 @ 前缀调用,一个参数都不用带 mcp2cli @petstore --list mcp2cli @petstore list-pets --limit 10 # 安装为系统级 CLI 命令 mcp2cli bake install petstore # 之后可以直接用 petstore list-pets --limit 10
bake install 会在 ~/.local/bin/ 创建一个独立的 shell wrapper,这样你就可以像使用系统工具一样调用它们了。对于团队协作,你还可以把 bake 配置分享给同事,大家都用同一套 API 别名。
Token 优化高级技巧
使用频率驱动的排序
mcp2cli 会记录工具调用的频率,帮助我们优先展示最常用的工具:
# 只显示使用最多的 10 个工具,紧凑格式显示 mcp2cli @myapi --list --top 10 --compact # 按最近使用排序 mcp2cli @myapi --list --sort recent
当有使用统计数据时,--list 默认按调用频率排序。这对 AI 编码 Agent 尤其重要——Agent 在每次思考时都会调用 --list 来了解可用工具有哪些,紧凑输出能显著减少 token 消耗。
TOON 与缓存
对于 LLM 消费场景,mcp2cli 提供 TOON(Token-Efficient)格式,对大型数组比 JSON 节省 40-60% 的 token:
mcp2cli --mcp https://mcp.example.com/sse --toon list-tags
缓存方面,规范文件默认缓存 1 小时,支持自定义 TTL 和从环境变量读取密钥:
mcp2cli --spec https://api.example.com/spec.json --cache-ttl 86400 --list mcp2cli --mcp https://mcp.example.com/sse \ --auth-header "Authorization:env:MY_API_TOKEN" \ --list
本地文件永不缓存。
使用场景
场景一:Agent 工具调用优化
假设你在 Claude Code 中使用文件系统 MCP 服务器。每次 Agent 需要读文件,MCP 协议都会把完整的工具列表和 Schema 塞进上下文。有了 mcp2cli,只需一条简短命令:
mcp2cli --mcp-stdio "npx @modelcontextprotocol/server-filesystem /project" \ read-file --path src/main.py
同样的上下文窗口可以做更多实际工作,而不是被 Schema 浪费掉。
场景二:批量 API 测试
开发 REST API 时,curl 测试每个端点很麻烦——要记 URL、HTTP 方法、请求头。mcp2cli 把这一切抽象成统一 CLI 语法:
mcp2cli --spec ./openapi-dev.yaml --base-url http://localhost:8000 --list mcp2cli --spec ./openapi-dev.yaml --base-url https://staging.api.com create-user \ --name "Test User" --email "test@example.com"
场景三:GraphQL API 探索
GraphQL 调试工具往往需要 GUI(如 GraphiQL)。mcp2cli 让你在终端里直接探索:
mcp2cli --graphql https://api.github.com/graphql \ --auth-header "Authorization:Bearer ghp_xxx" \ viewer --fields "login name"
与其他方案对比
| 特性 | mcp2cli | Anthropic Tool Search | 原生 MCP |
|---|---|---|---|
| Token 节省 | 96-99% | 中等(基于缓存) | 无 |
| 支持 OpenAPI | ✅ 直接 | ❌ | ❌ |
| 支持 GraphQL | ✅ 直接 | ❌ | ❌ |
| OAuth 开箱即用 | ✅ | ❌ | 需手动实现 |
| 离线使用 | ✅ | ✅ | ✅ |
| 安装方式 | uvx 一行 | 需要账号 | 需 SDK |
| 开源 | ✅ MIT | ❌ | 协议层开源 |
mcp2cli 最大的优势在于通用性——不是 MCP 协议的替代品,而是一个让各种 API 协议以统一 CLI 方式暴露给 Agent 的桥梁。
总结
mcp2cli 抓住 MCP 生态中的一个痛点——token 浪费——并用一个简洁的方案解决了它。它把 OpenAPI、GraphQL、MCP 三种 API 协议统一到了同一个 CLI 接口下,对在意 token 成本的团队来说是立竿见影的优化手段。