Describe the bug
When the Go SDK server handles requests declaring the 2026-07-28 protocol version, only three tested result types (CallToolResult, GetPromptResult, and ReadResourceResult) include the resultType field in their JSON responses. Other tested result types — including DiscoverResult, ListToolsResult, ListPromptsResult, ListResourcesResult, ListResourceTemplatesResult, and CompleteResult — omit resultType entirely.
The 2026-07-28 draft schema defines resultType as a required field on the base Result type:
"Result": {
"required": ["resultType"],
"properties": {
"resultType": {
"description": "... Servers implementing this protocol version MUST include this field. ..."
}
}
}
The same required constraint appears on the result schemas I checked in the generated schema.json, including Result, CacheableResult, CallToolResult, CompleteResult, DiscoverResult, GetPromptResult, InputRequiredResult, ListPromptsResult, ListResourceTemplatesResult, ListResourcesResult, ListToolsResult, PaginatedResult, ReadResourceResult, and SubscriptionsListenResult.
This appears to be a 2026-07-28 schema-compliance issue. The resultType field appears to be set only for the multi-round-trip (MRTR) result path, while the schema requires it on result objects generally.
Environment tested:
main snapshot from 2026-06-28: 65ece5964304528e7568507e2b17351824ef73fc
- Server used:
conformance/everything-server
- Transports: stdio and Streamable HTTP (stateless)
To Reproduce
Steps to reproduce the behavior:
- Start the Go SDK server with 2026-07-28 support enabled.
- Send a
server/discover request with _meta.io.modelcontextprotocol/protocolVersion: "2026-07-28".
- Observe that the response does not contain
resultType.
- Repeat with
tools/list, prompts/list, resources/list, completion/complete.
- Observe that none of these responses contain
resultType.
- Send a
tools/call request for a known tool.
- Observe that this response does contain
"resultType": "complete".
Example request:
{
"jsonrpc": "2.0",
"id": 1001,
"method": "tools/list",
"params": {
"_meta": {
"io.modelcontextprotocol/protocolVersion": "2026-07-28",
"io.modelcontextprotocol/clientInfo": {"name": "repro", "version": "0.1.0"},
"io.modelcontextprotocol/clientCapabilities": {}
}
}
}
Expected behavior
All result objects in 2026-07-28 responses should include "resultType": "complete" (or "input_required" when applicable). The schema required constraint and the spec text "Servers implementing this protocol version MUST include this field" apply to every result type, not only the three MRTR-capable types.
Observed behavior
Across both stdio and Streamable HTTP, the following pattern was observed:
| Method |
resultType present? |
server/discover |
No |
tools/list |
No |
prompts/list |
No |
resources/list |
No |
resources/templates/list |
No |
completion/complete |
No |
tools/call |
Yes ("complete") |
prompts/get |
Yes ("complete") |
resources/read |
Yes ("complete") |
The three methods that do include resultType are the three MRTR-capable types: CallToolResult, GetPromptResult, ReadResourceResult. This is consistent with resultType being set only from handleMultiRoundTripResult in mcp/mrtr.go.
Additional context
- As a possible reference point, the Python SDK appears to include
"resultType": "complete" at the model layer, where concrete Result subclasses declare result_type: ResultType = "complete" as a field default. That avoids relying on individual handlers or dispatch paths to add the field.
- In the Go SDK,
resultType appears to be set only via handleMultiRoundTripResult (mcp/mrtr.go), which is invoked for the methods that go through the MRTR middleware. Other result types in mcp/protocol.go do not appear to have a resultType field.
Describe the bug
When the Go SDK server handles requests declaring the 2026-07-28 protocol version, only three tested result types (
CallToolResult,GetPromptResult, andReadResourceResult) include theresultTypefield in their JSON responses. Other tested result types — includingDiscoverResult,ListToolsResult,ListPromptsResult,ListResourcesResult,ListResourceTemplatesResult, andCompleteResult— omitresultTypeentirely.The 2026-07-28 draft schema defines
resultTypeas a required field on the baseResulttype:The same
requiredconstraint appears on the result schemas I checked in the generatedschema.json, includingResult,CacheableResult,CallToolResult,CompleteResult,DiscoverResult,GetPromptResult,InputRequiredResult,ListPromptsResult,ListResourceTemplatesResult,ListResourcesResult,ListToolsResult,PaginatedResult,ReadResourceResult, andSubscriptionsListenResult.This appears to be a 2026-07-28 schema-compliance issue. The
resultTypefield appears to be set only for the multi-round-trip (MRTR) result path, while the schema requires it on result objects generally.Environment tested:
mainsnapshot from 2026-06-28:65ece5964304528e7568507e2b17351824ef73fcconformance/everything-serverTo Reproduce
Steps to reproduce the behavior:
server/discoverrequest with_meta.io.modelcontextprotocol/protocolVersion: "2026-07-28".resultType.tools/list,prompts/list,resources/list,completion/complete.resultType.tools/callrequest for a known tool."resultType": "complete".Example request:
{ "jsonrpc": "2.0", "id": 1001, "method": "tools/list", "params": { "_meta": { "io.modelcontextprotocol/protocolVersion": "2026-07-28", "io.modelcontextprotocol/clientInfo": {"name": "repro", "version": "0.1.0"}, "io.modelcontextprotocol/clientCapabilities": {} } } }Expected behavior
All result objects in 2026-07-28 responses should include
"resultType": "complete"(or"input_required"when applicable). The schemarequiredconstraint and the spec text "Servers implementing this protocol version MUST include this field" apply to every result type, not only the three MRTR-capable types.Observed behavior
Across both stdio and Streamable HTTP, the following pattern was observed:
resultTypepresent?server/discovertools/listprompts/listresources/listresources/templates/listcompletion/completetools/call"complete")prompts/get"complete")resources/read"complete")The three methods that do include
resultTypeare the three MRTR-capable types:CallToolResult,GetPromptResult,ReadResourceResult. This is consistent withresultTypebeing set only fromhandleMultiRoundTripResultinmcp/mrtr.go.Additional context
"resultType": "complete"at the model layer, where concreteResultsubclasses declareresult_type: ResultType = "complete"as a field default. That avoids relying on individual handlers or dispatch paths to add the field.resultTypeappears to be set only viahandleMultiRoundTripResult(mcp/mrtr.go), which is invoked for the methods that go through the MRTR middleware. Other result types inmcp/protocol.godo not appear to have aresultTypefield.