令牌节省工具

通过CLI + Skill模式替换MCP,显著降低Code Agent的令牌消耗,提升效率。

  • by kkito
  • 本地部署
  • 更新于
在 GitHub 查看 kkito/token-saver-mcp2skill

使用说明

令牌保护程序MCP2Skill

使用CLI+Skill替换MCP,节省代码代理令牌消耗

英语 | 中文


即使每月订阅,代币也用完了?

在使用Cursor、Claude Code或Qwen Code等代码代理工具时,您是否经常发现令牌不足?

代币=货币每一次谈话都会烧钱,但很少有行动真正产生价值。

试试这个解决方案!它不仅节省了大量的令牌,而且使LLM能够更专注于解决您的问题,而不是被数十个工具的模式分心。


背景:MCP的令牌消费问题

在过去的一年里,MCP(模型上下文协议)工具生态系统变得非常流行,出现了大量工具。每个人的工具箱里都有几十个MCP工具。

核心问题:

  1. 巨大的代币消费 -每次对话都会向LLM发送所有MCP工具的完整模式
  2. 大多数场景实际上并没有使用它们 -MCP工具实际触发的次数非常低
  3. 但它们必须被发送 -我们无法预测LLM何时需要使用这些工具进行评估,因此每次都必须发送这些工具

这导致了大量的代币浪费。

典型MCP配置:

{
  "mcpServers": {
    "playwright": {
      "command": "npx",
      "args": ["@playwright/mcp@latest"]
    },
    "sqlite": {
      "command": "npx",
      "args": ["-y", "@executeautomation/database-server", "/tmp/database.db"]
    },
    "redis": {
      "command": "uvx",
      "args": ["redis-mcp-server", "--url", "redis://localhost:6379/0"]
    }
  }
}

解决方案:CLI+技能模式

这个项目是一个实验,也是一个推荐的模式: 使用本地CLI命令+技能取代传统的MCP工具模式.

核心思想:

  • 使用本地CLI命令完成相同的功能
  • 需要时,让法学硕士通过Skill给他们打电话
  • 虽然一次技能调用会触发更多的LLM交互,但对于每天数百或数千次代码代理调用来说,这是非常划算的

项目测试方法:

