/conformance
Checked against the official SDK
Every recorded session below was played by the official MCP Python SDK (mcp 2.3.0): its Client, in the mode the session names (legacy for the handshake era, 2026-07-28, or auto, which asks server/discover first), talking over stdio to the small server at the end of this page. A tee between them logged every line. Sessions marked raw are hand-written lines sent to the same server, to show its errors. That is 18 sessions and 160 messages.
The simulator (Agent_Loop_Sim at 46b445c) must produce the same messages, compared as JSON with request IDs (and progress tokens) renumbered in order of appearance: c1, c2… for the client's requests, s1… for the server's. Its CI records the SDK again on every change and requires live recording = committed recording = engine; the TypeScript port this site runs is checked against the same recording. The recording script is scripts/record_sdk.py; the file here is sdk_exchanges.json.
What the recordings showed
- The SDK's stdio server sends nothing back for a line that is not JSON (JSON-RPC 2.0 would answer
-32700). - A connection is locked to the era of its first valid request: a 2026-07-28 request on a handshake connection gets
-32600. - After a tool result with
structuredContent, the client lists the tools (to validate the output against the tool'soutputSchema) if it has not already. - An unknown tool comes back as a result with
isError: true, where the specification's example uses a-32602error. server/discoveradvertiseslistChanged: truewhileinitializereports the server's ownfalse.
The sessions
legacy_tour (legacy, 17 messages): 2025-11-25: handshake, then list and use each primitive
1. client → server
{"jsonrpc":"2.0","id":"c1","method":"initialize","params":{"protocolVersion":"2025-11-25","capabilities":{},"clientInfo":{"name":"fixture-client","version":"1.0.0"}}}2. server → client
{"jsonrpc":"2.0","id":"c1","result":{"capabilities":{"prompts":{"listChanged":false},"resources":{"listChanged":false,"subscribe":false},"tools":{"listChanged":false}},"protocolVersion":"2025-11-25","serverInfo":{"name":"fixture-server","version":"1.0.0"}}}3. client → server
{"jsonrpc":"2.0","method":"notifications/initialized"}4. client → server
{"jsonrpc":"2.0","id":"c2","method":"ping"}5. server → client
{"jsonrpc":"2.0","id":"c2","result":{}}6. client → server
{"jsonrpc":"2.0","id":"c3","method":"tools/list"}7. server → client
{"jsonrpc":"2.0","id":"c3","result":{"tools":[{"description":"Add two integers.","inputSchema":{"properties":{"a":{"title":"A","type":"integer"},"b":{"title":"B","type":"integer"}},"required":["a","b"],"type":"object","title":"addArguments"},"name":"add","outputSchema":{"properties":{"result":{"title":"Result","type":"integer"}},"required":["result"],"type":"object","title":"addOutput"}},{"description":"Read a document by URI.","inputSchema":{"properties":{"uri":{"title":"Uri","type":"string"}},"required":["uri"],"type":"object","title":"read_docArguments"},"name":"read_doc","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"type":"object","title":"read_docOutput"}},{"description":"Count to n, reporting progress.","inputSchema":{"properties":{"n":{"title":"N","type":"integer"}},"required":["n"],"type":"object","title":"countArguments"},"name":"count","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"type":"object","title":"countOutput"}},{"description":"Delete a file after the user confirms.","inputSchema":{"properties":{"path":{"title":"Path","type":"string"}},"required":["path"],"type":"object","title":"delete_fileArguments"},"name":"delete_file","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"type":"object","title":"delete_fileOutput"}},{"description":"Summarise text with the client's model.","inputSchema":{"properties":{"text":{"title":"Text","type":"string"}},"required":["text"],"type":"object","title":"summariseArguments"},"name":"summarise","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"type":"object","title":"summariseOutput"}},{"description":"Always fails (to show a tool error).","inputSchema":{"properties":{"reason":{"title":"Reason","type":"string"}},"required":["reason"],"type":"object","title":"failArguments"},"name":"fail","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"type":"object","title":"failOutput"}}]}}8. client → server
{"jsonrpc":"2.0","id":"c4","method":"tools/call","params":{"name":"add","arguments":{"a":2,"b":3}}}9. server → client
{"jsonrpc":"2.0","id":"c4","result":{"content":[{"text":"5","type":"text"}],"isError":false,"structuredContent":{"result":5}}}10. client → server
{"jsonrpc":"2.0","id":"c5","method":"resources/list"}11. server → client
{"jsonrpc":"2.0","id":"c5","result":{"resources":[{"description":"The project README.","mimeType":"text/markdown","name":"readme","uri":"docs://readme"}]}}12. client → server
{"jsonrpc":"2.0","id":"c6","method":"resources/read","params":{"uri":"docs://readme"}}13. server → client
{"jsonrpc":"2.0","id":"c6","result":{"contents":[{"mimeType":"text/markdown","text":"# Demo\nA tiny project.","uri":"docs://readme"}]}}14. client → server
{"jsonrpc":"2.0","id":"c7","method":"prompts/list"}15. server → client
{"jsonrpc":"2.0","id":"c7","result":{"prompts":[{"arguments":[{"name":"code","required":true}],"description":"Review a piece of code.","name":"review"}]}}16. client → server
{"jsonrpc":"2.0","id":"c8","method":"prompts/get","params":{"name":"review","arguments":{"code":"x = 1"}}}17. server → client
{"jsonrpc":"2.0","id":"c8","result":{"description":"Review a piece of code.","messages":[{"content":{"text":"Please review:\nx = 1","type":"text"},"role":"user"}]}}
modern_tour (2026-07-28, 12 messages): 2026-07-28: no handshake; every request carries _meta
1. client → server
{"jsonrpc":"2.0","id":"c1","method":"tools/list","params":{"_meta":{"io.modelcontextprotocol/protocolVersion":"2026-07-28","io.modelcontextprotocol/clientInfo":{"name":"fixture-client","version":"1.0.0"},"io.modelcontextprotocol/clientCapabilities":{}}}}2. server → client
{"jsonrpc":"2.0","id":"c1","result":{"cacheScope":"private","resultType":"complete","tools":[{"description":"Add two integers.","inputSchema":{"type":"object","properties":{"a":{"title":"A","type":"integer"},"b":{"title":"B","type":"integer"}},"required":["a","b"],"title":"addArguments"},"name":"add","outputSchema":{"properties":{"result":{"title":"Result","type":"integer"}},"required":["result"],"title":"addOutput","type":"object"}},{"description":"Read a document by URI.","inputSchema":{"type":"object","properties":{"uri":{"title":"Uri","type":"string"}},"required":["uri"],"title":"read_docArguments"},"name":"read_doc","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"title":"read_docOutput","type":"object"}},{"description":"Count to n, reporting progress.","inputSchema":{"type":"object","properties":{"n":{"title":"N","type":"integer"}},"required":["n"],"title":"countArguments"},"name":"count","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"title":"countOutput","type":"object"}},{"description":"Delete a file after the user confirms.","inputSchema":{"type":"object","properties":{"path":{"title":"Path","type":"string"}},"required":["path"],"title":"delete_fileArguments"},"name":"delete_file","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"title":"delete_fileOutput","type":"object"}},{"description":"Summarise text with the client's model.","inputSchema":{"type":"object","properties":{"text":{"title":"Text","type":"string"}},"required":["text"],"title":"summariseArguments"},"name":"summarise","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"title":"summariseOutput","type":"object"}},{"description":"Always fails (to show a tool error).","inputSchema":{"type":"object","properties":{"reason":{"title":"Reason","type":"string"}},"required":["reason"],"title":"failArguments"},"name":"fail","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"title":"failOutput","type":"object"}}],"ttlMs":0,"_meta":{"io.modelcontextprotocol/serverInfo":{"name":"fixture-server","version":"1.0.0"}}}}3. client → server
{"jsonrpc":"2.0","id":"c2","method":"tools/call","params":{"name":"add","arguments":{"a":2,"b":3},"_meta":{"io.modelcontextprotocol/protocolVersion":"2026-07-28","io.modelcontextprotocol/clientInfo":{"name":"fixture-client","version":"1.0.0"},"io.modelcontextprotocol/clientCapabilities":{}}}}4. server → client
{"jsonrpc":"2.0","id":"c2","result":{"content":[{"text":"5","type":"text"}],"isError":false,"resultType":"complete","structuredContent":{"result":5},"_meta":{"io.modelcontextprotocol/serverInfo":{"name":"fixture-server","version":"1.0.0"}}}}5. client → server
{"jsonrpc":"2.0","id":"c3","method":"resources/list","params":{"_meta":{"io.modelcontextprotocol/protocolVersion":"2026-07-28","io.modelcontextprotocol/clientInfo":{"name":"fixture-client","version":"1.0.0"},"io.modelcontextprotocol/clientCapabilities":{}}}}6. server → client
{"jsonrpc":"2.0","id":"c3","result":{"cacheScope":"private","resources":[{"description":"The project README.","mimeType":"text/markdown","name":"readme","uri":"docs://readme"}],"resultType":"complete","ttlMs":0,"_meta":{"io.modelcontextprotocol/serverInfo":{"name":"fixture-server","version":"1.0.0"}}}}7. client → server
{"jsonrpc":"2.0","id":"c4","method":"resources/read","params":{"uri":"docs://readme","_meta":{"io.modelcontextprotocol/protocolVersion":"2026-07-28","io.modelcontextprotocol/clientInfo":{"name":"fixture-client","version":"1.0.0"},"io.modelcontextprotocol/clientCapabilities":{}}}}8. server → client
{"jsonrpc":"2.0","id":"c4","result":{"cacheScope":"private","contents":[{"mimeType":"text/markdown","text":"# Demo\nA tiny project.","uri":"docs://readme"}],"resultType":"complete","ttlMs":0,"_meta":{"io.modelcontextprotocol/serverInfo":{"name":"fixture-server","version":"1.0.0"}}}}9. client → server
{"jsonrpc":"2.0","id":"c5","method":"prompts/list","params":{"_meta":{"io.modelcontextprotocol/protocolVersion":"2026-07-28","io.modelcontextprotocol/clientInfo":{"name":"fixture-client","version":"1.0.0"},"io.modelcontextprotocol/clientCapabilities":{}}}}10. server → client
{"jsonrpc":"2.0","id":"c5","result":{"cacheScope":"private","prompts":[{"arguments":[{"name":"code","required":true}],"description":"Review a piece of code.","name":"review"}],"resultType":"complete","ttlMs":0,"_meta":{"io.modelcontextprotocol/serverInfo":{"name":"fixture-server","version":"1.0.0"}}}}11. client → server
{"jsonrpc":"2.0","id":"c6","method":"prompts/get","params":{"name":"review","arguments":{"code":"x = 1"},"_meta":{"io.modelcontextprotocol/protocolVersion":"2026-07-28","io.modelcontextprotocol/clientInfo":{"name":"fixture-client","version":"1.0.0"},"io.modelcontextprotocol/clientCapabilities":{}}}}12. server → client
{"jsonrpc":"2.0","id":"c6","result":{"description":"Review a piece of code.","messages":[{"content":{"text":"Please review:\nx = 1","type":"text"},"role":"user"}],"resultType":"complete","_meta":{"io.modelcontextprotocol/serverInfo":{"name":"fixture-server","version":"1.0.0"}}}}
auto_tour (auto, 6 messages): auto: server/discover first, then requests
1. client → server
{"jsonrpc":"2.0","id":"c1","method":"server/discover","params":{"_meta":{"io.modelcontextprotocol/protocolVersion":"2026-07-28","io.modelcontextprotocol/clientInfo":{"name":"fixture-client","version":"1.0.0"},"io.modelcontextprotocol/clientCapabilities":{}}}}2. server → client
{"jsonrpc":"2.0","id":"c1","result":{"cacheScope":"private","capabilities":{"prompts":{"listChanged":true},"resources":{"listChanged":true,"subscribe":true},"tools":{"listChanged":true}},"resultType":"complete","supportedVersions":["2026-07-28"],"ttlMs":0,"_meta":{"io.modelcontextprotocol/serverInfo":{"name":"fixture-server","version":"1.0.0"}}}}3. client → server
{"jsonrpc":"2.0","id":"c2","method":"tools/list","params":{"_meta":{"io.modelcontextprotocol/protocolVersion":"2026-07-28","io.modelcontextprotocol/clientInfo":{"name":"fixture-client","version":"1.0.0"},"io.modelcontextprotocol/clientCapabilities":{}}}}4. server → client
{"jsonrpc":"2.0","id":"c2","result":{"cacheScope":"private","resultType":"complete","tools":[{"description":"Add two integers.","inputSchema":{"type":"object","properties":{"a":{"title":"A","type":"integer"},"b":{"title":"B","type":"integer"}},"required":["a","b"],"title":"addArguments"},"name":"add","outputSchema":{"properties":{"result":{"title":"Result","type":"integer"}},"required":["result"],"title":"addOutput","type":"object"}},{"description":"Read a document by URI.","inputSchema":{"type":"object","properties":{"uri":{"title":"Uri","type":"string"}},"required":["uri"],"title":"read_docArguments"},"name":"read_doc","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"title":"read_docOutput","type":"object"}},{"description":"Count to n, reporting progress.","inputSchema":{"type":"object","properties":{"n":{"title":"N","type":"integer"}},"required":["n"],"title":"countArguments"},"name":"count","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"title":"countOutput","type":"object"}},{"description":"Delete a file after the user confirms.","inputSchema":{"type":"object","properties":{"path":{"title":"Path","type":"string"}},"required":["path"],"title":"delete_fileArguments"},"name":"delete_file","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"title":"delete_fileOutput","type":"object"}},{"description":"Summarise text with the client's model.","inputSchema":{"type":"object","properties":{"text":{"title":"Text","type":"string"}},"required":["text"],"title":"summariseArguments"},"name":"summarise","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"title":"summariseOutput","type":"object"}},{"description":"Always fails (to show a tool error).","inputSchema":{"type":"object","properties":{"reason":{"title":"Reason","type":"string"}},"required":["reason"],"title":"failArguments"},"name":"fail","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"title":"failOutput","type":"object"}}],"ttlMs":0,"_meta":{"io.modelcontextprotocol/serverInfo":{"name":"fixture-server","version":"1.0.0"}}}}5. client → server
{"jsonrpc":"2.0","id":"c3","method":"tools/call","params":{"name":"add","arguments":{"a":2,"b":3},"_meta":{"io.modelcontextprotocol/protocolVersion":"2026-07-28","io.modelcontextprotocol/clientInfo":{"name":"fixture-client","version":"1.0.0"},"io.modelcontextprotocol/clientCapabilities":{}}}}6. server → client
{"jsonrpc":"2.0","id":"c3","result":{"content":[{"text":"5","type":"text"}],"isError":false,"resultType":"complete","structuredContent":{"result":5},"_meta":{"io.modelcontextprotocol/serverInfo":{"name":"fixture-server","version":"1.0.0"}}}}
legacy_three_ways (legacy, 15 messages): The README three ways: a tool the model calls, a resource the app attaches, a prompt the user picks
1. client → server
{"jsonrpc":"2.0","id":"c1","method":"initialize","params":{"protocolVersion":"2025-11-25","capabilities":{},"clientInfo":{"name":"fixture-client","version":"1.0.0"}}}2. server → client
{"jsonrpc":"2.0","id":"c1","result":{"capabilities":{"prompts":{"listChanged":false},"resources":{"listChanged":false,"subscribe":false},"tools":{"listChanged":false}},"protocolVersion":"2025-11-25","serverInfo":{"name":"fixture-server","version":"1.0.0"}}}3. client → server
{"jsonrpc":"2.0","method":"notifications/initialized"}4. client → server
{"jsonrpc":"2.0","id":"c2","method":"tools/list"}5. server → client
{"jsonrpc":"2.0","id":"c2","result":{"tools":[{"description":"Add two integers.","inputSchema":{"properties":{"a":{"title":"A","type":"integer"},"b":{"title":"B","type":"integer"}},"required":["a","b"],"type":"object","title":"addArguments"},"name":"add","outputSchema":{"properties":{"result":{"title":"Result","type":"integer"}},"required":["result"],"type":"object","title":"addOutput"}},{"description":"Read a document by URI.","inputSchema":{"properties":{"uri":{"title":"Uri","type":"string"}},"required":["uri"],"type":"object","title":"read_docArguments"},"name":"read_doc","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"type":"object","title":"read_docOutput"}},{"description":"Count to n, reporting progress.","inputSchema":{"properties":{"n":{"title":"N","type":"integer"}},"required":["n"],"type":"object","title":"countArguments"},"name":"count","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"type":"object","title":"countOutput"}},{"description":"Delete a file after the user confirms.","inputSchema":{"properties":{"path":{"title":"Path","type":"string"}},"required":["path"],"type":"object","title":"delete_fileArguments"},"name":"delete_file","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"type":"object","title":"delete_fileOutput"}},{"description":"Summarise text with the client's model.","inputSchema":{"properties":{"text":{"title":"Text","type":"string"}},"required":["text"],"type":"object","title":"summariseArguments"},"name":"summarise","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"type":"object","title":"summariseOutput"}},{"description":"Always fails (to show a tool error).","inputSchema":{"properties":{"reason":{"title":"Reason","type":"string"}},"required":["reason"],"type":"object","title":"failArguments"},"name":"fail","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"type":"object","title":"failOutput"}}]}}6. client → server
{"jsonrpc":"2.0","id":"c3","method":"tools/call","params":{"name":"read_doc","arguments":{"uri":"docs://readme"}}}7. server → client
{"jsonrpc":"2.0","id":"c3","result":{"content":[{"text":"# Demo\nA tiny project.","type":"text"}],"isError":false,"structuredContent":{"result":"# Demo\nA tiny project."}}}8. client → server
{"jsonrpc":"2.0","id":"c4","method":"resources/list"}9. server → client
{"jsonrpc":"2.0","id":"c4","result":{"resources":[{"description":"The project README.","mimeType":"text/markdown","name":"readme","uri":"docs://readme"}]}}10. client → server
{"jsonrpc":"2.0","id":"c5","method":"resources/read","params":{"uri":"docs://readme"}}11. server → client
{"jsonrpc":"2.0","id":"c5","result":{"contents":[{"mimeType":"text/markdown","text":"# Demo\nA tiny project.","uri":"docs://readme"}]}}12. client → server
{"jsonrpc":"2.0","id":"c6","method":"prompts/list"}13. server → client
{"jsonrpc":"2.0","id":"c6","result":{"prompts":[{"arguments":[{"name":"code","required":true}],"description":"Review a piece of code.","name":"review"}]}}14. client → server
{"jsonrpc":"2.0","id":"c7","method":"prompts/get","params":{"name":"review","arguments":{"code":"# Demo\nA tiny project."}}}15. server → client
{"jsonrpc":"2.0","id":"c7","result":{"description":"Review a piece of code.","messages":[{"content":{"text":"Please review:\n# Demo\nA tiny project.","type":"text"},"role":"user"}]}}
modern_three_ways (2026-07-28, 12 messages): The same three ways in 2026-07-28
1. client → server
{"jsonrpc":"2.0","id":"c1","method":"tools/list","params":{"_meta":{"io.modelcontextprotocol/protocolVersion":"2026-07-28","io.modelcontextprotocol/clientInfo":{"name":"fixture-client","version":"1.0.0"},"io.modelcontextprotocol/clientCapabilities":{}}}}2. server → client
{"jsonrpc":"2.0","id":"c1","result":{"cacheScope":"private","resultType":"complete","tools":[{"description":"Add two integers.","inputSchema":{"type":"object","properties":{"a":{"title":"A","type":"integer"},"b":{"title":"B","type":"integer"}},"required":["a","b"],"title":"addArguments"},"name":"add","outputSchema":{"properties":{"result":{"title":"Result","type":"integer"}},"required":["result"],"title":"addOutput","type":"object"}},{"description":"Read a document by URI.","inputSchema":{"type":"object","properties":{"uri":{"title":"Uri","type":"string"}},"required":["uri"],"title":"read_docArguments"},"name":"read_doc","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"title":"read_docOutput","type":"object"}},{"description":"Count to n, reporting progress.","inputSchema":{"type":"object","properties":{"n":{"title":"N","type":"integer"}},"required":["n"],"title":"countArguments"},"name":"count","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"title":"countOutput","type":"object"}},{"description":"Delete a file after the user confirms.","inputSchema":{"type":"object","properties":{"path":{"title":"Path","type":"string"}},"required":["path"],"title":"delete_fileArguments"},"name":"delete_file","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"title":"delete_fileOutput","type":"object"}},{"description":"Summarise text with the client's model.","inputSchema":{"type":"object","properties":{"text":{"title":"Text","type":"string"}},"required":["text"],"title":"summariseArguments"},"name":"summarise","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"title":"summariseOutput","type":"object"}},{"description":"Always fails (to show a tool error).","inputSchema":{"type":"object","properties":{"reason":{"title":"Reason","type":"string"}},"required":["reason"],"title":"failArguments"},"name":"fail","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"title":"failOutput","type":"object"}}],"ttlMs":0,"_meta":{"io.modelcontextprotocol/serverInfo":{"name":"fixture-server","version":"1.0.0"}}}}3. client → server
{"jsonrpc":"2.0","id":"c2","method":"tools/call","params":{"name":"read_doc","arguments":{"uri":"docs://readme"},"_meta":{"io.modelcontextprotocol/protocolVersion":"2026-07-28","io.modelcontextprotocol/clientInfo":{"name":"fixture-client","version":"1.0.0"},"io.modelcontextprotocol/clientCapabilities":{}}}}4. server → client
{"jsonrpc":"2.0","id":"c2","result":{"content":[{"text":"# Demo\nA tiny project.","type":"text"}],"isError":false,"resultType":"complete","structuredContent":{"result":"# Demo\nA tiny project."},"_meta":{"io.modelcontextprotocol/serverInfo":{"name":"fixture-server","version":"1.0.0"}}}}5. client → server
{"jsonrpc":"2.0","id":"c3","method":"resources/list","params":{"_meta":{"io.modelcontextprotocol/protocolVersion":"2026-07-28","io.modelcontextprotocol/clientInfo":{"name":"fixture-client","version":"1.0.0"},"io.modelcontextprotocol/clientCapabilities":{}}}}6. server → client
{"jsonrpc":"2.0","id":"c3","result":{"cacheScope":"private","resources":[{"description":"The project README.","mimeType":"text/markdown","name":"readme","uri":"docs://readme"}],"resultType":"complete","ttlMs":0,"_meta":{"io.modelcontextprotocol/serverInfo":{"name":"fixture-server","version":"1.0.0"}}}}7. client → server
{"jsonrpc":"2.0","id":"c4","method":"resources/read","params":{"uri":"docs://readme","_meta":{"io.modelcontextprotocol/protocolVersion":"2026-07-28","io.modelcontextprotocol/clientInfo":{"name":"fixture-client","version":"1.0.0"},"io.modelcontextprotocol/clientCapabilities":{}}}}8. server → client
{"jsonrpc":"2.0","id":"c4","result":{"cacheScope":"private","contents":[{"mimeType":"text/markdown","text":"# Demo\nA tiny project.","uri":"docs://readme"}],"resultType":"complete","ttlMs":0,"_meta":{"io.modelcontextprotocol/serverInfo":{"name":"fixture-server","version":"1.0.0"}}}}9. client → server
{"jsonrpc":"2.0","id":"c5","method":"prompts/list","params":{"_meta":{"io.modelcontextprotocol/protocolVersion":"2026-07-28","io.modelcontextprotocol/clientInfo":{"name":"fixture-client","version":"1.0.0"},"io.modelcontextprotocol/clientCapabilities":{}}}}10. server → client
{"jsonrpc":"2.0","id":"c5","result":{"cacheScope":"private","prompts":[{"arguments":[{"name":"code","required":true}],"description":"Review a piece of code.","name":"review"}],"resultType":"complete","ttlMs":0,"_meta":{"io.modelcontextprotocol/serverInfo":{"name":"fixture-server","version":"1.0.0"}}}}11. client → server
{"jsonrpc":"2.0","id":"c6","method":"prompts/get","params":{"name":"review","arguments":{"code":"# Demo\nA tiny project."},"_meta":{"io.modelcontextprotocol/protocolVersion":"2026-07-28","io.modelcontextprotocol/clientInfo":{"name":"fixture-client","version":"1.0.0"},"io.modelcontextprotocol/clientCapabilities":{}}}}12. server → client
{"jsonrpc":"2.0","id":"c6","result":{"description":"Review a piece of code.","messages":[{"content":{"text":"Please review:\n# Demo\nA tiny project.","type":"text"},"role":"user"}],"resultType":"complete","_meta":{"io.modelcontextprotocol/serverInfo":{"name":"fixture-server","version":"1.0.0"}}}}
legacy_progress (legacy, 10 messages): 2025-11-25: progress notifications
1. client → server
{"jsonrpc":"2.0","id":"c1","method":"initialize","params":{"protocolVersion":"2025-11-25","capabilities":{},"clientInfo":{"name":"fixture-client","version":"1.0.0"}}}2. server → client
{"jsonrpc":"2.0","id":"c1","result":{"capabilities":{"prompts":{"listChanged":false},"resources":{"listChanged":false,"subscribe":false},"tools":{"listChanged":false}},"protocolVersion":"2025-11-25","serverInfo":{"name":"fixture-server","version":"1.0.0"}}}3. client → server
{"jsonrpc":"2.0","method":"notifications/initialized"}4. client → server
{"jsonrpc":"2.0","id":"c2","method":"tools/call","params":{"name":"count","arguments":{"n":3},"_meta":{"progressToken":"c2"}}}5. server → client
{"jsonrpc":"2.0","method":"notifications/progress","params":{"progressToken":"c2","progress":1,"total":3}}6. server → client
{"jsonrpc":"2.0","method":"notifications/progress","params":{"progressToken":"c2","progress":2,"total":3}}7. server → client
{"jsonrpc":"2.0","method":"notifications/progress","params":{"progressToken":"c2","progress":3,"total":3}}8. server → client
{"jsonrpc":"2.0","id":"c2","result":{"content":[{"text":"counted to 3","type":"text"}],"isError":false,"structuredContent":{"result":"counted to 3"}}}9. client → server
{"jsonrpc":"2.0","id":"c3","method":"tools/list"}10. server → client
{"jsonrpc":"2.0","id":"c3","result":{"tools":[{"description":"Add two integers.","inputSchema":{"properties":{"a":{"title":"A","type":"integer"},"b":{"title":"B","type":"integer"}},"required":["a","b"],"type":"object","title":"addArguments"},"name":"add","outputSchema":{"properties":{"result":{"title":"Result","type":"integer"}},"required":["result"],"type":"object","title":"addOutput"}},{"description":"Read a document by URI.","inputSchema":{"properties":{"uri":{"title":"Uri","type":"string"}},"required":["uri"],"type":"object","title":"read_docArguments"},"name":"read_doc","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"type":"object","title":"read_docOutput"}},{"description":"Count to n, reporting progress.","inputSchema":{"properties":{"n":{"title":"N","type":"integer"}},"required":["n"],"type":"object","title":"countArguments"},"name":"count","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"type":"object","title":"countOutput"}},{"description":"Delete a file after the user confirms.","inputSchema":{"properties":{"path":{"title":"Path","type":"string"}},"required":["path"],"type":"object","title":"delete_fileArguments"},"name":"delete_file","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"type":"object","title":"delete_fileOutput"}},{"description":"Summarise text with the client's model.","inputSchema":{"properties":{"text":{"title":"Text","type":"string"}},"required":["text"],"type":"object","title":"summariseArguments"},"name":"summarise","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"type":"object","title":"summariseOutput"}},{"description":"Always fails (to show a tool error).","inputSchema":{"properties":{"reason":{"title":"Reason","type":"string"}},"required":["reason"],"type":"object","title":"failArguments"},"name":"fail","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"type":"object","title":"failOutput"}}]}}
modern_progress (2026-07-28, 7 messages): 2026-07-28: progress notifications
1. client → server
{"jsonrpc":"2.0","id":"c1","method":"tools/call","params":{"name":"count","arguments":{"n":3},"_meta":{"io.modelcontextprotocol/protocolVersion":"2026-07-28","io.modelcontextprotocol/clientInfo":{"name":"fixture-client","version":"1.0.0"},"io.modelcontextprotocol/clientCapabilities":{},"progressToken":"c1"}}}2. server → client
{"jsonrpc":"2.0","method":"notifications/progress","params":{"progressToken":"c1","progress":1,"total":3}}3. server → client
{"jsonrpc":"2.0","method":"notifications/progress","params":{"progressToken":"c1","progress":2,"total":3}}4. server → client
{"jsonrpc":"2.0","method":"notifications/progress","params":{"progressToken":"c1","progress":3,"total":3}}5. server → client
{"jsonrpc":"2.0","id":"c1","result":{"content":[{"text":"counted to 3","type":"text"}],"isError":false,"resultType":"complete","structuredContent":{"result":"counted to 3"},"_meta":{"io.modelcontextprotocol/serverInfo":{"name":"fixture-server","version":"1.0.0"}}}}6. client → server
{"jsonrpc":"2.0","id":"c2","method":"tools/list","params":{"_meta":{"io.modelcontextprotocol/protocolVersion":"2026-07-28","io.modelcontextprotocol/clientInfo":{"name":"fixture-client","version":"1.0.0"},"io.modelcontextprotocol/clientCapabilities":{}}}}7. server → client
{"jsonrpc":"2.0","id":"c2","result":{"cacheScope":"private","resultType":"complete","tools":[{"description":"Add two integers.","inputSchema":{"type":"object","properties":{"a":{"title":"A","type":"integer"},"b":{"title":"B","type":"integer"}},"required":["a","b"],"title":"addArguments"},"name":"add","outputSchema":{"properties":{"result":{"title":"Result","type":"integer"}},"required":["result"],"title":"addOutput","type":"object"}},{"description":"Read a document by URI.","inputSchema":{"type":"object","properties":{"uri":{"title":"Uri","type":"string"}},"required":["uri"],"title":"read_docArguments"},"name":"read_doc","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"title":"read_docOutput","type":"object"}},{"description":"Count to n, reporting progress.","inputSchema":{"type":"object","properties":{"n":{"title":"N","type":"integer"}},"required":["n"],"title":"countArguments"},"name":"count","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"title":"countOutput","type":"object"}},{"description":"Delete a file after the user confirms.","inputSchema":{"type":"object","properties":{"path":{"title":"Path","type":"string"}},"required":["path"],"title":"delete_fileArguments"},"name":"delete_file","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"title":"delete_fileOutput","type":"object"}},{"description":"Summarise text with the client's model.","inputSchema":{"type":"object","properties":{"text":{"title":"Text","type":"string"}},"required":["text"],"title":"summariseArguments"},"name":"summarise","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"title":"summariseOutput","type":"object"}},{"description":"Always fails (to show a tool error).","inputSchema":{"type":"object","properties":{"reason":{"title":"Reason","type":"string"}},"required":["reason"],"title":"failArguments"},"name":"fail","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"title":"failOutput","type":"object"}}],"ttlMs":0,"_meta":{"io.modelcontextprotocol/serverInfo":{"name":"fixture-server","version":"1.0.0"}}}}
legacy_errors (legacy, 9 messages): 2025-11-25: a tool error, an unknown tool, an unknown resource
1. client → server
{"jsonrpc":"2.0","id":"c1","method":"initialize","params":{"protocolVersion":"2025-11-25","capabilities":{},"clientInfo":{"name":"fixture-client","version":"1.0.0"}}}2. server → client
{"jsonrpc":"2.0","id":"c1","result":{"capabilities":{"prompts":{"listChanged":false},"resources":{"listChanged":false,"subscribe":false},"tools":{"listChanged":false}},"protocolVersion":"2025-11-25","serverInfo":{"name":"fixture-server","version":"1.0.0"}}}3. client → server
{"jsonrpc":"2.0","method":"notifications/initialized"}4. client → server
{"jsonrpc":"2.0","id":"c2","method":"tools/call","params":{"name":"fail","arguments":{"reason":"disk full"}}}5. server → client
{"jsonrpc":"2.0","id":"c2","result":{"content":[{"text":"Error executing tool fail","type":"text"}],"isError":true}}6. client → server
{"jsonrpc":"2.0","id":"c3","method":"tools/call","params":{"name":"nope","arguments":{}}}7. server → client
{"jsonrpc":"2.0","id":"c3","result":{"content":[{"text":"Unknown tool: nope","type":"text"}],"isError":true}}8. client → server
{"jsonrpc":"2.0","id":"c4","method":"resources/read","params":{"uri":"docs://missing"}}9. server → client
{"jsonrpc":"2.0","id":"c4","error":{"code":-32602,"message":"Unknown resource: docs://missing","data":{"uri":"docs://missing"}}}
modern_errors (2026-07-28, 6 messages): 2026-07-28: the same errors
1. client → server
{"jsonrpc":"2.0","id":"c1","method":"tools/call","params":{"name":"fail","arguments":{"reason":"disk full"},"_meta":{"io.modelcontextprotocol/protocolVersion":"2026-07-28","io.modelcontextprotocol/clientInfo":{"name":"fixture-client","version":"1.0.0"},"io.modelcontextprotocol/clientCapabilities":{}}}}2. server → client
{"jsonrpc":"2.0","id":"c1","result":{"content":[{"text":"Error executing tool fail","type":"text"}],"isError":true,"resultType":"complete","_meta":{"io.modelcontextprotocol/serverInfo":{"name":"fixture-server","version":"1.0.0"}}}}3. client → server
{"jsonrpc":"2.0","id":"c2","method":"tools/call","params":{"name":"nope","arguments":{},"_meta":{"io.modelcontextprotocol/protocolVersion":"2026-07-28","io.modelcontextprotocol/clientInfo":{"name":"fixture-client","version":"1.0.0"},"io.modelcontextprotocol/clientCapabilities":{}}}}4. server → client
{"jsonrpc":"2.0","id":"c2","result":{"content":[{"text":"Unknown tool: nope","type":"text"}],"isError":true,"resultType":"complete","_meta":{"io.modelcontextprotocol/serverInfo":{"name":"fixture-server","version":"1.0.0"}}}}5. client → server
{"jsonrpc":"2.0","id":"c3","method":"resources/read","params":{"uri":"docs://missing","_meta":{"io.modelcontextprotocol/protocolVersion":"2026-07-28","io.modelcontextprotocol/clientInfo":{"name":"fixture-client","version":"1.0.0"},"io.modelcontextprotocol/clientCapabilities":{}}}}6. server → client
{"jsonrpc":"2.0","id":"c3","error":{"code":-32602,"message":"Unknown resource: docs://missing","data":{"uri":"docs://missing"}}}
legacy_elicit_accept (legacy, 9 messages): 2025-11-25: the server asks the user (elicitation/create), who accepts
1. client → server
{"jsonrpc":"2.0","id":"c1","method":"initialize","params":{"protocolVersion":"2025-11-25","capabilities":{"elicitation":{"form":{},"url":{}}},"clientInfo":{"name":"fixture-client","version":"1.0.0"}}}2. server → client
{"jsonrpc":"2.0","id":"c1","result":{"capabilities":{"prompts":{"listChanged":false},"resources":{"listChanged":false,"subscribe":false},"tools":{"listChanged":false}},"protocolVersion":"2025-11-25","serverInfo":{"name":"fixture-server","version":"1.0.0"}}}3. client → server
{"jsonrpc":"2.0","method":"notifications/initialized"}4. client → server
{"jsonrpc":"2.0","id":"c2","method":"tools/call","params":{"name":"delete_file","arguments":{"path":"build/"}}}5. server → client
{"jsonrpc":"2.0","id":"s1","method":"elicitation/create","params":{"mode":"form","message":"Delete build/?","requestedSchema":{"type":"object","properties":{"confirm":{"type":"boolean"}},"required":["confirm"]}}}6. client → server
{"jsonrpc":"2.0","id":"s1","result":{"action":"accept","content":{"confirm":true}}}7. server → client
{"jsonrpc":"2.0","id":"c2","result":{"content":[{"text":"deleted build/","type":"text"}],"isError":false,"structuredContent":{"result":"deleted build/"}}}8. client → server
{"jsonrpc":"2.0","id":"c3","method":"tools/list"}9. server → client
{"jsonrpc":"2.0","id":"c3","result":{"tools":[{"description":"Add two integers.","inputSchema":{"properties":{"a":{"title":"A","type":"integer"},"b":{"title":"B","type":"integer"}},"required":["a","b"],"type":"object","title":"addArguments"},"name":"add","outputSchema":{"properties":{"result":{"title":"Result","type":"integer"}},"required":["result"],"type":"object","title":"addOutput"}},{"description":"Read a document by URI.","inputSchema":{"properties":{"uri":{"title":"Uri","type":"string"}},"required":["uri"],"type":"object","title":"read_docArguments"},"name":"read_doc","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"type":"object","title":"read_docOutput"}},{"description":"Count to n, reporting progress.","inputSchema":{"properties":{"n":{"title":"N","type":"integer"}},"required":["n"],"type":"object","title":"countArguments"},"name":"count","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"type":"object","title":"countOutput"}},{"description":"Delete a file after the user confirms.","inputSchema":{"properties":{"path":{"title":"Path","type":"string"}},"required":["path"],"type":"object","title":"delete_fileArguments"},"name":"delete_file","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"type":"object","title":"delete_fileOutput"}},{"description":"Summarise text with the client's model.","inputSchema":{"properties":{"text":{"title":"Text","type":"string"}},"required":["text"],"type":"object","title":"summariseArguments"},"name":"summarise","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"type":"object","title":"summariseOutput"}},{"description":"Always fails (to show a tool error).","inputSchema":{"properties":{"reason":{"title":"Reason","type":"string"}},"required":["reason"],"type":"object","title":"failArguments"},"name":"fail","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"type":"object","title":"failOutput"}}]}}
legacy_elicit_decline (legacy, 9 messages): 2025-11-25: the user declines
1. client → server
{"jsonrpc":"2.0","id":"c1","method":"initialize","params":{"protocolVersion":"2025-11-25","capabilities":{"elicitation":{"form":{},"url":{}}},"clientInfo":{"name":"fixture-client","version":"1.0.0"}}}2. server → client
{"jsonrpc":"2.0","id":"c1","result":{"capabilities":{"prompts":{"listChanged":false},"resources":{"listChanged":false,"subscribe":false},"tools":{"listChanged":false}},"protocolVersion":"2025-11-25","serverInfo":{"name":"fixture-server","version":"1.0.0"}}}3. client → server
{"jsonrpc":"2.0","method":"notifications/initialized"}4. client → server
{"jsonrpc":"2.0","id":"c2","method":"tools/call","params":{"name":"delete_file","arguments":{"path":"build/"}}}5. server → client
{"jsonrpc":"2.0","id":"s1","method":"elicitation/create","params":{"mode":"form","message":"Delete build/?","requestedSchema":{"type":"object","properties":{"confirm":{"type":"boolean"}},"required":["confirm"]}}}6. client → server
{"jsonrpc":"2.0","id":"s1","result":{"action":"decline"}}7. server → client
{"jsonrpc":"2.0","id":"c2","result":{"content":[{"text":"kept build/","type":"text"}],"isError":false,"structuredContent":{"result":"kept build/"}}}8. client → server
{"jsonrpc":"2.0","id":"c3","method":"tools/list"}9. server → client
{"jsonrpc":"2.0","id":"c3","result":{"tools":[{"description":"Add two integers.","inputSchema":{"properties":{"a":{"title":"A","type":"integer"},"b":{"title":"B","type":"integer"}},"required":["a","b"],"type":"object","title":"addArguments"},"name":"add","outputSchema":{"properties":{"result":{"title":"Result","type":"integer"}},"required":["result"],"type":"object","title":"addOutput"}},{"description":"Read a document by URI.","inputSchema":{"properties":{"uri":{"title":"Uri","type":"string"}},"required":["uri"],"type":"object","title":"read_docArguments"},"name":"read_doc","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"type":"object","title":"read_docOutput"}},{"description":"Count to n, reporting progress.","inputSchema":{"properties":{"n":{"title":"N","type":"integer"}},"required":["n"],"type":"object","title":"countArguments"},"name":"count","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"type":"object","title":"countOutput"}},{"description":"Delete a file after the user confirms.","inputSchema":{"properties":{"path":{"title":"Path","type":"string"}},"required":["path"],"type":"object","title":"delete_fileArguments"},"name":"delete_file","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"type":"object","title":"delete_fileOutput"}},{"description":"Summarise text with the client's model.","inputSchema":{"properties":{"text":{"title":"Text","type":"string"}},"required":["text"],"type":"object","title":"summariseArguments"},"name":"summarise","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"type":"object","title":"summariseOutput"}},{"description":"Always fails (to show a tool error).","inputSchema":{"properties":{"reason":{"title":"Reason","type":"string"}},"required":["reason"],"type":"object","title":"failArguments"},"name":"fail","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"type":"object","title":"failOutput"}}]}}
modern_elicit_accept (2026-07-28, 6 messages): 2026-07-28: input_required, then a retry carrying the answer
1. client → server
{"jsonrpc":"2.0","id":"c1","method":"tools/call","params":{"name":"delete_file","arguments":{"path":"build/"},"_meta":{"io.modelcontextprotocol/protocolVersion":"2026-07-28","io.modelcontextprotocol/clientInfo":{"name":"fixture-client","version":"1.0.0"},"io.modelcontextprotocol/clientCapabilities":{"elicitation":{"form":{},"url":{}}}}}}2. server → client
{"jsonrpc":"2.0","id":"c1","result":{"inputRequests":{"confirm":{"method":"elicitation/create","params":{"message":"Delete build/?","mode":"form","requestedSchema":{"properties":{"confirm":{"type":"boolean"}},"required":["confirm"],"type":"object"}}}},"resultType":"input_required","_meta":{"io.modelcontextprotocol/serverInfo":{"name":"fixture-server","version":"1.0.0"}}}}3. client → server
{"jsonrpc":"2.0","id":"c2","method":"tools/call","params":{"inputResponses":{"confirm":{"action":"accept","content":{"confirm":true}}},"name":"delete_file","arguments":{"path":"build/"},"_meta":{"io.modelcontextprotocol/protocolVersion":"2026-07-28","io.modelcontextprotocol/clientInfo":{"name":"fixture-client","version":"1.0.0"},"io.modelcontextprotocol/clientCapabilities":{"elicitation":{"form":{},"url":{}}}}}}4. server → client
{"jsonrpc":"2.0","id":"c2","result":{"content":[{"text":"deleted build/","type":"text"}],"isError":false,"resultType":"complete","structuredContent":{"result":"deleted build/"},"_meta":{"io.modelcontextprotocol/serverInfo":{"name":"fixture-server","version":"1.0.0"}}}}5. client → server
{"jsonrpc":"2.0","id":"c3","method":"tools/list","params":{"_meta":{"io.modelcontextprotocol/protocolVersion":"2026-07-28","io.modelcontextprotocol/clientInfo":{"name":"fixture-client","version":"1.0.0"},"io.modelcontextprotocol/clientCapabilities":{"elicitation":{"form":{},"url":{}}}}}}6. server → client
{"jsonrpc":"2.0","id":"c3","result":{"cacheScope":"private","resultType":"complete","tools":[{"description":"Add two integers.","inputSchema":{"type":"object","properties":{"a":{"title":"A","type":"integer"},"b":{"title":"B","type":"integer"}},"required":["a","b"],"title":"addArguments"},"name":"add","outputSchema":{"properties":{"result":{"title":"Result","type":"integer"}},"required":["result"],"title":"addOutput","type":"object"}},{"description":"Read a document by URI.","inputSchema":{"type":"object","properties":{"uri":{"title":"Uri","type":"string"}},"required":["uri"],"title":"read_docArguments"},"name":"read_doc","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"title":"read_docOutput","type":"object"}},{"description":"Count to n, reporting progress.","inputSchema":{"type":"object","properties":{"n":{"title":"N","type":"integer"}},"required":["n"],"title":"countArguments"},"name":"count","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"title":"countOutput","type":"object"}},{"description":"Delete a file after the user confirms.","inputSchema":{"type":"object","properties":{"path":{"title":"Path","type":"string"}},"required":["path"],"title":"delete_fileArguments"},"name":"delete_file","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"title":"delete_fileOutput","type":"object"}},{"description":"Summarise text with the client's model.","inputSchema":{"type":"object","properties":{"text":{"title":"Text","type":"string"}},"required":["text"],"title":"summariseArguments"},"name":"summarise","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"title":"summariseOutput","type":"object"}},{"description":"Always fails (to show a tool error).","inputSchema":{"type":"object","properties":{"reason":{"title":"Reason","type":"string"}},"required":["reason"],"title":"failArguments"},"name":"fail","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"title":"failOutput","type":"object"}}],"ttlMs":0,"_meta":{"io.modelcontextprotocol/serverInfo":{"name":"fixture-server","version":"1.0.0"}}}}
modern_elicit_decline (2026-07-28, 6 messages): 2026-07-28: the user declines
1. client → server
{"jsonrpc":"2.0","id":"c1","method":"tools/call","params":{"name":"delete_file","arguments":{"path":"build/"},"_meta":{"io.modelcontextprotocol/protocolVersion":"2026-07-28","io.modelcontextprotocol/clientInfo":{"name":"fixture-client","version":"1.0.0"},"io.modelcontextprotocol/clientCapabilities":{"elicitation":{"form":{},"url":{}}}}}}2. server → client
{"jsonrpc":"2.0","id":"c1","result":{"inputRequests":{"confirm":{"method":"elicitation/create","params":{"message":"Delete build/?","mode":"form","requestedSchema":{"properties":{"confirm":{"type":"boolean"}},"required":["confirm"],"type":"object"}}}},"resultType":"input_required","_meta":{"io.modelcontextprotocol/serverInfo":{"name":"fixture-server","version":"1.0.0"}}}}3. client → server
{"jsonrpc":"2.0","id":"c2","method":"tools/call","params":{"inputResponses":{"confirm":{"action":"decline"}},"name":"delete_file","arguments":{"path":"build/"},"_meta":{"io.modelcontextprotocol/protocolVersion":"2026-07-28","io.modelcontextprotocol/clientInfo":{"name":"fixture-client","version":"1.0.0"},"io.modelcontextprotocol/clientCapabilities":{"elicitation":{"form":{},"url":{}}}}}}4. server → client
{"jsonrpc":"2.0","id":"c2","result":{"content":[{"text":"kept build/","type":"text"}],"isError":false,"resultType":"complete","structuredContent":{"result":"kept build/"},"_meta":{"io.modelcontextprotocol/serverInfo":{"name":"fixture-server","version":"1.0.0"}}}}5. client → server
{"jsonrpc":"2.0","id":"c3","method":"tools/list","params":{"_meta":{"io.modelcontextprotocol/protocolVersion":"2026-07-28","io.modelcontextprotocol/clientInfo":{"name":"fixture-client","version":"1.0.0"},"io.modelcontextprotocol/clientCapabilities":{"elicitation":{"form":{},"url":{}}}}}}6. server → client
{"jsonrpc":"2.0","id":"c3","result":{"cacheScope":"private","resultType":"complete","tools":[{"description":"Add two integers.","inputSchema":{"type":"object","properties":{"a":{"title":"A","type":"integer"},"b":{"title":"B","type":"integer"}},"required":["a","b"],"title":"addArguments"},"name":"add","outputSchema":{"properties":{"result":{"title":"Result","type":"integer"}},"required":["result"],"title":"addOutput","type":"object"}},{"description":"Read a document by URI.","inputSchema":{"type":"object","properties":{"uri":{"title":"Uri","type":"string"}},"required":["uri"],"title":"read_docArguments"},"name":"read_doc","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"title":"read_docOutput","type":"object"}},{"description":"Count to n, reporting progress.","inputSchema":{"type":"object","properties":{"n":{"title":"N","type":"integer"}},"required":["n"],"title":"countArguments"},"name":"count","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"title":"countOutput","type":"object"}},{"description":"Delete a file after the user confirms.","inputSchema":{"type":"object","properties":{"path":{"title":"Path","type":"string"}},"required":["path"],"title":"delete_fileArguments"},"name":"delete_file","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"title":"delete_fileOutput","type":"object"}},{"description":"Summarise text with the client's model.","inputSchema":{"type":"object","properties":{"text":{"title":"Text","type":"string"}},"required":["text"],"title":"summariseArguments"},"name":"summarise","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"title":"summariseOutput","type":"object"}},{"description":"Always fails (to show a tool error).","inputSchema":{"type":"object","properties":{"reason":{"title":"Reason","type":"string"}},"required":["reason"],"title":"failArguments"},"name":"fail","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"title":"failOutput","type":"object"}}],"ttlMs":0,"_meta":{"io.modelcontextprotocol/serverInfo":{"name":"fixture-server","version":"1.0.0"}}}}
legacy_sampling (legacy, 9 messages): 2025-11-25: the server asks the client's model (sampling/createMessage)
1. client → server
{"jsonrpc":"2.0","id":"c1","method":"initialize","params":{"protocolVersion":"2025-11-25","capabilities":{"sampling":{}},"clientInfo":{"name":"fixture-client","version":"1.0.0"}}}2. server → client
{"jsonrpc":"2.0","id":"c1","result":{"capabilities":{"prompts":{"listChanged":false},"resources":{"listChanged":false,"subscribe":false},"tools":{"listChanged":false}},"protocolVersion":"2025-11-25","serverInfo":{"name":"fixture-server","version":"1.0.0"}}}3. client → server
{"jsonrpc":"2.0","method":"notifications/initialized"}4. client → server
{"jsonrpc":"2.0","id":"c2","method":"tools/call","params":{"name":"summarise","arguments":{"text":"A tiny project with one test."}}}5. server → client
{"jsonrpc":"2.0","id":"s1","method":"sampling/createMessage","params":{"messages":[{"role":"user","content":{"type":"text","text":"Summarise: A tiny project with one test."}}],"maxTokens":50}}6. client → server
{"jsonrpc":"2.0","id":"s1","result":{"role":"assistant","content":{"type":"text","text":"A tiny demo project."},"model":"scripted-model","stopReason":"endTurn"}}7. server → client
{"jsonrpc":"2.0","id":"c2","result":{"content":[{"text":"A tiny demo project.","type":"text"}],"isError":false,"structuredContent":{"result":"A tiny demo project."}}}8. client → server
{"jsonrpc":"2.0","id":"c3","method":"tools/list"}9. server → client
{"jsonrpc":"2.0","id":"c3","result":{"tools":[{"description":"Add two integers.","inputSchema":{"properties":{"a":{"title":"A","type":"integer"},"b":{"title":"B","type":"integer"}},"required":["a","b"],"type":"object","title":"addArguments"},"name":"add","outputSchema":{"properties":{"result":{"title":"Result","type":"integer"}},"required":["result"],"type":"object","title":"addOutput"}},{"description":"Read a document by URI.","inputSchema":{"properties":{"uri":{"title":"Uri","type":"string"}},"required":["uri"],"type":"object","title":"read_docArguments"},"name":"read_doc","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"type":"object","title":"read_docOutput"}},{"description":"Count to n, reporting progress.","inputSchema":{"properties":{"n":{"title":"N","type":"integer"}},"required":["n"],"type":"object","title":"countArguments"},"name":"count","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"type":"object","title":"countOutput"}},{"description":"Delete a file after the user confirms.","inputSchema":{"properties":{"path":{"title":"Path","type":"string"}},"required":["path"],"type":"object","title":"delete_fileArguments"},"name":"delete_file","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"type":"object","title":"delete_fileOutput"}},{"description":"Summarise text with the client's model.","inputSchema":{"properties":{"text":{"title":"Text","type":"string"}},"required":["text"],"type":"object","title":"summariseArguments"},"name":"summarise","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"type":"object","title":"summariseOutput"}},{"description":"Always fails (to show a tool error).","inputSchema":{"properties":{"reason":{"title":"Reason","type":"string"}},"required":["reason"],"type":"object","title":"failArguments"},"name":"fail","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"type":"object","title":"failOutput"}}]}}
modern_sampling (2026-07-28, 6 messages): 2026-07-28: sampling as an input request
1. client → server
{"jsonrpc":"2.0","id":"c1","method":"tools/call","params":{"name":"summarise","arguments":{"text":"A tiny project with one test."},"_meta":{"io.modelcontextprotocol/protocolVersion":"2026-07-28","io.modelcontextprotocol/clientInfo":{"name":"fixture-client","version":"1.0.0"},"io.modelcontextprotocol/clientCapabilities":{"sampling":{}}}}}2. server → client
{"jsonrpc":"2.0","id":"c1","result":{"inputRequests":{"summary":{"method":"sampling/createMessage","params":{"maxTokens":50,"messages":[{"content":{"text":"Summarise: A tiny project with one test.","type":"text"},"role":"user"}]}}},"resultType":"input_required","_meta":{"io.modelcontextprotocol/serverInfo":{"name":"fixture-server","version":"1.0.0"}}}}3. client → server
{"jsonrpc":"2.0","id":"c2","method":"tools/call","params":{"inputResponses":{"summary":{"role":"assistant","content":{"type":"text","text":"A tiny demo project."},"model":"scripted-model","stopReason":"endTurn"}},"name":"summarise","arguments":{"text":"A tiny project with one test."},"_meta":{"io.modelcontextprotocol/protocolVersion":"2026-07-28","io.modelcontextprotocol/clientInfo":{"name":"fixture-client","version":"1.0.0"},"io.modelcontextprotocol/clientCapabilities":{"sampling":{}}}}}4. server → client
{"jsonrpc":"2.0","id":"c2","result":{"content":[{"text":"A tiny demo project.","type":"text"}],"isError":false,"resultType":"complete","structuredContent":{"result":"A tiny demo project."},"_meta":{"io.modelcontextprotocol/serverInfo":{"name":"fixture-server","version":"1.0.0"}}}}5. client → server
{"jsonrpc":"2.0","id":"c3","method":"tools/list","params":{"_meta":{"io.modelcontextprotocol/protocolVersion":"2026-07-28","io.modelcontextprotocol/clientInfo":{"name":"fixture-client","version":"1.0.0"},"io.modelcontextprotocol/clientCapabilities":{"sampling":{}}}}}6. server → client
{"jsonrpc":"2.0","id":"c3","result":{"cacheScope":"private","resultType":"complete","tools":[{"description":"Add two integers.","inputSchema":{"type":"object","properties":{"a":{"title":"A","type":"integer"},"b":{"title":"B","type":"integer"}},"required":["a","b"],"title":"addArguments"},"name":"add","outputSchema":{"properties":{"result":{"title":"Result","type":"integer"}},"required":["result"],"title":"addOutput","type":"object"}},{"description":"Read a document by URI.","inputSchema":{"type":"object","properties":{"uri":{"title":"Uri","type":"string"}},"required":["uri"],"title":"read_docArguments"},"name":"read_doc","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"title":"read_docOutput","type":"object"}},{"description":"Count to n, reporting progress.","inputSchema":{"type":"object","properties":{"n":{"title":"N","type":"integer"}},"required":["n"],"title":"countArguments"},"name":"count","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"title":"countOutput","type":"object"}},{"description":"Delete a file after the user confirms.","inputSchema":{"type":"object","properties":{"path":{"title":"Path","type":"string"}},"required":["path"],"title":"delete_fileArguments"},"name":"delete_file","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"title":"delete_fileOutput","type":"object"}},{"description":"Summarise text with the client's model.","inputSchema":{"type":"object","properties":{"text":{"title":"Text","type":"string"}},"required":["text"],"title":"summariseArguments"},"name":"summarise","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"title":"summariseOutput","type":"object"}},{"description":"Always fails (to show a tool error).","inputSchema":{"type":"object","properties":{"reason":{"title":"Reason","type":"string"}},"required":["reason"],"title":"failArguments"},"name":"fail","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"title":"failOutput","type":"object"}}],"ttlMs":0,"_meta":{"io.modelcontextprotocol/serverInfo":{"name":"fixture-server","version":"1.0.0"}}}}
raw_errors (raw, 9 messages): Malformed JSON (no reply), an unsupported version, an unknown method, no _meta, then a good request
1. client → server
{not json2. client → server
{"jsonrpc":"2.0","id":"c1","method":"tools/list","params":{"_meta":{"io.modelcontextprotocol/protocolVersion":"2099-01-01","io.modelcontextprotocol/clientCapabilities":{}}}}3. server → client
{"jsonrpc":"2.0","id":"c1","error":{"code":-32022,"message":"Unsupported protocol version","data":{"supported":["2026-07-28"],"requested":"2099-01-01"}}}4. client → server
{"jsonrpc":"2.0","id":"c2","method":"no/such/method","params":{"_meta":{"io.modelcontextprotocol/protocolVersion":"2026-07-28","io.modelcontextprotocol/clientCapabilities":{}}}}5. server → client
{"jsonrpc":"2.0","id":"c2","error":{"code":-32601,"message":"Method not found","data":"no/such/method"}}6. client → server
{"jsonrpc":"2.0","id":"c3","method":"tools/list"}7. server → client
{"jsonrpc":"2.0","id":"c3","error":{"code":-32602,"message":"params._meta must be an object carrying the required 'io.modelcontextprotocol/protocolVersion' and 'io.modelcontextprotocol/clientCapabilities' envelope keys"}}8. client → server
{"jsonrpc":"2.0","id":"c4","method":"tools/list","params":{"_meta":{"io.modelcontextprotocol/protocolVersion":"2026-07-28","io.modelcontextprotocol/clientCapabilities":{}}}}9. server → client
{"jsonrpc":"2.0","id":"c4","result":{"cacheScope":"private","resultType":"complete","tools":[{"description":"Add two integers.","inputSchema":{"type":"object","properties":{"a":{"title":"A","type":"integer"},"b":{"title":"B","type":"integer"}},"required":["a","b"],"title":"addArguments"},"name":"add","outputSchema":{"properties":{"result":{"title":"Result","type":"integer"}},"required":["result"],"title":"addOutput","type":"object"}},{"description":"Read a document by URI.","inputSchema":{"type":"object","properties":{"uri":{"title":"Uri","type":"string"}},"required":["uri"],"title":"read_docArguments"},"name":"read_doc","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"title":"read_docOutput","type":"object"}},{"description":"Count to n, reporting progress.","inputSchema":{"type":"object","properties":{"n":{"title":"N","type":"integer"}},"required":["n"],"title":"countArguments"},"name":"count","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"title":"countOutput","type":"object"}},{"description":"Delete a file after the user confirms.","inputSchema":{"type":"object","properties":{"path":{"title":"Path","type":"string"}},"required":["path"],"title":"delete_fileArguments"},"name":"delete_file","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"title":"delete_fileOutput","type":"object"}},{"description":"Summarise text with the client's model.","inputSchema":{"type":"object","properties":{"text":{"title":"Text","type":"string"}},"required":["text"],"title":"summariseArguments"},"name":"summarise","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"title":"summariseOutput","type":"object"}},{"description":"Always fails (to show a tool error).","inputSchema":{"type":"object","properties":{"reason":{"title":"Reason","type":"string"}},"required":["reason"],"title":"failArguments"},"name":"fail","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"title":"failOutput","type":"object"}}],"ttlMs":0,"_meta":{"io.modelcontextprotocol/serverInfo":{"name":"fixture-server","version":"1.0.0"}}}}
raw_handshake (raw, 7 messages): A request before the handshake, an unknown version (the server offers its own), then a 2026-07-28 request on a handshake connection
1. client → server
{"jsonrpc":"2.0","id":"c1","method":"tools/list"}2. server → client
{"jsonrpc":"2.0","id":"c1","error":{"code":-32602,"message":"Invalid request parameters","data":""}}3. client → server
{"jsonrpc":"2.0","id":"c2","method":"initialize","params":{"protocolVersion":"1999-01-01","capabilities":{},"clientInfo":{"name":"fixture-client","version":"1.0.0"}}}4. server → client
{"jsonrpc":"2.0","id":"c2","result":{"capabilities":{"prompts":{"listChanged":false},"resources":{"listChanged":false,"subscribe":false},"tools":{"listChanged":false}},"protocolVersion":"2025-11-25","serverInfo":{"name":"fixture-server","version":"1.0.0"}}}5. client → server
{"jsonrpc":"2.0","method":"notifications/initialized"}6. client → server
{"jsonrpc":"2.0","id":"c3","method":"server/discover","params":{"_meta":{"io.modelcontextprotocol/protocolVersion":"2026-07-28","io.modelcontextprotocol/clientCapabilities":{}}}}7. server → client
{"jsonrpc":"2.0","id":"c3","error":{"code":-32600,"message":"this connection serves the handshake protocol era; requests carrying the 2026-07-28 envelope are not accepted on it"}}
raw_old_version (raw, 5 messages): A client asking for the first revision, 2024-11-05: the server agrees
1. client → server
{"jsonrpc":"2.0","id":"c1","method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"fixture-client","version":"1.0.0"}}}2. server → client
{"jsonrpc":"2.0","id":"c1","result":{"capabilities":{"prompts":{"listChanged":false},"resources":{"listChanged":false,"subscribe":false},"tools":{"listChanged":false}},"protocolVersion":"2024-11-05","serverInfo":{"name":"fixture-server","version":"1.0.0"}}}3. client → server
{"jsonrpc":"2.0","method":"notifications/initialized"}4. client → server
{"jsonrpc":"2.0","id":"c2","method":"tools/list"}5. server → client
{"jsonrpc":"2.0","id":"c2","result":{"tools":[{"description":"Add two integers.","inputSchema":{"properties":{"a":{"title":"A","type":"integer"},"b":{"title":"B","type":"integer"}},"required":["a","b"],"type":"object","title":"addArguments"},"name":"add","outputSchema":{"properties":{"result":{"title":"Result","type":"integer"}},"required":["result"],"type":"object","title":"addOutput"}},{"description":"Read a document by URI.","inputSchema":{"properties":{"uri":{"title":"Uri","type":"string"}},"required":["uri"],"type":"object","title":"read_docArguments"},"name":"read_doc","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"type":"object","title":"read_docOutput"}},{"description":"Count to n, reporting progress.","inputSchema":{"properties":{"n":{"title":"N","type":"integer"}},"required":["n"],"type":"object","title":"countArguments"},"name":"count","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"type":"object","title":"countOutput"}},{"description":"Delete a file after the user confirms.","inputSchema":{"properties":{"path":{"title":"Path","type":"string"}},"required":["path"],"type":"object","title":"delete_fileArguments"},"name":"delete_file","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"type":"object","title":"delete_fileOutput"}},{"description":"Summarise text with the client's model.","inputSchema":{"properties":{"text":{"title":"Text","type":"string"}},"required":["text"],"type":"object","title":"summariseArguments"},"name":"summarise","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"type":"object","title":"summariseOutput"}},{"description":"Always fails (to show a tool error).","inputSchema":{"properties":{"reason":{"title":"Reason","type":"string"}},"required":["reason"],"type":"object","title":"failArguments"},"name":"fail","outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"type":"object","title":"failOutput"}}]}}
The server
Written with the SDK's high-level MCPServer. Its tools cover a plain call, progress, elicitation, sampling and an error; in 2026-07-28 it returns input_required where the handshake era sends a request.
conformance/sdk_server.py
"""The MCP server the conformance recordings talk to, written with the official MCP Python SDK.
Run by ``scripts/record_sdk.py`` as a stdio subprocess. The engine's model of this server
(``agent_loop_sim.protocols.mcp.FIXTURE_SERVER``) must produce the same JSON-RPC messages.
It speaks both protocol eras the SDK supports: the handshake era (``initialize``, up to
2025-11-25) and the stateless 2026-07-28 revision, where a request that needs the user or a
model returns ``resultType: "input_required"`` instead of sending a request to the client.
"""
from __future__ import annotations
import warnings
import mcp_types as types
from mcp.server import MCPServer
from mcp.server.mcpserver import Context
warnings.simplefilter("ignore") # the SDK marks sampling as deprecated in 2026-07-28 (SEP-2577)
MODERN = "2026-07-28"
mcp = MCPServer("fixture-server", version="1.0.0")
@mcp.tool()
def add(a: int, b: int) -> int:
"""Add two integers."""
return a + b
@mcp.tool()
async def read_doc(uri: str, ctx: Context) -> str:
"""Read a document by URI."""
contents = list(await ctx.read_resource(uri))
return str(contents[0].content)
@mcp.tool()
async def count(n: int, ctx: Context) -> str:
"""Count to n, reporting progress."""
for i in range(1, n + 1):
await ctx.report_progress(i, n)
return f"counted to {n}"
CONFIRM_SCHEMA = {"type": "object", "properties": {"confirm": {"type": "boolean"}}, "required": ["confirm"]}
@mcp.tool()
async def delete_file(path: str, ctx: Context) -> str:
"""Delete a file after the user confirms."""
if ctx.protocol_version == MODERN:
responses = ctx.input_responses
if not responses:
return types.InputRequiredResult( # type: ignore[return-value]
input_requests={
"confirm": types.ElicitRequest(
params=types.ElicitRequestFormParams(message=f"Delete {path}?", requested_schema=CONFIRM_SCHEMA)
)
}
)
answer = responses["confirm"]
ok = answer.action == "accept" and bool((answer.content or {}).get("confirm"))
else:
r = await ctx.session.elicit_form(f"Delete {path}?", CONFIRM_SCHEMA, related_request_id=ctx.request_id)
ok = r.action == "accept" and bool((r.content or {}).get("confirm"))
return f"deleted {path}" if ok else f"kept {path}"
def _sampling_request(text: str) -> types.CreateMessageRequestParams:
return types.CreateMessageRequestParams(
messages=[types.SamplingMessage(role="user", content=types.TextContent(type="text", text=f"Summarise: {text}"))],
max_tokens=50,
)
@mcp.tool()
async def summarise(text: str, ctx: Context) -> str:
"""Summarise text with the client's model."""
if ctx.protocol_version == MODERN:
responses = ctx.input_responses
if not responses:
return types.InputRequiredResult( # type: ignore[return-value]
input_requests={"summary": types.CreateMessageRequest(params=_sampling_request(text))}
)
content = responses["summary"].content
else:
p = _sampling_request(text)
r = await ctx.session.create_message(p.messages, max_tokens=p.max_tokens, related_request_id=ctx.request_id)
content = r.content
return content.text if isinstance(content, types.TextContent) else "?"
@mcp.tool()
def fail(reason: str) -> str:
"""Always fails (to show a tool error)."""
raise ValueError(reason)
@mcp.resource("docs://readme", mime_type="text/markdown")
def readme() -> str:
"""The project README."""
return "# Demo\nA tiny project."
@mcp.prompt()
def review(code: str) -> str:
"""Review a piece of code."""
return f"Please review:\n{code}"
if __name__ == "__main__":
mcp.run()
A2A: the official A2A SDK
The agent-to-agent chapter is checked the same way. A research agent written with the official A2A Python SDK (a2a-sdk 1.2.2, protocol 1.0; the specification, release 1.0.1) serves the JSON-RPC binding in process, and the engine's own orchestrator drives it through 8 sessions, 56 messages in all. The engine's agent must give the same messages, compared as JSON with every UUID renumbered in order of appearance and every timestamp blanked. The engine's CI records the SDK again on every change. The recording: a2a_sdk_exchanges.json.
- Cancelling a task that is waiting for input (so nothing is running for it) writes
TASK_STATE_CANCELEDover its stored status and keeps the status message. - A message to a finished task is refused with -32004, "Task … is in terminal state: …".
- A request with no
A2A-Versionheader is read as 0.3, and a 1.0-only agent refuses it (-32009), as the specification requires.
a2a_send (6 messages): Delegate a task and wait for the result
1. orchestrator → agent
{"method":"GET","url":"https://research.example.com/.well-known/agent-card.json"}2. agent → orchestrator
{"body":{"capabilities":{"streaming":true},"defaultInputModes":["text/plain"],"defaultOutputModes":["text/plain"],"description":"Summarises documents and meetings for other agents.","name":"Research agent","skills":[{"description":"Summarise a document or a meeting.","examples":["summarise the design notes"],"id":"summarise","name":"Summarise","tags":["summary","text"]},{"description":"Today's meetings from the user's calendar (the user signs in first).","examples":["check my calendar"],"id":"calendar","name":"Calendar digest","tags":["calendar"]}],"supportedInterfaces":[{"protocolBinding":"JSONRPC","protocolVersion":"1.0","url":"https://research.example.com/a2a"}],"version":"1.0.0"},"headers":[["Content-Type","application/json"],["ETag","W/\"0c789eab44ebe1544de8bfee2d00e741a531c349c36d6412efdb06a89af89f4c\""]],"status":200}3. orchestrator → agent
{"id":1,"jsonrpc":"2.0","method":"SendMessage","params":{"message":{"messageId":"<id-1>","parts":[{"text":"summarise the design notes"}],"role":"ROLE_USER"}}}4. agent → orchestrator
{"id":1,"jsonrpc":"2.0","result":{"task":{"artifacts":[{"artifactId":"<id-2>","name":"summary","parts":[{"text":"Summary of the design notes: "},{"text":"three decisions, two actions, no blockers."}]}],"contextId":"<id-3>","history":[{"contextId":"<id-3>","messageId":"<id-1>","parts":[{"text":"summarise the design notes"}],"role":"ROLE_USER","taskId":"<id-4>"}],"id":"<id-4>","status":{"state":"TASK_STATE_COMPLETED","timestamp":"<time>"}}}}5. orchestrator → agent
{"id":2,"jsonrpc":"2.0","method":"GetTask","params":{"id":"<id-4>"}}6. agent → orchestrator
{"id":2,"jsonrpc":"2.0","result":{"artifacts":[{"artifactId":"<id-2>","name":"summary","parts":[{"text":"Summary of the design notes: "},{"text":"three decisions, two actions, no blockers."}]}],"contextId":"<id-3>","history":[{"contextId":"<id-3>","messageId":"<id-1>","parts":[{"text":"summarise the design notes"}],"role":"ROLE_USER","taskId":"<id-4>"}],"id":"<id-4>","status":{"state":"TASK_STATE_COMPLETED","timestamp":"<time>"}}}
a2a_stream (8 messages): Delegate a task and stream its progress
1. orchestrator → agent
{"method":"GET","url":"https://research.example.com/.well-known/agent-card.json"}2. agent → orchestrator
{"body":{"capabilities":{"streaming":true},"defaultInputModes":["text/plain"],"defaultOutputModes":["text/plain"],"description":"Summarises documents and meetings for other agents.","name":"Research agent","skills":[{"description":"Summarise a document or a meeting.","examples":["summarise the design notes"],"id":"summarise","name":"Summarise","tags":["summary","text"]},{"description":"Today's meetings from the user's calendar (the user signs in first).","examples":["check my calendar"],"id":"calendar","name":"Calendar digest","tags":["calendar"]}],"supportedInterfaces":[{"protocolBinding":"JSONRPC","protocolVersion":"1.0","url":"https://research.example.com/a2a"}],"version":"1.0.0"},"headers":[["Content-Type","application/json"],["ETag","W/\"0c789eab44ebe1544de8bfee2d00e741a531c349c36d6412efdb06a89af89f4c\""]],"status":200}3. orchestrator → agent
{"id":1,"jsonrpc":"2.0","method":"SendStreamingMessage","params":{"message":{"messageId":"<id-1>","parts":[{"text":"summarise the design notes"}],"role":"ROLE_USER"}}}4. agent → orchestrator (SSE event)
{"id":1,"jsonrpc":"2.0","result":{"task":{"contextId":"<id-2>","history":[{"contextId":"<id-2>","messageId":"<id-1>","parts":[{"text":"summarise the design notes"}],"role":"ROLE_USER","taskId":"<id-3>"}],"id":"<id-3>","status":{"state":"TASK_STATE_SUBMITTED"}}}}5. agent → orchestrator (SSE event)
{"id":1,"jsonrpc":"2.0","result":{"statusUpdate":{"contextId":"<id-2>","status":{"state":"TASK_STATE_WORKING","timestamp":"<time>"},"taskId":"<id-3>"}}}6. agent → orchestrator (SSE event)
{"id":1,"jsonrpc":"2.0","result":{"artifactUpdate":{"artifact":{"artifactId":"<id-4>","name":"summary","parts":[{"text":"Summary of the design notes: "}]},"contextId":"<id-2>","taskId":"<id-3>"}}}7. agent → orchestrator (SSE event)
{"id":1,"jsonrpc":"2.0","result":{"artifactUpdate":{"append":true,"artifact":{"artifactId":"<id-4>","name":"summary","parts":[{"text":"three decisions, two actions, no blockers."}]},"contextId":"<id-2>","lastChunk":true,"taskId":"<id-3>"}}}8. agent → orchestrator (SSE event)
{"id":1,"jsonrpc":"2.0","result":{"statusUpdate":{"contextId":"<id-2>","status":{"state":"TASK_STATE_COMPLETED","timestamp":"<time>"},"taskId":"<id-3>"}}}
a2a_input (6 messages): The remote agent needs more input
1. orchestrator → agent
{"method":"GET","url":"https://research.example.com/.well-known/agent-card.json"}2. agent → orchestrator
{"body":{"capabilities":{"streaming":true},"defaultInputModes":["text/plain"],"defaultOutputModes":["text/plain"],"description":"Summarises documents and meetings for other agents.","name":"Research agent","skills":[{"description":"Summarise a document or a meeting.","examples":["summarise the design notes"],"id":"summarise","name":"Summarise","tags":["summary","text"]},{"description":"Today's meetings from the user's calendar (the user signs in first).","examples":["check my calendar"],"id":"calendar","name":"Calendar digest","tags":["calendar"]}],"supportedInterfaces":[{"protocolBinding":"JSONRPC","protocolVersion":"1.0","url":"https://research.example.com/a2a"}],"version":"1.0.0"},"headers":[["Content-Type","application/json"],["ETag","W/\"0c789eab44ebe1544de8bfee2d00e741a531c349c36d6412efdb06a89af89f4c\""]],"status":200}3. orchestrator → agent
{"id":1,"jsonrpc":"2.0","method":"SendMessage","params":{"message":{"messageId":"<id-1>","parts":[{"text":"summarise the meeting"}],"role":"ROLE_USER"}}}4. agent → orchestrator
{"id":1,"jsonrpc":"2.0","result":{"task":{"contextId":"<id-2>","history":[{"contextId":"<id-2>","messageId":"<id-1>","parts":[{"text":"summarise the meeting"}],"role":"ROLE_USER","taskId":"<id-3>"}],"id":"<id-3>","status":{"message":{"contextId":"<id-2>","messageId":"<id-4>","parts":[{"text":"Which meeting: Monday's or Tuesday's?"}],"role":"ROLE_AGENT","taskId":"<id-3>"},"state":"TASK_STATE_INPUT_REQUIRED","timestamp":"<time>"}}}}5. orchestrator → agent
{"id":2,"jsonrpc":"2.0","method":"SendMessage","params":{"message":{"contextId":"<id-2>","messageId":"<id-5>","parts":[{"text":"Tuesday"}],"role":"ROLE_USER","taskId":"<id-3>"}}}6. agent → orchestrator
{"id":2,"jsonrpc":"2.0","result":{"task":{"artifacts":[{"artifactId":"<id-6>","name":"summary","parts":[{"text":"Summary of Tuesday's meeting: "},{"text":"three decisions, two actions, no blockers."}]}],"contextId":"<id-2>","history":[{"contextId":"<id-2>","messageId":"<id-1>","parts":[{"text":"summarise the meeting"}],"role":"ROLE_USER","taskId":"<id-3>"},{"contextId":"<id-2>","messageId":"<id-4>","parts":[{"text":"Which meeting: Monday's or Tuesday's?"}],"role":"ROLE_AGENT","taskId":"<id-3>"},{"contextId":"<id-2>","messageId":"<id-5>","parts":[{"text":"Tuesday"}],"role":"ROLE_USER","taskId":"<id-3>"}],"id":"<id-3>","status":{"state":"TASK_STATE_COMPLETED","timestamp":"<time>"}}}}
a2a_auth (6 messages): The remote agent needs the user to sign in
1. orchestrator → agent
{"method":"GET","url":"https://research.example.com/.well-known/agent-card.json"}2. agent → orchestrator
{"body":{"capabilities":{"streaming":true},"defaultInputModes":["text/plain"],"defaultOutputModes":["text/plain"],"description":"Summarises documents and meetings for other agents.","name":"Research agent","skills":[{"description":"Summarise a document or a meeting.","examples":["summarise the design notes"],"id":"summarise","name":"Summarise","tags":["summary","text"]},{"description":"Today's meetings from the user's calendar (the user signs in first).","examples":["check my calendar"],"id":"calendar","name":"Calendar digest","tags":["calendar"]}],"supportedInterfaces":[{"protocolBinding":"JSONRPC","protocolVersion":"1.0","url":"https://research.example.com/a2a"}],"version":"1.0.0"},"headers":[["Content-Type","application/json"],["ETag","W/\"0c789eab44ebe1544de8bfee2d00e741a531c349c36d6412efdb06a89af89f4c\""]],"status":200}3. orchestrator → agent
{"id":1,"jsonrpc":"2.0","method":"SendMessage","params":{"message":{"messageId":"<id-1>","parts":[{"text":"check my calendar"}],"role":"ROLE_USER"}}}4. agent → orchestrator
{"id":1,"jsonrpc":"2.0","result":{"task":{"contextId":"<id-2>","history":[{"contextId":"<id-2>","messageId":"<id-1>","parts":[{"text":"check my calendar"}],"role":"ROLE_USER","taskId":"<id-3>"}],"id":"<id-3>","status":{"message":{"contextId":"<id-2>","messageId":"<id-4>","parts":[{"text":"Sign in to the calendar first: https://calendar.example.com/authorize"}],"role":"ROLE_AGENT","taskId":"<id-3>"},"state":"TASK_STATE_AUTH_REQUIRED","timestamp":"<time>"}}}}5. orchestrator → agent
{"id":2,"jsonrpc":"2.0","method":"SendMessage","params":{"message":{"contextId":"<id-2>","messageId":"<id-5>","parts":[{"text":"signed in"}],"role":"ROLE_USER","taskId":"<id-3>"}}}6. agent → orchestrator
{"id":2,"jsonrpc":"2.0","result":{"task":{"artifacts":[{"artifactId":"<id-6>","name":"summary","parts":[{"text":"Today: "},{"text":"design review at 10:00, one-to-one at 15:00."}]}],"contextId":"<id-2>","history":[{"contextId":"<id-2>","messageId":"<id-1>","parts":[{"text":"check my calendar"}],"role":"ROLE_USER","taskId":"<id-3>"},{"contextId":"<id-2>","messageId":"<id-4>","parts":[{"text":"Sign in to the calendar first: https://calendar.example.com/authorize"}],"role":"ROLE_AGENT","taskId":"<id-3>"},{"contextId":"<id-2>","messageId":"<id-5>","parts":[{"text":"signed in"}],"role":"ROLE_USER","taskId":"<id-3>"}],"id":"<id-3>","status":{"state":"TASK_STATE_COMPLETED","timestamp":"<time>"}}}}
a2a_cancel (12 messages): Cancel a task, then try to use it
1. orchestrator → agent
{"method":"GET","url":"https://research.example.com/.well-known/agent-card.json"}2. agent → orchestrator
{"body":{"capabilities":{"streaming":true},"defaultInputModes":["text/plain"],"defaultOutputModes":["text/plain"],"description":"Summarises documents and meetings for other agents.","name":"Research agent","skills":[{"description":"Summarise a document or a meeting.","examples":["summarise the design notes"],"id":"summarise","name":"Summarise","tags":["summary","text"]},{"description":"Today's meetings from the user's calendar (the user signs in first).","examples":["check my calendar"],"id":"calendar","name":"Calendar digest","tags":["calendar"]}],"supportedInterfaces":[{"protocolBinding":"JSONRPC","protocolVersion":"1.0","url":"https://research.example.com/a2a"}],"version":"1.0.0"},"headers":[["Content-Type","application/json"],["ETag","W/\"0c789eab44ebe1544de8bfee2d00e741a531c349c36d6412efdb06a89af89f4c\""]],"status":200}3. orchestrator → agent
{"id":1,"jsonrpc":"2.0","method":"SendMessage","params":{"message":{"messageId":"<id-1>","parts":[{"text":"summarise the meeting"}],"role":"ROLE_USER"}}}4. agent → orchestrator
{"id":1,"jsonrpc":"2.0","result":{"task":{"contextId":"<id-2>","history":[{"contextId":"<id-2>","messageId":"<id-1>","parts":[{"text":"summarise the meeting"}],"role":"ROLE_USER","taskId":"<id-3>"}],"id":"<id-3>","status":{"message":{"contextId":"<id-2>","messageId":"<id-4>","parts":[{"text":"Which meeting: Monday's or Tuesday's?"}],"role":"ROLE_AGENT","taskId":"<id-3>"},"state":"TASK_STATE_INPUT_REQUIRED","timestamp":"<time>"}}}}5. orchestrator → agent
{"id":2,"jsonrpc":"2.0","method":"CancelTask","params":{"id":"<id-3>"}}6. agent → orchestrator
{"id":2,"jsonrpc":"2.0","result":{"contextId":"<id-2>","history":[{"contextId":"<id-2>","messageId":"<id-1>","parts":[{"text":"summarise the meeting"}],"role":"ROLE_USER","taskId":"<id-3>"}],"id":"<id-3>","status":{"message":{"contextId":"<id-2>","messageId":"<id-4>","parts":[{"text":"Which meeting: Monday's or Tuesday's?"}],"role":"ROLE_AGENT","taskId":"<id-3>"},"state":"TASK_STATE_CANCELED","timestamp":"<time>"}}}7. orchestrator → agent
{"id":3,"jsonrpc":"2.0","method":"CancelTask","params":{"id":"<id-3>"}}8. agent → orchestrator
{"error":{"code":-32002,"data":[{"@type":"type.googleapis.com/google.rpc.ErrorInfo","domain":"a2a-protocol.org","metadata":{},"reason":"TASK_NOT_CANCELABLE"}],"message":"Task cannot be canceled"},"id":3,"jsonrpc":"2.0"}9. orchestrator → agent
{"id":4,"jsonrpc":"2.0","method":"SendMessage","params":{"message":{"contextId":"<id-2>","messageId":"<id-5>","parts":[{"text":"Tuesday"}],"role":"ROLE_USER","taskId":"<id-3>"}}}10. agent → orchestrator
{"error":{"code":-32004,"data":[{"@type":"type.googleapis.com/google.rpc.ErrorInfo","domain":"a2a-protocol.org","metadata":{},"reason":"UNSUPPORTED_OPERATION"}],"message":"Task <id-3> is in terminal state: TASK_STATE_CANCELED"},"id":4,"jsonrpc":"2.0"}11. orchestrator → agent
{"id":5,"jsonrpc":"2.0","method":"SubscribeToTask","params":{"id":"<id-3>"}}12. agent → orchestrator
{"error":{"code":-32004,"data":[{"@type":"type.googleapis.com/google.rpc.ErrorInfo","domain":"a2a-protocol.org","metadata":{},"reason":"UNSUPPORTED_OPERATION"}],"message":"Task <id-3> is in terminal state: TASK_STATE_CANCELED"},"id":5,"jsonrpc":"2.0"}
a2a_reject (4 messages): The remote agent rejects the task
1. orchestrator → agent
{"method":"GET","url":"https://research.example.com/.well-known/agent-card.json"}2. agent → orchestrator
{"body":{"capabilities":{"streaming":true},"defaultInputModes":["text/plain"],"defaultOutputModes":["text/plain"],"description":"Summarises documents and meetings for other agents.","name":"Research agent","skills":[{"description":"Summarise a document or a meeting.","examples":["summarise the design notes"],"id":"summarise","name":"Summarise","tags":["summary","text"]},{"description":"Today's meetings from the user's calendar (the user signs in first).","examples":["check my calendar"],"id":"calendar","name":"Calendar digest","tags":["calendar"]}],"supportedInterfaces":[{"protocolBinding":"JSONRPC","protocolVersion":"1.0","url":"https://research.example.com/a2a"}],"version":"1.0.0"},"headers":[["Content-Type","application/json"],["ETag","W/\"0c789eab44ebe1544de8bfee2d00e741a531c349c36d6412efdb06a89af89f4c\""]],"status":200}3. orchestrator → agent
{"id":1,"jsonrpc":"2.0","method":"SendMessage","params":{"message":{"messageId":"<id-1>","parts":[{"text":"delete every draft"}],"role":"ROLE_USER"}}}4. agent → orchestrator
{"id":1,"jsonrpc":"2.0","result":{"task":{"contextId":"<id-2>","history":[{"contextId":"<id-2>","messageId":"<id-1>","parts":[{"text":"delete every draft"}],"role":"ROLE_USER","taskId":"<id-3>"}],"id":"<id-3>","status":{"message":{"contextId":"<id-2>","messageId":"<id-4>","parts":[{"text":"I only summarise; I do not delete files."}],"role":"ROLE_AGENT","taskId":"<id-3>"},"state":"TASK_STATE_REJECTED","timestamp":"<time>"}}}}
a2a_message (4 messages): A direct answer, no task
1. orchestrator → agent
{"method":"GET","url":"https://research.example.com/.well-known/agent-card.json"}2. agent → orchestrator
{"body":{"capabilities":{"streaming":true},"defaultInputModes":["text/plain"],"defaultOutputModes":["text/plain"],"description":"Summarises documents and meetings for other agents.","name":"Research agent","skills":[{"description":"Summarise a document or a meeting.","examples":["summarise the design notes"],"id":"summarise","name":"Summarise","tags":["summary","text"]},{"description":"Today's meetings from the user's calendar (the user signs in first).","examples":["check my calendar"],"id":"calendar","name":"Calendar digest","tags":["calendar"]}],"supportedInterfaces":[{"protocolBinding":"JSONRPC","protocolVersion":"1.0","url":"https://research.example.com/a2a"}],"version":"1.0.0"},"headers":[["Content-Type","application/json"],["ETag","W/\"0c789eab44ebe1544de8bfee2d00e741a531c349c36d6412efdb06a89af89f4c\""]],"status":200}3. orchestrator → agent
{"id":1,"jsonrpc":"2.0","method":"SendMessage","params":{"message":{"messageId":"<id-1>","parts":[{"text":"hello"}],"role":"ROLE_USER"}}}4. agent → orchestrator
{"id":1,"jsonrpc":"2.0","result":{"message":{"contextId":"<id-2>","messageId":"<id-3>","parts":[{"text":"Hello. Ask me to summarise something."}],"role":"ROLE_AGENT"}}}
a2a_errors (10 messages): Errors: no such task, no version, an old method name, no parts, no extended card
1. orchestrator → agent
{"id":1,"jsonrpc":"2.0","method":"GetTask","params":{"id":"<id-1>"}}2. agent → orchestrator
{"error":{"code":-32001,"data":[{"@type":"type.googleapis.com/google.rpc.ErrorInfo","domain":"a2a-protocol.org","metadata":{},"reason":"TASK_NOT_FOUND"}],"message":"Task not found"},"id":1,"jsonrpc":"2.0"}3. orchestrator → agent
{"id":2,"jsonrpc":"2.0","method":"SendMessage","params":{"message":{"messageId":"<id-2>","parts":[{"text":"summarise the design notes"}],"role":"ROLE_USER"}}}4. agent → orchestrator
{"error":{"code":-32009,"data":[{"@type":"type.googleapis.com/google.rpc.ErrorInfo","domain":"a2a-protocol.org","metadata":{},"reason":"VERSION_NOT_SUPPORTED"}],"message":"A2A version '0.3' is not supported by this handler. Expected version '1.0'."},"id":2,"jsonrpc":"2.0"}5. orchestrator → agent
{"id":3,"jsonrpc":"2.0","method":"message/send","params":{"message":{"messageId":"<id-2>","parts":[{"text":"summarise the design notes"}],"role":"ROLE_USER"}}}6. agent → orchestrator
{"error":{"code":-32601,"message":"Method not found"},"id":3,"jsonrpc":"2.0"}7. orchestrator → agent
{"id":4,"jsonrpc":"2.0","method":"SendMessage","params":{"message":{"messageId":"<id-3>","parts":[],"role":"ROLE_USER"}}}8. agent → orchestrator
{"error":{"code":-32602,"data":[{"@type":"type.googleapis.com/google.rpc.ErrorInfo","domain":"a2a-protocol.org","metadata":{"errors":[{"field":"message.parts","message":"Field must contain at least one element."}]},"reason":"INVALID_PARAMS"},{"@type":"type.googleapis.com/google.rpc.BadRequest","fieldViolations":[{"description":"Field must contain at least one element.","field":"message.parts"}]}],"message":"Validation failed"},"id":4,"jsonrpc":"2.0"}9. orchestrator → agent
{"id":5,"jsonrpc":"2.0","method":"GetExtendedAgentCard"}10. agent → orchestrator
{"error":{"code":-32004,"data":[{"@type":"type.googleapis.com/google.rpc.ErrorInfo","domain":"a2a-protocol.org","metadata":{},"reason":"UNSUPPORTED_OPERATION"}],"message":"The agent does not support authenticated extended cards"},"id":5,"jsonrpc":"2.0"}
conformance/a2a_sdk_server.py
"""The A2A agent the conformance recordings talk to, written with the official A2A Python SDK.
Run in-process by ``scripts/record_a2a_sdk.py`` (Starlette's test client: no socket is opened).
The engine's model of this agent (``agent_loop_sim.protocols.a2a.Agent``) must answer every
request with the same JSON-RPC messages and SSE events, apart from the IDs and timestamps the
SDK generates. A2A protocol version 1.0 (specification release 1.0.1).
The agent is a scripted "research agent" another agent delegates to:
- ``hello…`` answers with a Message (no task);
- ``delete…`` rejects the task;
- ``summarise the meeting`` needs input (which meeting?), then summarises the answer;
- ``check my calendar`` needs the user to sign in (auth required), then answers;
- ``summarise <x>`` works and returns its summary as an artifact in two chunks.
"""
from __future__ import annotations
import uuid
from starlette.applications import Starlette
from a2a.helpers.proto_helpers import new_task_from_user_message, new_text_message, new_text_part
from a2a.server.agent_execution import AgentExecutor, RequestContext
from a2a.server.request_handlers import DefaultRequestHandlerV2
from a2a.server.routes.agent_card_routes import create_agent_card_routes
from a2a.server.routes.jsonrpc_routes import create_jsonrpc_routes
from a2a.server.tasks import InMemoryTaskStore, TaskUpdater
from a2a.types import AgentCapabilities, AgentCard, AgentInterface, AgentSkill, TaskState
AGENT = "https://research.example.com"
RPC_PATH = "/a2a"
CARD = AgentCard(
name="Research agent",
description="Summarises documents and meetings for other agents.",
supported_interfaces=[AgentInterface(url=AGENT + RPC_PATH, protocol_binding="JSONRPC", protocol_version="1.0")],
version="1.0.0",
capabilities=AgentCapabilities(streaming=True),
default_input_modes=["text/plain"],
default_output_modes=["text/plain"],
skills=[
AgentSkill(id="summarise", name="Summarise", description="Summarise a document or a meeting.",
tags=["summary", "text"], examples=["summarise the design notes"]),
AgentSkill(id="calendar", name="Calendar digest",
description="Today's meetings from the user's calendar (the user signs in first).",
tags=["calendar"], examples=["check my calendar"]),
],
)
def agent_text(u: TaskUpdater, text: str):
return u.new_agent_message([new_text_part(text)])
async def finish(u: TaskUpdater, head: str, body: str) -> None:
"""The summary as one artifact streamed in two chunks, then completed."""
aid = str(uuid.uuid4())
await u.add_artifact([new_text_part(head)], artifact_id=aid, name="summary")
await u.add_artifact([new_text_part(body)], artifact_id=aid, name="summary", append=True, last_chunk=True)
await u.complete()
class ResearchAgent(AgentExecutor):
async def execute(self, context: RequestContext, q) -> None: # noqa: ANN001
text = context.get_user_input()
task = context.current_task
if task is None:
if text.startswith("hello"):
await q.enqueue_event(new_text_message("Hello. Ask me to summarise something.",
context_id=context.context_id))
return
task = new_task_from_user_message(context.message)
await q.enqueue_event(task)
u = TaskUpdater(q, task.id, task.context_id)
if text.startswith("delete"):
await u.reject(agent_text(u, "I only summarise; I do not delete files."))
return
await u.start_work()
if text == "summarise the meeting":
await u.requires_input(agent_text(u, "Which meeting: Monday's or Tuesday's?"))
return
if text == "check my calendar":
await u.requires_auth(agent_text(u, "Sign in to the calendar first: https://calendar.example.com/authorize"))
return
subject = text[len("summarise "):] if text.startswith("summarise ") else text
await finish(u, "Summary of " + subject + ": ", "three decisions, two actions, no blockers.")
return
u = TaskUpdater(q, task.id, task.context_id)
was = task.status.state
await u.start_work()
if was == TaskState.TASK_STATE_AUTH_REQUIRED:
await finish(u, "Today: ", "design review at 10:00, one-to-one at 15:00.")
else:
await finish(u, "Summary of " + text + "'s meeting: ", "three decisions, two actions, no blockers.")
async def cancel(self, context: RequestContext, q) -> None: # noqa: ANN001
await TaskUpdater(q, context.task_id, context.context_id).cancel()
def app() -> Starlette:
handler = DefaultRequestHandlerV2(agent_executor=ResearchAgent(), task_store=InMemoryTaskStore(), agent_card=CARD)
return Starlette(routes=create_agent_card_routes(CARD) + create_jsonrpc_routes(handler, RPC_PATH))