Summary
han-research's research surface declares WebSearch, which does not exist on Claude Code installs backed by AWS Bedrock or Google Vertex. Because a tools: / allowed-tools: list can only narrow what the harness offers, the declaration is inert rather than additive: the agent silently loses its only discovery mechanism and keeps going.
Affected declarations:
han-research/agents/research-analyst.md — tools: Read, Glob, Grep, WebSearch, WebFetch
han-research/skills/research/SKILL.md — allowed-tools: Read, Glob, Grep, Agent, WebSearch, WebFetch, Bash(find *), ...
Why it matters
WebSearch is an Anthropic-hosted server-side tool, not a local one. On a Bedrock-backed install it is absent from the session's tool registry entirely — ToolSearch for it returns No matching deferred tools found, and it does not appear even as a deferred tool.
The result is a silent capability loss in the one agent whose stated purpose depends on it. research-analyst is described as researching "options, prior art, trade-offs ... by gathering sourced evidence from the open web". With WebSearch unavailable it retains only WebFetch, which can retrieve a URL it already knows but cannot discover one. It can still verify a named candidate; it cannot find an unnamed one.
Nothing surfaces the degradation. The agent does not report that its primary tool is missing, and the caller cannot tell a thorough survey from a fetch of the few candidates that happened to be named in the prompt. That is the part I would most like fixed, independent of everything below: a research report produced without search should say so.
The allowlist blocks the natural workaround
A user who already has an MCP search server cannot route around this. Since tools: is a closed allowlist and lists no MCP tools, a server registered at user scope — Exa, Brave, Tavily, Kagi — is still not granted to the agent. The only local fix is to fork the agent definition into ~/.claude/agents/, which then drifts from upstream on every han-research release.
Possible directions
Rough order of preference, and I have no attachment to any of them:
- Have the research agent and skill detect that
WebSearch is absent and state it in the output, rather than degrading silently. Useful on its own even if nothing else changes.
- Document a supported extension point for adding an MCP search tool to the research agents without forking the definition.
- Declare common MCP search tool patterns alongside
WebSearch so a user-configured server is picked up when present. I do not know whether the plugin format supports optional or wildcard tool entries that no-op when unmatched — that may make this a non-starter.
A documented fallback chain (WebSearch → MCP search server → WebFetch against registry and API endpoints) would also help. In practice WebFetch against api.github.com/search/repositories, registry.npmjs.org/<pkg>, and pypi.org/pypi/<pkg>/json recovers a usable fraction of discovery and gives more reliable release dates and licenses than scraping rendered pages — but an agent only does that if something tells it to.
Environment
- Claude Code 2.1.263, Linux (WSL2)
CLAUDE_CODE_USE_BEDROCK=1, region eu-north-1
han-research 1.0.1
- Reproduces with any
han-research:research-analyst invocation: the agent runs, never calls WebSearch, and reports as though the sourcing standard was met.
Summary
han-research's research surface declaresWebSearch, which does not exist on Claude Code installs backed by AWS Bedrock or Google Vertex. Because atools:/allowed-tools:list can only narrow what the harness offers, the declaration is inert rather than additive: the agent silently loses its only discovery mechanism and keeps going.Affected declarations:
han-research/agents/research-analyst.md—tools: Read, Glob, Grep, WebSearch, WebFetchhan-research/skills/research/SKILL.md—allowed-tools: Read, Glob, Grep, Agent, WebSearch, WebFetch, Bash(find *), ...Why it matters
WebSearchis an Anthropic-hosted server-side tool, not a local one. On a Bedrock-backed install it is absent from the session's tool registry entirely —ToolSearchfor it returnsNo matching deferred tools found, and it does not appear even as a deferred tool.The result is a silent capability loss in the one agent whose stated purpose depends on it.
research-analystis described as researching "options, prior art, trade-offs ... by gathering sourced evidence from the open web". WithWebSearchunavailable it retains onlyWebFetch, which can retrieve a URL it already knows but cannot discover one. It can still verify a named candidate; it cannot find an unnamed one.Nothing surfaces the degradation. The agent does not report that its primary tool is missing, and the caller cannot tell a thorough survey from a fetch of the few candidates that happened to be named in the prompt. That is the part I would most like fixed, independent of everything below: a research report produced without search should say so.
The allowlist blocks the natural workaround
A user who already has an MCP search server cannot route around this. Since
tools:is a closed allowlist and lists no MCP tools, a server registered at user scope — Exa, Brave, Tavily, Kagi — is still not granted to the agent. The only local fix is to fork the agent definition into~/.claude/agents/, which then drifts from upstream on everyhan-researchrelease.Possible directions
Rough order of preference, and I have no attachment to any of them:
WebSearchis absent and state it in the output, rather than degrading silently. Useful on its own even if nothing else changes.WebSearchso a user-configured server is picked up when present. I do not know whether the plugin format supports optional or wildcard tool entries that no-op when unmatched — that may make this a non-starter.A documented fallback chain (
WebSearch→ MCP search server →WebFetchagainst registry and API endpoints) would also help. In practiceWebFetchagainstapi.github.com/search/repositories,registry.npmjs.org/<pkg>, andpypi.org/pypi/<pkg>/jsonrecovers a usable fraction of discovery and gives more reliable release dates and licenses than scraping rendered pages — but an agent only does that if something tells it to.Environment
CLAUDE_CODE_USE_BEDROCK=1, regioneu-north-1han-research1.0.1han-research:research-analystinvocation: the agent runs, never callsWebSearch, and reports as though the sourcing standard was met.