MCP 工具定义一次塞入 55k tokens?TaoToken 这样改通道,再用 Subagent 隔离
如果你最近在 Claude Code 里挂过 GitHub MCP Server,大概率见过这个现象:会话刚开,什么都还没干,/context就已经红了一半。原因不神秘——GitHub MCP Server 暴露了 93 个工具,每个工具都带 name、description 和完整的 JSON Schema,一次性写进 tools 数组,合计约 55,000 tokens。这些定义在整轮对话里常驻,模型还没开始思考,注意力已经被工具说明书稀释掉了。
这篇只写一件事:把 Claude Code 的模型通道切到 TaoToken(官网 https://taotoken.net/?utm_source=taotoken_aicg_blog_end ),然后把 GitHub MCP Server 整体挪进 Subagent,主 Agent 退回纯调度角色。做完之后,你会得到一个主会话上下文干净、长会话调试不掉智商的结构。整篇按接入配置的视角走,不聊理念,只给能直接复制的东西。
一、先看现场:急加载的 MCP 是怎么把上下文吃掉的
先确认问题边界,不然配置改完你也不知道有没有生效。
MCP 的加载方式是典型的急加载加被动加载:Agent 框架在会话开始前,就把 MCP Server 声明的全部工具定义注入上下文窗口,模型没有选择权,也不能说"我现在不需要 GitHub 工具,先别塞"。这和 AGENTS.md、CLAUDE.md 的注入方式属于同一类,区别只是后者还能靠行数控制,前者由 Server 自己决定。
93 个工具、约 55k tokens 是什么概念?假如你用的模型标称窗口 200K,理论上还剩下 145K。但实测经验里,上下文占用超过 50% 之后,长任务的方向一致性和指令遵循都会明显下滑,越接近 80% 越像换了个模型。也就是说,你为了"顺手能用 gh 查个 PR",先付掉了四分之一的窗口,还要在后续每一轮对话里反复携带这份工具清单。
更麻烦的是长会话调试场景。你在排查一个跨文件的 bug,来回十几轮,每轮都要重新读一遍这 55k。上下文越满,模型越容易忘记你三轮前说过的约束,开始改一些你根本没让它碰的文件。
解法不是把 GitHub MCP 删掉,而是换加载语义:主 Agent 只保留"调度"这一件事,需要 GitHub 操作时,交给一个 Subagent。Subagent 被调用时相当于一个工具,主 Agent 传进去的是 prompt 参数,拿回来的是结果文本;子任务结束后,Subagent 的上下文整体销毁,那 55k 工具定义跟着一起消失,主会话历史里只留一句返回摘要。
二、TaoToken 前置:先拿到 Key,再把通道指到 /api
这一步的目标很明确:让 Claude Code 通过 TaoToken 发请求。
打开 https://taotoken.net/?utm_source=taotoken_aicg_blog_end ,注册后在控制台创建 API Key。这个 Key 就是后面配置里的YOUR_API_KEY,只显示一次,复制时注意别把首尾空格带进去。
关键点只有一条:Claude Code 的 Base URL 填https://taotoken.net/api。
不要写成https://taotoken.net/api/v1。Claude Code 会在 base 之后自行拼接/v1/messages,你多写一层 v1,请求就会打到/api/v1/v1/messages,结果是一串看不懂的 404。也不要在这个地址后面加任何 UTM 参数——UTM 是给网页统计用的,写进 API 地址会被当成路径的一部分,直接报错。
Key 建议先放在环境变量里验证一遍,再写进配置文件,这样出问题时能快速判断是 Key 的问题还是配置位置的问题:
export ANTHROPIC_BASE_URL="https://taotoken.net/api" export ANTHROPIC_AUTH_TOKEN="YOUR_API_KEY"然后claude -p "只回复 OK"跑一下。有输出就说明通道通了,接下来再做持久化配置。
三、可复制配置:settings.json、.mcp.json 与 Subagent 定义
3.1 Claude Code 的 settings.json
用户级配置在~/.claude/settings.json,项目级在<项目根>/.claude/settings.json。项目级优先,团队协作建议写项目级,避免每个人本地环境不一致。
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_AUTH_TOKEN": "YOUR_API_KEY", "ANTHROPIC_MODEL": "MODEL_ID", "ANTHROPIC_SMALL_FAST_MODEL": "MODEL_ID" } }两个字段容易踩坑。ANTHROPIC_AUTH_TOKEN和ANTHROPIC_API_KEY在不同版本里支持情况不一样:走第三方通道时优先用ANTHROPIC_AUTH_TOKEN,如果启动后仍然提示鉴权失败,再换成ANTHROPIC_API_KEY试一次。MODEL_ID用你在 TaoToken 控制台或文档里查到的实际模型标识,别照抄别人的,模型名会更新。
3.2 项目级 .mcp.json
GitHub MCP Server 注册在项目根的.mcp.json。下面用 npx 形式举例,包名按你实际使用的 Server 替换:
{ "mcpServers": { "github": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-github"], "env": { "GITHUB_PERSONAL_ACCESS_TOKEN": "YOUR_GITHUB_TOKEN" } } } }到这里,Server 是可用的,但还没隔离。真正决定隔离效果的,是下一步的 Subagent 定义和主 Agent 的调度约束。
3.3 Subagent 定义文件
在项目里新建.claude/agents/github-pr.md:
--- name: github-pr description: 处理 GitHub 远程操作。当任务涉及读取 PR diff、PR 评论、issue 内容、提交评审意见或查看远端分支状态时使用。本地代码修改不要使用本 Agent。 tools: mcp__github__*, Read, Grep, Bash model: inherit --- 你是一个只负责 GitHub 远程操作的子 Agent。 工作规则: 1. 只做远端读写,不修改本地工作区文件。 2. 每次任务结束前,输出一段不超过 400 字的结构化摘要: - 结论(一句话) - 关键证据(文件路径 + 行号 / PR 编号 + 评论链接) - 未决问题 3. 不要在摘要里粘贴完整 diff 或完整工具返回,只保留结论与证据。三个设计点值得解释。
第一,description决定主 Agent 什么时候会调用它,必须写清触发场景和排除场景。写成"处理 GitHub 相关任务"这种模糊描述,主 Agent 要么不调用,要么什么小事都往里丢。
第二,tools是白名单。mcp__github__*表示把该 Server 下的工具授予这个子 Agent,同时允许 Read、Grep、Bash 用于必要的本地取证。工具名格式是mcp__<server名>__<tool名>,server 名要和.mcp.json里的 key 一致。
第三,要求子 Agent 输出摘要而不是原始输出,是隔离的另一半。子 Agent 上下文销毁了,但它返回的内容会留在主会话里;如果它把 3000 行 diff 原样吐回来,你就把省下的 55k 用另一种方式还回去了。
如果你的 Claude Code 版本支持在 Subagent 定义里单独声明 mcpServers,就把 GitHub Server 从项目级.mcp.json移到该文件里,隔离会更彻底;不支持的话,保持.mcp.json+ tools 白名单这个组合,同时在下面加一条主 Agent 的硬约束。
3.4 主 Agent 的调度约束
在项目根CLAUDE.md里加一段:
## GitHub 操作约定 - 主线会话不直接调用任何 mcp__github__ 前缀的工具。 - 所有 GitHub 远端操作一律交给 github-pr 子 Agent。 - 主线只接收子 Agent 的摘要,需要细节时再单独追问一次。这段看起来像"提示词",但在这个结构里它是分工声明:主 Agent 负责拆解、委派、汇总,子 Agent 负责背工具定义干活。
四、验证:主 Agent 保持轻量,Subagent 内部才加载工具
配完不验证,等于没配。按三步走。
第一步,确认模型通道。在项目目录执行claude,进入交互后输入/status,看 Base URL 是否为https://taotoken.net/api。再用一句最小请求确认能拿到回复。如果这一步就失败,先跳到第五节排查,别往下走。
第二步,确认上下文占用。会话开始后立刻执行/context,记录一次 baseline 数值。然后发一条不涉及 GitHub 的任务,比如"读一下 src 目录结构并总结",再执行一次/context。两次差值应该只反映对话本身,不应该出现一次 5 万量级的跳变。如果一开场就跳了几万,说明 MCP 工具定义仍然注入了主会话,回去检查.mcp.json的加载范围和版本行为。
第三步,确认 Subagent 会被触发且能收敛。发一条明确指向远端的任务:
查一下仓库里最近的 PR,找出涉及鉴权模块的那几个,列出编号和改动文件,不要修改任何本地代码。观察三件事。主 Agent 是否调用了github-pr(而不是自己动手);子 Agent 是否产生了 mcp__github__ 系列工具调用;返回主会话的是不是一段摘要,而不是一大坨原始输出。三条都满足,隔离就成立了。
接着做一次长会话压测:在同一个会话里连续追问三轮细节,比如"第二个 PR 的评审意见里有没有反对意见""涉及的测试文件是哪些""把它和第一个 PR 的改动范围做个对比"。每轮之后看/context,占用应该是缓慢线性增长。如果第二轮开始出现明显的注意力涣散——忘记你前面说过的"不要改本地代码"——那基本就是主会话上下文被撑满了,回头检查摘要长度和子 Agent 的返回内容。
成功的状态长这样:主会话里只有任务描述、调度决策和摘要;GitHub 那 93 个工具定义只存在于子 Agent 存活的那几十秒里,任务结束即销毁。
五、本篇常见错排查
Base URL 写成https://taotoken.net/api/v1:最典型。表现为 404 或路径重复报错。改成不带/v1。同样地,别在 API 地址后面拼任何查询参数。
在 API 地址后面加了 UTM:网页链接和 API 地址是两套东西。带 UTM 的地址只在浏览器里访问官网用,接口地址保持干净。
Key 填进 settings.json 后没生效:先确认文件位置的优先级。项目级.claude/settings.json会覆盖用户级~/.claude/settings.json,很多人改的是用户级,实际生效的是项目级。两个都检查一遍。
401 / 鉴权失败:三种可能。Key 复制时带了空格或换行;ANTHROPIC_AUTH_TOKEN与当前版本不匹配,换成ANTHROPIC_API_KEY试;Key 已被删除或额度相关状态异常,回控制台确认。
Subagent 始终不被调用:description太泛。把触发场景写成具体动作,比如"读取 PR diff""提交评审意见",并补上排除项。另外主线的CLAUDE.md约定要写死,否则主 Agent 倾向于自己直接调 MCP 工具。
报工具名不存在:tools里的格式必须是mcp__<server名>__<tool名>,<server名>要和.mcp.json的 key 完全一致,大小写敏感。用*通配时确认当前版本支持这种写法,不支持就逐个列。
隔离做了但上下文照样爆:多半是子 Agent 把原始输出带回来了。在 Subagent 定义里强制摘要格式,限制字数,禁止粘贴完整 diff。摘要进主会话,正文留在子 Agent 里。
MCP Server 启动失败:.mcp.json里command找不到、args包名写错、GitHub Token 环境变量没传进去,都会导致 Server 起不来,进而表现为"子 Agent 说它没有 GitHub 工具"。单独跑一次command + args验证 Server 能启动,再回到 Claude Code 里测。
六、把通道和隔离一次配到位
这一篇的动作可以拆成两半。通道那一半,TaoToken 的 Key 在 https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=api-keys 创建,Claude Code 的 Base URL 填https://taotoken.net/api,字段名和文件位置按第三节的 settings.json 写,出错优先查/v1重复和鉴权字段。隔离那一半,GitHub MCP Server 留在项目.mcp.json,通过.claude/agents/github-pr.md的 tools 白名单交给子 Agent,主 Agent 在CLAUDE.md里声明不碰mcp__github__*。
配置细节和参数说明在接入文档 https://taotoken.net/doc/claude-code-anthropic?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=doc 里有对照版本,字段名对不上时以文档为准。
如果你不只是跑单次调试,而是要把这套结构长期用在日常编码和 Agent 长会话里,可以看一下 Coding Plan https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=coding-plan ,把通道和额度规划一起定下来,省得每次都回来改配置。