[BUG] Claude.ai mobile/desktop app caches MCP tools/list indefinitely — server-side tool schema updates never reflected without manual reconnect
Description
Claude.ai mobile app (iOS/Android) and desktop app cache the MCP tools/list response from when the connector was first added. After the MCP server updates tool definitions (adding/removing required parameters, changing descriptions, or removing tools entirely), these apps continue to show the stale cached schema indefinitely.
Claude.ai web version and Claude Code do NOT have this issue — they fetch fresh tools/list on each new conversation or session.
Steps to Reproduce
- Add a custom MCP connector on claude.ai (web) — tools appear correctly with all parameters
- Open the same account on Claude mobile/desktop app — tools appear correctly (same as web)
- Update the MCP server: add a new required parameter to a tool, remove an old tool, or change descriptions
- On web: start a new conversation → sees updated tools ✅
- On mobile/desktop app: start a new conversation → still shows old tools/schema ❌
Expected Behavior
Apps should fetch fresh tools/list at minimum when:
- Starting a new conversation
- Receiving a
notifications/tools/list_changednotification from the server - After a reasonable cache TTL (e.g., 1 hour)
Actual Behavior
Apps use the cached tools/list from when the connector was first added. Specific symptoms observed:
- New required parameters not visible: Server added
intent(required) tooctodock_doanddifficulty(required) tooctodock_help. Web version shows them correctly. App versions don't show these parameters at all → AI doesn't fill them → degraded functionality - Removed tools still visible: Server removed
octodock_soptool months ago (consolidated into 2 tools). App still shows 3 tools including the removed one → AI tries to call non-existent tool → errors - Updated descriptions not reflected: Tool descriptions were updated with version tags and improved guidance. App still shows old descriptions
Server-Side Verification
The MCP server correctly returns updated tools/list (verified via curl):
curl -X POST "https://example.com/mcp/{key}" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
Returns 2 tools with correct required fields. ✅
Server also:
- Declares
"tools": { "listChanged": true }in capabilities ✅ - Sends
notifications/tools/list_changedin POST response SSE streams ✅
Workaround
Delete the connector in app settings and re-add it. This forces a fresh tools/list fetch. However, users shouldn't need to do this after every server update.
Environment
- Claude.ai iOS app (latest version as of 2026-03-24)
- Claude.ai desktop app (also affected)
- Claude.ai web version (NOT affected — works correctly)
- Claude Code CLI (NOT affected — works correctly)
- MCP server: Streamable HTTP, stateless (
sessionIdGenerator: undefined) - Server framework: @modelcontextprotocol/sdk + Next.js
Suggestion
- Handle
notifications/tools/list_changed: When received in a POST response SSE stream, re-fetchtools/list - Cache TTL: Refresh tools periodically (e.g., every 1 hour or at conversation start)
- Manual refresh: Add a "Refresh tools" button in connector settings
Related Issues
- #7519 — Claude Desktop MCP client caches manifest/tools
- #17975 — Feature Request: MCP Tool Caching and Hot-Reload Support
- #13646 — MCP tool list not refreshed on notifications/tools/list_changed event
This issue has 2 comments on GitHub. Read the full discussion on GitHub ↗