claude -p 配合 --tools "" 每次调用消耗 40 万 token:用 --strict-mcp-config 解决
返回博客
文章claude codetroubleshootingmcpagente de programaçãodev tools

claude -p 配合 --tools "" 每次调用消耗 40 万 token:用 --strict-mcp-config 解决

Mafra2026年11月2日阅读约 5 分钟

你在脚本里用 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,388issue 作者
+ --strict-mcp-config2,854issue 作者
ENABLE_CLAUDEAI_MCP_SERVERS=false,不加 strict2,854issue 作者
--strict-mcp-config --mcp-config 加 1 个自有服务器3,326issue 作者
单纯 claude -p约 6 万第二位用户
claude -p --tools ""约 27.6 万第二位用户
claude -p --tools "" --strict-mcp-config约 5 千第二位用户

结论:单纯使用 claude -p 时,由于工具搜索是开启的,连接器只占用名称的开销。真正爆量的是 --tools "" 加上连接器的组合。总量取决于你账号里有多少连接器,所以对比之前先测你自己的情况。

流程图:claude -p 配合空 --tools 会全量加载 MCP,用 --output-format json 测量,用 --strict-mcp-config 关闭所有 MCP,或用 ENABLE_CLAUDEAI_MCP_SERVERS=false 只关闭连接器;如需一个 MCP,用 strict 加单个服务器的 --mcp-config
从症状到修复。来源:Claude Code 官方文档(mcp 与 cli-reference)及 issue #106413。

如何测量一次调用消耗了多少 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 无限量:每隔几分钟运行一次的脚本,也不会吃掉你工作日的额度。

喜欢这篇文章吗?
把知识分享给你的朋友。
// 继续阅读

相关文章