# Claude Code MCP server connected but no tools: "missing required resultType" (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 ("missing required resultType") 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`. In the desktop app on Windows, the same lines are in `%LOCALAPPDATA%\claude-cli-nodejs\Cache\<project>\mcp-logs-<server>\*.jsonl` (GitHub issue #97319, where Roblox Studio's official MCP bridge showed `tool_count: 0` this way). If the server is not yours, the fix is the server's: its maker has to send these fields. 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)
- The same refusal hit Roblox Studio's official MCP bridge in the Claude Code desktop app on Windows: "status: connected" with "tool_count: 0" across new sessions and a reboot; the reason was in %LOCALAPPDATA%\claude-cli-nodejs\Cache\<project>\mcp-logs-<server>\*.jsonl (GitHub issue #97319, read 2026-10-17)
- 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)
- anthropics/claude-code issue #97319: MCP client rejects valid tools/list response due to strict validation of ttlMs/cacheScope — https://github.com/anthropics/claude-code/issues/97319 (accessed 2026-10-17)
- 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)

## Related
- [Claude Code PreToolUse updatedInput drops fields silently: it replaces the whole input](https://abstractobjective.dev/ai/claude-code-pretooluse-updatedinput-replaces-whole-input/index.md)
- [White square behind Claude connector icons: Google's copy of an SVG-only favicon is opaque](https://abstractobjective.dev/ai/google-favicon-copy-of-svg-favicon-loses-transparency/index.md)
- [Claude Code plugins not auto-updating in the desktop app: it sets DISABLE_AUTOUPDATER=1](https://abstractobjective.dev/ai/claude-desktop-app-skips-plugin-auto-update/index.md)

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

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