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)
- Connector status: Connected ✅
- Resources:
list_mcp_resources / read_resource_link work ✅
- Connector Settings UI: lists the current 5 tools, "Tool list updated" ✅
- In-conversation
tool_search: returns ONLY Server B's tools; never Server A's ❌
- Direct invocation in chat: "Tool not found" ❌
- 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
- Add two remote Streamable-HTTP MCP custom connectors (stateless, JSON) on one account.
- Confirm both appear "Connected" and both list their tools in Settings.
- 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.
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_searchreturns 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_askwas removed; the server now exposesgruenerator_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 callgruenerator_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 currenttools/list, even though the Settings/discovery path is.Environment
enableJsonResponse), MCP TypeScript SDK 1.29, endpointhttps://mcp.gruenerator.eu/mcptool_search.Symptom (precise)
list_mcp_resources/read_resource_linkwork ✅tool_search: returns ONLY Server B's tools; never Server A's ❌gruenerator_ask— a tool removed from Server A weeks ago ❌Server is provably correct
Verified via
curl:initialize→ capabilities{ tools, resources, prompts }, noMcp-Session-Idheader (stateless)tools/list→ the current 5 tools, valid JSON-RPC 2.0,Content-Type: application/jsontools/call→ succeedsThe same server also works fine as a Claude Code MCP server (tools listed and callable). A server-side
/health/mcpendpoint reportsclaudeAiReady: true,jsonResponseMode: true,stateless: true.(Happy to share full
initialize+tools/listcurl transcripts on request.)Why this looks like a client/backend bug, not a server bug
curl+ Claude Code end-to-end.tool_searchpath behaves as if Server A contributes zero tools, and even references a removed tool — i.e. it is serving a stale index.tool_searchnormally.Discriminators / questions
tool_searchindex only one ("winning") connector and miss the others?tools/list(which would explain the removed-tool reference)?Repro
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.