此项目使用 Qwen代码 (https://github.com/QwenLM/qwen-code)作为测试平台,取代 剧作家MCP 随着 剧作家CLI技能 比较两种模式之间的令牌消耗。

相关项目:

  • 剧作家MCP:https://github.com/microsoft/playwright-mcp
  • 剧作家CLI:https://github.com/microsoft/playwright-cli

代币消费对比测试

测试工具

  • 代码代理:Qwen代码
  • 比较工具:剧作家MCP vs剧作家CLI技能
  • 测试命令: qwen --openai-logging -p "test echo, pls say hi"

测试数据

测试场景 提示令牌 完成令牌 总令牌 描述
基线 10492 25 10517 没有技能,没有MCP,只有基本提示和内置工具
+剧作家MCP 14990 23 15013 增加了22个剧作家MCP工具
+剧作家CLI技能 10586 26 10612 移除MCP,切换到技能模式
+3 MCP 26092 26 26118 剧作家+SQLite+Redis

数据分析

剧作家MCP与剧作家CLI技能比较:

度量 MCP模式 技能模式 节省
提示令牌 14990 10586 4,404 (29%)
代币总数 15013 10612 4,401 (29%)

多MCP场景开销:

在添加了3个MCP(Playwright+SQLite+Redis)后,代币消费激增至 26,118,即 2.5倍 基线测试。

主要结论:

  • 默认提示和基础工具已消耗约 10000个代币
  • 每增加一个MCP都会显著增加消耗(剧作家MCP增加约4.5k)
  • 使用10+MCP,消耗变得更加严重
  • 添加技能只需要大约 100个代币

MCP工具示例

Playwright MCP包括22个工具,每个工具的模式在每次对话中都会发送:

playwright - Ready (22 tools)
Tools:
- mcp__playwright__browser_click
- mcp__playwright__browser_close
- mcp__playwright__browser_console_messages
- mcp__playwright__browser_drag
- mcp__playwright__browser_evaluate
- mcp__playwright__browser_file_upload
- mcp__playwright__browser_fill_form
- mcp__playwright__browser_handle_dialog
- mcp__playwright__browser_hover
- mcp__playwright__browser_install
- mcp__playwright__browser_navigate
- mcp__playwright__browser_navigate_back
- mcp__playwright__browser_network_requests
- mcp__playwright__browser_press_key
- mcp__playwright__browser_resize
- mcp__playwright__browser_run_code
- mcp__playwright__browser_select_option
- mcp__playwright__browser_snapshot
- mcp__playwright__browser_tabs
- mcp__playwright__browser_take_screenshot
- mcp__playwright__browser_type
- mcp__playwright__browser_wait_for

单个工具模式示例(每次对话都发送):

{
  "type": "function",
  "function": {
    "name": "mcp__playwright__browser_tabs",
    "description": "List, create, close, or select a browser tab.",
    "parameters": {
      "type": "object",
      "properties": {
        "action": {
          "type": "string",
          "enum": ["list", "new", "close", "select"],
          "description": "Operation to perform"
        },
        "index": {
          "description": "Tab index, used for close/select. If omitted for close, current tab is closed.",
          "type": "number"
        }
      },
      "required": ["action"],
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "additionalProperties": false
    }
  }
}

快速入门:从MCP到技能

1.删除MCP配置

// Delete or comment out
{
  "mcpServers": {
    "playwright": {
      "command": "npx",
      "args": ["@playwright/mcp@latest"]
    }
  }
}

2.安装Playwright命令行界面

# Install Playwright CLI
npm install -g @playwright/cli

3.安装技能

# Install playwright-cli skill
playwright-cli install --skills

这会自动将技能文件安装到Qwen Code的技能目录中:

.qwen/
  skills/
    playwright-cli/
      SKILL.md
      references/
        - request-mocking.md
        - running-code.md
        - session-management.md
        ...

4.验证令牌节省

再次运行测试命令以比较令牌消耗:

qwen --openai-logging -p "test echo, pls say hi"

检查输出中的令牌统计数据,确认从~15k减少到~10.6k。


实例:创建Web搜索技能

如果你有一个CLI,创建一个技能非常简单。

网络搜索是每个人都需要的一个非常常见的工具。参见 demo_SKILL_for_websearch.md,这是一种人工智能生成的网络搜索技能,可以使用Bing进行搜索并总结结果。

技能档案结构:

---
name: websearch
description: Performs web search using Bing search engine via playwright-cli...
---

# Web Search with Bing and playwright-cli

## Usage Pattern

playwright-cli open https://www.bing.com/
playwright-cli type "your search query"
playwright-cli press Enter
playwright-cli snapshot
...

核心思想:

使用 playwright-cli 命令序列替换Playwright MCP的22个工具,并让LLM了解如何通过技能描述调用它们。

代币消费比较:

模式 代币消费 储蓄
剧作家MCP(22种工具) ~4500 -
网络搜索技能 ~100 98%

问题与思考

问题1:为什么MCP仍然很受欢迎?

综上所述,CLI+Skill模式在节省代币方面具有明显优势。然而,实际上,MCP生态系统仍然非常受欢迎,许多开发人员和公司都在投资MCP工具开发。

这是为什么?

也许我们应该更加努力 本地CLI开发 而不是MCP。

CLI工具的优点:

  • 独立于任何代理框架
  • 可用于脚本、CI/CD和其他场景
  • 更符合Unix哲学:小工具,组合使用
  • 不受特定协议的约束,迁移成本低

建议: 如果你有一个好的工具想法,可以考虑先将其制作成CLI,然后考虑是否需要MCP封装。

问题2:技能浪费问题

虽然技能模式比MCP节省了更多的代币,但仍然存在浪费。

服用 开放规范 例如,它生成了几个技能。虽然这些技能只有几百或几千个代币,不占用太多资源,但在实际应用中,像 /opsx:propose 是 手动触发.

问题: 既然这些技能是手动触发的,为什么每次对话都要向LLM发送它们的描述?这些成百上千的代币基本上被浪费了。

进一步思考:

除了MCP/Skill,我们是否还缺少某种形式的 本地命令/工具?

  • 仅在本地触发的表单
  • 不需要发送给LLM
  • 仅在用户明确调用时执行

此表单可能更接近传统的CLI命令,但需要更好地与Agent工具集成。

哦,对了,这正是斜线命令场景!大多数代码代理都支持它。


相关链接

  • Qwen代码: https://github.com/QwenLM/qwen-code
  • 剧作家MCP: https://github.com/microsoft/playwright-mcp
  • 剧作家CLI: https://github.com/microsoft/playwright-cli
  • 开放规范: https://openspec.dev/
  • 网络搜索技能示例: demo_SKILL_for_websearch.md

许可证

麻省理工学院