1. Claude Code 内置工具链到底能做什么:WebSearch、WebFetch 与 MCP 的调用边界
Claude Code 内置工具链里,WebSearch、WebFetch 和 MCP 这三样东西经常被混在一起聊,但它们的职责其实分得很清楚。WebSearch 负责“找门”——你给它一个查询词,它返回一批候选页面的标题和 URL;WebFetch 负责“进门读内容”——你给它一个明确 URL 和一个问题,它把页面抓下来、提炼出针对这个问题的回答;MCP 则是“外挂工具箱”,让 Claude Code 能连上数据库、文档系统、日志服务等外部资源,把原本不在上下文里的数据拉进来。
这套组合适合谁?适合已经在用 Claude Code 写代码、查文档、做技术调研,但总觉得“它怎么不自己去搜一下”的开发者。默认情况下,Claude Code 并不会无限制地替你上网,它有一套安全边界:WebFetch 只能抓取已经出现在对话上下文里的 URL,包括你直接贴的、或 WebSearch 结果里出现过的链接,Claude 不能自己凭空构造 URL 去请求。这个设计是为了防止数据外泄,但也意味着你得理解它的调用顺序,才能让检索和抓取真正跑通。
我试过在排查一个 Kubernetes Gateway API 的版本差异时,直接问“帮我查最新变化”,Claude Code 会先触发 WebSearch,拿到一批链接,再对其中看起来最相关的几条调用 WebFetch,最后综合成一段回答。整个过程不需要你手动复制粘贴 URL,但前提是工具配置正确、MCP 服务可用、网络出口稳定。如果其中任何一环断了,你看到的可能就是“搜索无结果”或者“抓取失败”。
所以这篇文章不打算泛泛讲概念,而是聚焦落地:怎么在 settings 里把该开的开关打开,怎么配一个可用的 MCP Server,怎么用一次真实的检索加抓取任务来验证工具是否生效,以及遇到 401、local proxy failed、reading choices 这类报错时怎么排查。你跟着做一遍,就能判断自己的 Claude Code 内置工具链到底通没通。
2. TaoToken 前置配置:Base URL、API Key 与 Model ID 三件套
在动 WebSearch 和 WebFetch 之前,得先把 Claude Code 的模型接入配好。因为 WebSearch 会派生一个次级对话来执行搜索,WebFetch 会派生一个 Haiku 次级对话来处理页面内容,这些次级调用同样走你的模型接入通道。如果主通道没配好,工具链根本跑不起来。
TaoToken 在这里的角色是提供统一的 API 入口。你需要在 Claude Code 的配置里填三样东西:Base URL、API Key、Model ID。Base URL 用https://taotoken.net/api,注意这个地址不带任何查询参数;API Key 在控制台的 API Keys 页面生成;Model ID 根据你实际要用的模型填写,比如claude-sonnet-4-20250514或claude-opus-4-20250514。
先拿到 Key。打开https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite,登录后创建一个新的 Key,复制出来。这个 Key 只显示一次,丢了就得重建。拿到之后,Claude Code 的配置文件通常放在~/.claude/settings.json,如果你用的是项目级配置,也可以放在项目根目录的.claude/settings.json。下面是一个可复制的最小配置片段:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_API_KEY": "sk-你的TaoTokenKey", "ANTHROPIC_MODEL": "claude-sonnet-4-20250514" } }如果你用的是 Codex 风格的auth.json,结构会不太一样,但核心三件套不变:
{ "base_url": "https://taotoken.net/api", "api_key": "sk-你的TaoTokenKey", "model": "claude-sonnet-4-20250514" }配好之后,先别急着测 WebSearch。先用一个最简单的对话请求确认主通道是通的。在终端里跑:
claude -p "用一句话说明你现在用的是哪个模型"如果返回了模型名称和一句正常回答,说明 Base URL、Key、Model ID 三件套生效了。如果报 401,优先检查 Key 有没有复制完整、有没有多余空格;如果报连接超时,检查 Base URL 是不是写成了带路径的地址,正确写法就是https://taotoken.net/api,后面不要加/v1或/chat/completions。
这一步看起来基础,但后面 WebSearch 和 WebFetch 的次级调用都依赖它。主通道不稳,工具链的验证结果就没有参考意义。另外,如果你打算长期用 Coding Plan 做 Agent 类任务,可以在控制台里确认一下套餐余量,避免跑到一半额度不够。
3. 可复制配置:settings 与 MCP 片段怎么写
配置分两层:一层是 Claude Code 自身的 settings,控制 WebSearch、WebFetch 的启用和权限;另一层是 MCP Server 的配置,决定 Claude Code 能连上哪些外部资源。两层都配好,工具链才算完整。
先看 settings。Claude Code 默认会启用内置的 WebSearch 和 WebFetch,但权限策略可能因版本而异。你可以在settings.json里显式声明允许的工具:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_API_KEY": "sk-你的TaoTokenKey", "ANTHROPIC_MODEL": "claude-sonnet-4-20250514" }, "permissions": { "allow": [ "WebSearch", "WebFetch" ] } }这里permissions.allow是一个白名单,把 WebSearch 和 WebFetch 加进去,Claude Code 在需要时就能直接调用,不会每次都弹确认。如果你希望更保守,可以不加,让它在调用前询问你。实测下来,做技术调研时加上更顺手,因为一次检索可能触发多次 WebFetch。
接下来是 MCP 配置。MCP Server 的配置通常放在~/.claude/mcp.json或项目级的.mcp.json。下面是一个 stdio 类型的 MCP Server 示例,假设你有一个本地的文档服务:
{ "mcpServers": { "docs-server": { "command": "node", "args": ["/path/to/your/mcp-docs-server/index.js"], "env": { "DOCS_ROOT": "/path/to/docs" } } } }如果你要接的是 HTTP 类型的 MCP Server,配置会变成:
{ "mcpServers": { "remote-docs": { "url": "https://your-mcp-server.example.com/mcp", "headers": { "Authorization": "Bearer 你的MCP服务Token" } } } }注意,HTTP 类型的 MCP Server 在 Resources 操作上目前还有一些已知问题,比如resources/list和resources/read在部分版本里表现不稳定。如果你主要用 MCP 的 Tools 原语,HTTP 类型通常没问题;如果你要用 Resources 原语来浏览数据库 schema 或读取项目文档,优先选 stdio 类型,稳定性更好。
配好之后,用claude mcp list查看当前注册的 MCP Server。如果列表里出现了你配置的 server 名称,说明注册成功。再用claude mcp get docs-server看详情,确认 command、args、env 都正确加载。这一步能提前发现路径写错、环境变量缺失之类的问题,避免后面调用时才发现。
还有一点:MCP 的 Tools 和 Resources 是两个不同的原语。Tools 是模型自己决定何时调用的,类似函数调用;Resources 是由客户端或用户决定何时读取的,类似只读文件。Claude Code 把resources/list和resources/read封装成了ListMcpResourcesTool和ReadMcpResourceTool,让模型能主动发现和读取 MCP Server 暴露的资源。你在配置时不用手动指定这两个工具,它们会随着 MCP Server 的注册自动可用。
4. 验证请求:一次检索加抓取任务的完整过程
配置写完,得用一次真实任务来验证。我选一个技术调研场景:查 Kubernetes Gateway API 的最新变化。这个任务会同时触发 WebSearch 和 WebFetch,能一次性验证两个工具是否生效。
在 Claude Code 里输入:
帮我查一下 Kubernetes Gateway API 最近有什么重要变化,重点看 2025 年的更新。正常情况下,你会看到 Claude Code 先调用 WebSearch,查询词大概是Kubernetes Gateway API 2025 changes。WebSearch 返回一批结果,每条包含标题和 URL。然后 Claude Code 会从这些 URL 里挑几条看起来最相关的,依次调用 WebFetch,每次传入一个 URL 和一个问题,比如“总结这个页面里提到的 Gateway API 主要变化”。
WebFetch 的工作方式值得留意:它不用 Anthropic 服务端的抓取工具,而是通过本地 HTTP 客户端直接抓取页面 HTML,然后派生一个次级对话来处理内容。这个次级对话的模型通常是 Haiku 这类轻量模型,因为完整页面转换后可能有 10 到 100 KB,直接推给主模型成本高,还会挤占代码上下文。Haiku 先过滤成“只回答这个问题”的摘要,再把摘要返回主对话。所以你看到的最终回答,其实是主对话综合了多个 WebFetch 摘要后的结果。
验证成功的标志有三个:第一,你能在输出里看到 WebSearch 返回的链接列表,说明搜索通道通了;第二,你能看到 WebFetch 对至少一个 URL 的抓取和摘要,说明抓取通道通了;第三,最终回答里引用了具体页面的内容,而不是泛泛而谈,说明次级对话的处理也正常。
如果你想更精确地验证,可以手动指定一个 URL 让 Claude Code 用 WebFetch 抓:
用 WebFetch 抓取 https://gateway-api.sigs.k8s.io/ ,总结这个页面主要讲什么。注意,WebFetch 只能抓取已经出现在对话上下文里的 URL。你直接贴的这个 URL 算上下文里出现过,所以能抓。但如果你让 Claude Code “自己去猜一个 URL 然后抓”,它会拒绝,因为安全限制不允许它构造 URL。这是设计如此,不是 bug。
验证 MCP 的话,可以先用ListMcpResourcesTool看资源列表。在对话里输入:
列出 docs-server 这个 MCP Server 暴露的所有资源。如果返回了一组 URI 和名称,说明resources/list通了。然后挑一个 URI 读取:
读取 docs://architecture.md 的内容。如果返回了文档正文,说明resources/read也通了。这两个动作分别对应ListMcpResourcesTool和ReadMcpResourceTool,是验证 MCP Resources 是否可用的最直接方式。
5. 常见报错排查:401、local proxy failed、reading choices 与 OAuth
工具链跑不通时,报错信息往往指向不同环节。下面按真实遇到的报错来排查。
401 Unauthorized:最常见,出现在主通道或次级调用上。先检查ANTHROPIC_API_KEY是否有效,有没有过期或被撤销。然后确认 Base URL 是不是https://taotoken.net/api,不要写成带/v1的地址。如果 Key 是从控制台复制的,注意有没有把前后空格带进去。还有一种情况是环境变量被其他配置覆盖了,比如 shell 里 export 了一个旧的ANTHROPIC_API_KEY,这时候 settings.json 里的值可能不生效。用echo $ANTHROPIC_API_KEY确认一下当前环境变量。
local proxy failed:这个报错通常出现在 WebFetch 阶段,因为 WebFetch 走本地 HTTP 客户端抓页面。如果本地网络出口不稳定,或者目标站点有访问限制,就会报这个。先确认你的网络能正常访问目标 URL,可以用curl -I https://目标URL测一下。如果 curl 能通但 WebFetch 报错,检查 Claude Code 的版本,旧版本在代理配置上可能有兼容问题。另外,如果你在公司内网,可能需要配置HTTP_PROXY或HTTPS_PROXY环境变量,但注意不要用任何违规的代理工具,用公司合规的网络出口即可。
reading choices 相关报错:这个通常出现在模型返回格式不符合预期时,比如次级对话返回的内容结构不对,主对话解析失败。排查方向是确认 Model ID 是否正确。如果你填了一个不存在的模型名,次级调用可能返回异常格式。另外,WebFetch 的次级对话默认用 Haiku,如果你在配置里强制指定了一个不支持的模型,也可能触发这个报错。检查ANTHROPIC_MODEL和任何覆盖次级模型的配置。
OAuth 相关报错:如果你用的是需要 OAuth 认证的 MCP Server,报错可能指向 token 过期或 scope 不足。先重新走一遍 OAuth 授权流程,确认 token 有效。然后检查 MCP 配置里的 headers 是否正确携带了 Authorization。对于 stdio 类型的 MCP Server,OAuth 通常由 server 自己处理,你只需要保证 env 里的凭证正确。
MCP Resources 操作失败:如果你用的是 HTTP 类型的 MCP Server,resources/list或resources/read可能报错。这是已知问题,stdio 类型的 Server 通常正常。排查方法是先用claude mcp get <server-name>确认 server 类型,如果是 HTTP 且 Resources 操作失败,考虑换一个 stdio 类型的实现,或者暂时只用 MCP Tools,不用 Resources。
排查时有一个通用原则:先确认主通道通,再确认工具权限开,最后确认 MCP Server 注册成功。三层逐层验证,比一上来就猜问题要快得多。
6. 把工具链用起来:从验证到日常编码的衔接
工具链验证通过之后,日常使用其实很自然。你不需要每次都手动触发 WebSearch 或 WebFetch,Claude Code 会根据任务需要自己决定。比如你问一个涉及最新 API 变化的问题,它会先搜再抓;你贴一个文档链接让它总结,它会直接 WebFetch。MCP 则在你需要访问外部数据源时自动介入,比如查数据库 schema、读项目文档、看日志。
如果你打算长期用这套工具链做编码和 Agent 类任务,可以关注一下 Coding Plan 的额度情况。WebSearch 和 WebFetch 的次级调用会消耗 token,MCP 的资源读取也会计入上下文。控制台里能看到用量明细,方便你判断是否需要调整套餐。地址是https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite。
另外,如果你对模型对话本身的效果想单独验证,可以用模型对话页面直接测一轮,确认模型回答质量符合预期,再回到 Claude Code 里跑工具链。地址是https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=model-chat&utm_campaign=rewrite。
接入文档在https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite,里面有针对不同客户端的配置示例,遇到 settings 格式不确定时可以对照。API Keys 管理在https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite,需要新建或轮换 Key 时用。
最后说一个实际经验:WebSearch 加 WebFetch 的组合能覆盖大部分日常搜索需求,但如果你需要更精细的结果控制,比如限定站点、限定时间范围,可以叠加 Brave Search MCP 这类插件。两者不冲突,内置工具负责通用检索,MCP 插件负责特定场景。配置时注意 MCP Server 的 Resources 和 Tools 是两套原语,别混用。stdio 类型的 Server 在 Resources 上更稳,HTTP 类型在 Tools 上更通用。按你的实际数据源类型来选,验证时先用ListMcpResourcesTool看列表,再用ReadMcpResourceTool读内容,两步都通,才算真正接上了。