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
Not recorded (run before the lab's first commit), win32, Node v24.18.0
Case
resources.read.basic, definition hash 51c65d23517b

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.

  1. #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": {}
            }
          }
        }
      }
    }
  2. #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"
    }
  3. #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": {}
            }
          }
        }
      }
    }
  4. #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
    }
  5. #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"
      }
    }
  6. #13 server to client: response
    {
      "result": {
        "contents": [
          {
            "uri": "lab://fixtures/hello",
            "mimeType": "text/plain",
            "text": "RESOURCE-OK-add5911d8c12"
          }
        ],
        "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-add5911d8c12
RESOURCE-OK-add5911d8c12

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

© 2026 ABWaters. Thinking out loud.