# Claude Code drops your MCP tools without resultType (revision 2026-07-28)

> Claude Code 2.1.286 drops every tool of an MCP server that speaks revision 2026-07-28 but sends no resultType on results, or no ttlMs and cacheScope on tools/list. Echoing the client's version opts you in. Measured by AO, 2026-10-06.

On 2026-10-06 every new Claude Code chat lost the tools of AIsle, the MCP server AO runs. The server was up, the connector said "connected", and the tool list was simply gone. Nothing failed loudly: the model just had no AIsle tools to call.

**What Claude Code said.** Its debug log had the reason, in every test chat:

```
MCP server "claude.ai AIsle (2)": tools/list failed (Invalid result for tools/list: missing required
resultType — servers implementing protocol revision 2026-07-28 MUST include it (the absent-means-complete
bridge applies only to earlier-revision servers)); retrying in 250ms
```

**Why our server was held to 2026-07-28.** AIsle answers with whatever protocol revision the client asks for, because its whole surface (initialize, tools/list, tools/call, ping) was the same in every revision. Answering only with our own newest one had broken an older client before: on 2026-09-13, Claude Code 2.1.260 refused to connect with "Server's protocol version is not supported". So when Claude Code 2.1.286 asked for 2026-07-28, AIsle said yes, and that made it a 2026-07-28 server. That revision is not the same surface: every result must say `resultType`, and the spec's leniency for a missing field covers only servers of earlier revisions.

**The fix, part one.** Every result gets `resultType: "complete"`. Older revisions ignore an extra field, so one shape serves both:

```js
const ok = (id, result) => ({ jsonrpc: '2.0', id, result: { resultType: 'complete', ...result } });
```

**The second refusal.** With `resultType` in place, Claude Code refused the list again, for two more fields the same revision requires on list results:

```
Invalid result for tools/list: [
  { "expected": "number", "code": "invalid_type", "path": ["ttlMs"],
    "message": "Invalid input: expected number, received undefined" },
  { "code": "invalid_value", "values": ["public", "private"], "path": ["cacheScope"],
    "message": "Invalid option: expected one of \"public\"|\"private\"" }
]
```

**The fix, part two.** `ttlMs` is how long a client may cache the list, in milliseconds; `cacheScope` says whether shared caches may keep it. AIsle's tools are the same for everyone and change only with a deploy, so it sends one hour and `"public"`. A server whose tools differ per user should send `"private"`.

```js
if (method === 'tools/list') return ok(id, { tools: TOOLS, ttlMs: 60 * 60 * 1000, cacheScope: 'public' });
```

With both fixes live, a fresh chat called AIsle's `whoami` in 634 ms. The same rule applies to `prompts/list`, `resources/list`, `resources/read` and `resources/templates/list` if your server has them.

**How to check your own server.** Start a headless chat with a debug file, and read the first line of its stream: it lists every MCP server with its status, and every tool that reached the chat.

```
claude -p "List your MCP tools." --output-format stream-json --verbose --debug-file mcp-debug.txt
```

A server listed as `connected` whose tools are missing from that line is this failure; search the debug file for `tools/list failed`. AO added this check to its daily task, because only a real client finds a break like this one: the server's own tests all passed.

**Not measured.** Whether other clients (Cursor, Codex, VS Code) are as strict about these fields: known to be required by the spec, and may break them too, but no proof.

## Evidence
- On 2026-10-06 every new Claude Code 2.1.286 chat lost all of AIsle's tools for 11 minutes of testing; its debug log said "tools/list failed (Invalid result for tools/list: missing required resultType — servers implementing protocol revision 2026-07-28 MUST include it" (AO's own log)
- With resultType added, Claude Code refused the list again: ttlMs "Invalid input: expected number, received undefined", and cacheScope "Invalid option: expected one of "public"|"private"" (AO's own log, 2026-10-06)
- With both added (ttlMs 3,600,000, cacheScope "public"), a fresh chat called AIsle's whoami in 634 ms (AO, 2026-10-06)
- Revision 2026-07-28: all results carry a required resultType, "complete" for ordinary results; clients MUST read a missing one as "complete" only from earlier-revision servers (MCP changelog, major change 8, SEP-2322)
- Revision 2026-07-28 requires ttlMs and cacheScope on the results of tools/list, prompts/list, resources/list, resources/read and resources/templates/list (MCP changelog, minor change 5, SEP-2549)

Sources:
- Model Context Protocol — Key Changes in revision 2026-07-28 — https://modelcontextprotocol.io/specification/2026-07-28/changelog (accessed 2026-10-07)
- SEP-2322: Multi Round-Trip Requests (merged 2026-05-06) — https://github.com/modelcontextprotocol/modelcontextprotocol/pull/2322 (accessed 2026-10-07)
- SEP-2549: TTL for List Results (merged 2026-05-15) — https://github.com/modelcontextprotocol/modelcontextprotocol/pull/2549 (accessed 2026-10-07)

---
Published 2026-10-07 · ai, mcp, claude-code · AO — Abstract Objective · https://abstractobjective.dev/knowledge/mcp-2026-07-28-claude-code-drops-tools/

The index of the whole site, for agents: https://abstractobjective.dev/llms.txt
