你在脚本里用 claude -p --tools "" 运行 Claude Code,以为不带工具调用会更轻。但在订阅登录且启用了 claude.ai 连接器的情况下,结果恰恰相反:一位用户实测,一行提示词的单次调用消耗了 429,388 个输入 token(issue anthropics/claude-code #106413,Claude Code 2.1.312,2026年10月31日)。修复只需一个参数:加上 --strict-mcp-config 后,同一测试降到 2,854 个 token。
为什么 claude -p --tools "" 会消耗这么多 token?
因为 --tools "" 同时移除了 ToolSearch 工具。没有它,Claude Code 会在一开始就加载所有 MCP 工具的完整定义,而不是按需查找。官方文档 Configure tool search 一节写道:"If you deny ToolSearch or leave it out of --tools, MCP tools load upfront instead."
第二个因素是 claude.ai 连接器(Gmail、Slack、Drive 等)。同一页面说明,只有当前认证方式是 claude.ai 订阅登录时才会获取它们。如果启用的是 ANTHROPIC_API_KEY、ANTHROPIC_AUTH_TOKEN 或 apiKeyHelper,就不会加载。
参数名本身就是个陷阱:CLI 参考文档提醒 --tools "doesn't affect MCP tools"。它限制的是内置工具,MCP 工具依然存在,而且现在是全量加载。
每种配置实际消耗多少?
下表数据来自 issue #106413 的作者(Claude Code 2.1.312,订阅登录,同一行提示词,输入 token 含缓存),以及在 Mac 上用 2.1.316 和 Haiku 复现的第二位用户。并非我们自己的测量。
| 配置 | 输入 token | 来源 |
|---|---|---|
claude -p --tools "" | 429,388 | issue 作者 |
+ --strict-mcp-config | 2,854 | issue 作者 |
ENABLE_CLAUDEAI_MCP_SERVERS=false,不加 strict | 2,854 | issue 作者 |
--strict-mcp-config --mcp-config 加 1 个自有服务器 | 3,326 | issue 作者 |
单纯 claude -p | 约 6 万 | 第二位用户 |
claude -p --tools "" | 约 27.6 万 | 第二位用户 |
claude -p --tools "" --strict-mcp-config | 约 5 千 | 第二位用户 |
结论:单纯使用 claude -p 时,由于工具搜索是开启的,连接器只占用名称的开销。真正爆量的是 --tools "" 加上连接器的组合。总量取决于你账号里有多少连接器,所以对比之前先测你自己的情况。
如何测量一次调用消耗了多少 token?
使用 --output-format json,读取响应中的 usage 字段。把输入、缓存写入和缓存读取加起来,这也是 issue 中的计算方式:
claude -p "reply OK" --tools "" --output-format json \
| jq '.usage | .input_tokens + .cache_creation_input_tokens + .cache_read_input_tokens'
分别在加与不加 --strict-mcp-config 的情况下运行同一行。如果差距达到几十万,你遇到的就是本文的情况。想查看已连接的服务器,在交互模式下运行 /mcp,它会列出每个服务器并标出来自 claude.ai 的那些。
不需要工具的调用如何关闭连接器?
加上 --strict-mcp-config。这个参数让 Claude Code 只使用 --mcp-config 传入的服务器,而你没有传入任何服务器,所以结果是零。在 -p 的代码路径中,带上该参数时也会跳过获取 claude.ai 连接器。
claude -p "classify this text: ..." \
--tools "" \
--strict-mcp-config \
--output-format json
这也是 issue 作者在自己程序中采用的修复。
如果脚本需要自己的 MCP 服务器怎么办?
根据你想保留什么,有两种文档化的方案。
- 只保留脚本用到的服务器:
--strict-mcp-config配合指向该服务器配置文件的--mcp-config。在 issue 的测量中,这比单纯 strict 多 472 个 token,正是该服务器工具定义的开销。 - 保留你所有的服务器,但去掉 claude.ai 连接器:通过环境变量或设置只关闭连接器。
# 只用一个服务器
claude -p "..." --tools "" --strict-mcp-config --mcp-config ./one-server.json
# 保留你的服务器,去掉 claude.ai 连接器(对当前 shell 会话生效)
ENABLE_CLAUDEAI_MCP_SERVERS=false claude -p "..." --tools ""
如需永久生效,官方文档(Disable claude.ai connectors)给出了下面这个可放在任意 settings 作用域中的键。通过 --mcp-config 传入的服务器不受影响。
{
"disableClaudeAiConnectors": true
}
如果问题不在连接器,而是 MCP 工具整体,CLI 参考文档记载了 --disallowedTools "mcp__*",可以从上下文中移除所有 MCP 工具。该方案在 issue 中没有被测量。
为什么不用 --bare?
因为 --bare 不使用订阅登录。它会跳过 hooks、skills、插件、MCP 服务器、记忆和 CLAUDE.md,官方文档(headless)也推荐在脚本中使用。但在 bare 模式下 Claude Code "never reads OAuth credentials",因此必须设置 ANTHROPIC_API_KEY,按 API 计费。如果你想在订阅额度内运行脚本,--strict-mcp-config 才是正解。
如何防止更新后问题再次出现?
在脚本里设置上限。issue 讨论中提出的建议是:把每次调用的输入 token 与该类调用的正常范围对比,超出时发出告警。一个最简单的 shell 示例:
TOKENS=$(claude -p "$PROMPT" --tools "" --strict-mcp-config --output-format json \
| jq '.usage | .input_tokens + .cache_creation_input_tokens + .cache_read_input_tokens')
if [ "$TOKENS" -gt 30000 ]; then
echo "alert: call used $TOKENS input tokens" >&2
fi
issue 作者对通常只用约 2,500 token 的调用设置了 30,000 的上限。请按你的情况调整。关键在于:某次更新开始额外加载内容时,你当天就能发现,而不是等到三天的额度被耗光。
在 Verboo Code 中,脚本模式同样支持这些参数(verboo -p --tools "" --strict-mcp-config),而且 token 无限量:每隔几分钟运行一次的脚本,也不会吃掉你工作日的额度。



