Skip to content

[BUG] claude.ai web: custom connector tools shown in Settings but not injected into the in-conversation tool registry (model even calls a tool removed from the server) #552

Description

@Movm

Summary

On claude.ai (web), a remote Streamable-HTTP MCP custom connector reaches a fully healthy state — connected, resources readable, and the connector Settings page lists all its tools ("Read-only tools: 5", correct titles, "Tool list updated"). But in an actual chat the model cannot find or call these tools: tool_search returns only a different connector's tools, and direct invocation returns "Tool not found". Discovery (Settings) and execution (chat) appear to be desynced.

Strongest signal: the model calls a tool that no longer exists on the server

Server A's tools changed weeks ago — an old gruenerator_ask was removed; the server now exposes gruenerator_search, gruenerator_get_filters, gruenerator_cache_stats, gruenerator_examples_search, get_client_config. The Settings page shows the current tools. Yet in chat the model still tries to call gruenerator_ask — a tool the server hasn't advertised in weeks. A model can only know that name from a stale cached tool index → the in-conversation registry isn't re-synced with the server's current tools/list, even though the Settings/discovery path is.

Environment

  • Surface: claude.ai web app (Settings → Connectors → Custom Connector)
  • Server A (affected): remote MCP, Streamable HTTP, stateless, JSON responses (enableJsonResponse), MCP TypeScript SDK 1.29, endpoint https://mcp.gruenerator.eu/mcp
  • Server B (working sibling): a second custom MCP on the same account (also SDK 1.29, Streamable HTTP, JSON) that works in chat — its tools DO appear in tool_search.

Symptom (precise)

  1. Connector status: Connected ✅
  2. Resources: list_mcp_resources / read_resource_link work ✅
  3. Connector Settings UI: lists the current 5 tools, "Tool list updated" ✅
  4. In-conversation tool_search: returns ONLY Server B's tools; never Server A's ❌
  5. Direct invocation in chat: "Tool not found" ❌
  6. The model even attempts gruenerator_ask — a tool removed from Server A weeks ago ❌

Server is provably correct

Verified via curl:

  • initialize → capabilities { tools, resources, prompts }, no Mcp-Session-Id header (stateless)
  • tools/list → the current 5 tools, valid JSON-RPC 2.0, Content-Type: application/json
  • tools/call → succeeds

The same server also works fine as a Claude Code MCP server (tools listed and callable). A server-side /health/mcp endpoint reports claudeAiReady: true, jsonResponseMode: true, stateless: true.

(Happy to share full initialize + tools/list curl transcripts on request.)

Why this looks like a client/backend bug, not a server bug

  • Server passes curl + Claude Code end-to-end.
  • Discovery clearly reaches Server A (Settings lists the exact current tools with correct titles).
  • Yet the execution / tool_search path behaves as if Server A contributes zero tools, and even references a removed tool — i.e. it is serving a stale index.
  • A sibling connector on the same account populates tool_search normally.
  • → discovery (Settings) and execution (chat tool registry) appear to use separate, independently-cached code paths.

Discriminators / questions

  • Is per-conversation tool indexing capped to / selecting only a subset of connected connectors?
  • Does tool_search index only one ("winning") connector and miss the others?
  • Is the in-conversation tool registry cached from an earlier connection and never re-synced with the server's current tools/list (which would explain the removed-tool reference)?
  • Is a stateless + JSON-response Streamable-HTTP connector treated differently at the execution-indexing stage than at Settings-discovery?

Repro

  1. Add two remote Streamable-HTTP MCP custom connectors (stateless, JSON) on one account.
  2. Confirm both appear "Connected" and both list their tools in Settings.
  3. In a chat, use tool_search — observe only one connector's tools are available; the other's are never surfaced, and direct calls to them fail.

Related

Impact

The connector is unusable in chat despite a fully healthy handshake and a correct, curl-verified, Claude-Code-compatible server.

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