ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

claude code的常用内置工具:WebSearch、WebFetch 与 MCP 的配置与验证

claude code的常用内置工具:WebSearch、WebFetch 与 MCP 的配置与验证

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读内容,两步都通,才算真正接上了。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进