Claude Code Resources test
Supportedall expectations observed.
Summary
- Client
- Claude Code 2.1.296
- Feature
- Resources (
resources.read) - Tested
- Protocol
- 2026-07-28 (modern era, observed on the wire)
- How
- Automated over stdio
- Lab version
10c9a574121a, win32, Node v24.18.0- Case
resources.read.basic, definition hash51c65d23517b
What was checked
- client discovered resources via resources/list (seen on the wire)
- client read lab://fixtures/hello (seen on the wire)
- the resource content was passed to the model (seen in the client's output)
Protocol traffic
The opening exchange and each request the result depends on, with the lab server's reply, exactly as the server recorded them. Long payloads are truncated.
- #0 client to server: server/discover
{ "jsonrpc": "2.0", "id": "server-discover-probe-1", "method": "server/discover", "params": { "_meta": { "io.modelcontextprotocol/protocolVersion": "2026-07-28", "io.modelcontextprotocol/clientInfo": { "name": "claude-code", "title": "Claude Code", "version": "2.1.296", "description": "Anthropic's agentic coding tool", "websiteUrl": "https://claude.com/claude-code" }, "io.modelcontextprotocol/clientCapabilities": { "roots": { "listChanged": true }, "elicitation": { "form": {}, "url": {} } } } } } - #1 server to client: response
{ "result": { "supportedVersions": [ "2026-07-28" ], "capabilities": { "tools": { "listChanged": true }, "prompts": { "listChanged": true }, "resources": { "listChanged": true } }, "resultType": "complete", "ttlMs": 0, "cacheScope": "private", "_meta": { "io.modelcontextprotocol/serverInfo": { "name": "abw-mcp-lab", "version": "0.1.0" } } }, "jsonrpc": "2.0", "id": "server-discover-probe-1" } - #8 client to server: resources/list
{ "jsonrpc": "2.0", "id": 2, "method": "resources/list", "params": { "_meta": { "io.modelcontextprotocol/protocolVersion": "2026-07-28", "io.modelcontextprotocol/clientInfo": { "name": "claude-code", "title": "Claude Code", "version": "2.1.296", "description": "Anthropic's agentic coding tool", "websiteUrl": "https://claude.com/claude-code" }, "io.modelcontextprotocol/clientCapabilities": { "roots": { "listChanged": true }, "elicitation": { "form": {}, "url": {} } } } } } - #10 server to client: response
{ "result": { "resources": [ { "uri": "lab://fixtures/hello", "name": "lab_hello", "description": "MCP lab fixture: a static text resource.", "mimeType": "text/plain" } ], "resultType": "complete", "ttlMs": 0, "cacheScope": "private", "_meta": { "io.modelcontextprotocol/serverInfo": { "name": "abw-mcp-lab", "version": "0.1.0" } } }, "jsonrpc": "2.0", "id": 2 } - #12 client to server: resources/read
{ "jsonrpc": "2.0", "id": 4, "method": "resources/read", "params": { "_meta": { "io.modelcontextprotocol/protocolVersion": "2026-07-28", "io.modelcontextprotocol/clientInfo": { "name": "claude-code", "title": "Claude Code", "version": "2.1.296", "description": "Anthropic's agentic coding tool", "websiteUrl": "https://claude.com/claude-code" }, "io.modelcontextprotocol/clientCapabilities": { "roots": { "listChanged": true }, "elicitation": { "form": {}, "url": {} } } }, "uri": "lab://fixtures/hello" } } - #13 server to client: response
{ "result": { "contents": [ { "uri": "lab://fixtures/hello", "mimeType": "text/plain", "text": "RESOURCE-OK-f46cb3c253e6" } ], "resultType": "complete", "ttlMs": 0, "cacheScope": "private", "_meta": { "io.modelcontextprotocol/serverInfo": { "name": "abw-mcp-lab", "version": "0.1.0" } } }, "jsonrpc": "2.0", "id": 4 }
Client output
What the client's model said at the end of the run. Supporting evidence only; the status is decided by the traffic above.
RESOURCE-OK-f46cb3c253e6 RESOURCE-OK-f46cb3c253e6
Test definition
id: resources.read.basic
title: Client lists resources and reads one
feature: resources.read
specRevisions: [2025-11-25, 2026-07-28]
mode: automated
drive:
claude-code:
prompt: >-
Read the MCP resource lab://fixtures/hello from the lab server.
Then reply with its exact text content and nothing else. Run id: {{nonce}}.
allowedTools: [ListMcpResourcesTool, ReadMcpResourceTool]
manual:
instructions: >-
Attach or read the resource lab://fixtures/hello from the lab server.
Check whether the reply contains RESOURCE-OK-{{marker}}.
expect:
- id: listed
kind: request
description: client discovered resources via resources/list
method: resources/list
- id: read
kind: request
description: client read lab://fixtures/hello
method: resources/read
match:
params.uri: lab://fixtures/hello
- id: content-reached-model
kind: output
description: the resource content was passed to the model
contains: RESOURCE-OK-{{marker}}
{{nonce}} is replaced with a fresh random value for every run, and {{marker}} with a value derived from it that only the lab server knows. Why