Skip to content

Research agent declares WebSearch, which is absent on Bedrock/Vertex, and degrades to fetch-only without saying so #212

Description

@diblaze

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.mdtools: Read, Glob, Grep, WebSearch, WebFetch
  • han-research/skills/research/SKILL.mdallowed-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:

  1. 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.
  2. Document a supported extension point for adding an MCP search tool to the research agents without forking the definition.
  3. 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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions