多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

MCP 工具定义一次塞入 55k tokens?TaoToken 这样改通道,再用 Subagent 隔离

MCP 工具定义一次塞入 55k tokens?TaoToken 这样改通道,再用 Subagent 隔离 MCP 工具定义一次塞入 55k tokensTaoToken 这样改通道再用 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_sourcetaotoken_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_sourcetaotoken_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_URLhttps://taotoken.net/api export ANTHROPIC_AUTH_TOKENYOUR_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.jsonGitHub 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_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentapi-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_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentdoc 里有对照版本字段名对不上时以文档为准。如果你不只是跑单次调试而是要把这套结构长期用在日常编码和 Agent 长会话里可以看一下 Coding Plan https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentcoding-plan 把通道和额度规划一起定下来省得每次都回来改配置。
返回列表