GitHub MCP Server 2.0.0 hides output schemas from older clients

GitHub MCP Server 2.0.0 advertises outputSchema and structuredContent only to supported MCP 2026-07-28 clients; older clients keep text.

Update (2026-10-07): Fact-checked protocol negotiation, wire behavior, and the v2.0.1 module-path fix against primary sources and a v2.0.1 stdio run.

GitHub MCP Server 2.0.0 advertises outputSchema and returns structuredContent only when the client uses an SDK-supported MCP version from 2026-07-28 onward. Older clients and clients that omit or send an unknown version keep the legacy text shape when the request reaches the server; an unsupported version can instead be rejected during MCP initialization. This split protects the compound tools' revised schemas from older consumers.

Key facts

  • GitHub published github-mcp-server v2.0.0 on 2026-10-06T23:34:00Z to support programmatic tool calling and code mode.
  • The server only returns outputSchema in tools/list and structuredContent in tools/call for clients negotiating a supported MCP protocol version from 2026-07-28 onward.
  • Clients using protocol version 2025-11-25, older versions, or omitting protocol headers receive byte-for-byte legacy plain text with outputSchema stripped.
  • The server's era selector does not treat an unknown date as modern merely because it sorts after 2026-07-28; the SDK can reject that version during initialization before tools/list runs.
  • Modern structured repository and gist DTOs strip internal API and hypermedia routing URLs while preserving browser links and file metadata; typed issue outputs use the same protocol boundary.
  • GitHub published bugfix release v2.0.1 on 2026-10-07T08:13:24Z to fix the Go module import path to github.com/github/github-mcp-server/v2.

Why does GitHub MCP Server 2.0.0 suppress output schemas for older clients?

GitHub's release notes say that more agents support Code Mode or Programmatic Tool Calling, so v2.0.0 added structured outputs and output schemas. The same notes say compound tools needed changes to allowed output schemas that are not valid for older clients. GitHub therefore keeps those fields away from older sessions.

In the GitHub MCP Server 2.0.0 release notes, the maintainers state:

"These schemas are only advertised to clients advertising MCP 2026-07-28 spec support (or later)."

For the transport implications of the 2026-07-28 protocol date, see Why a remote MCP server answers 405 after the 2026-07-28 revision. The naming overlap with other agent protocols is covered in MCP, A2A, and the two protocols called ACP, explained.

How does GitHub MCP Server 2.0.0 negotiate the protocol era?

The server implements two distinct tool models internally: a modern registration that contains an OutputSchema and emits structuredContent, and a legacy clone where OutputSchema is set to nil.

In pkg/inventory/typed_schema.go, the server resolves the client's protocol era using protocolEraForSupportedVersion:

func protocolEraForSupportedVersion(version string, supported []string) ProtocolEra {
	if _, err := time.Parse(time.DateOnly, version); err != nil {
		return ProtocolEraLegacy
	}
	if version < ProtocolVersionMultiRoundTrip || !slices.Contains(supported, version) {
		return ProtocolEraLegacy
	}
	return ProtocolEraModern
}

This logic enforces two strict constraints before enabling modern behavior:

  1. Chronological threshold: The version must parse as an ISO date string and sort on or after ProtocolVersionMultiRoundTrip (2026-07-28).
  2. Explicit SDK support: The version string must exist in mcp.SupportedProtocolVersions().

If an experimental client advertises a future protocol date such as 2027-01-01 that is not recognized by the underlying Go SDK, the check !slices.Contains(supported, version) evaluates to true in this selector. The selector returns ProtocolEraLegacy instead of assuming forward compatibility. In an end-to-end stdio handshake, however, the v2.0.1 Go SDK rejected 2027-01-01 before tools/list, so the observable result was an initialization error rather than a legacy payload.

During a tools/list JSON-RPC call, typedOutputMiddleware in pkg/inventory/typed_output.go intercepts the tool array. When selectedEra is ProtocolEraModern, it sends registration.modernTool. When the era is legacy or unversioned, it swaps each entry for registration.legacyTool, completely omitting the outputSchema property from the JSON response.

Similarly, during a tools/call invocation on a legacy session, the middleware strips the structuredContent field from the result and formats the output into legacy text content.

How do GitHub MCP Server tool outputs change between legacy and modern clients?

When an agent negotiates protocol version 2026-07-28, tools return structured JSON representations. For example, get_file_contents returns a typed oneOf schema covering directory arrays, text blocks, or base64 blobs with download URLs, but omits raw hypermedia routing URLs. The list_issues tool provides typed fields for issues, totalCount, and pageInfo.

In a v2.0.1 stdio run, querying tools/list confirmed the schema gate across supported and missing protocol versions. The call-side column below follows the v2.0.0 README and the v2.0.1 middleware source, not that particular harness:

Client Protocol Parameter

Negotiated Era

outputSchema Advertised

tools/call Payload Format

2026-07-28

Modern

Yes (object / oneOf)

Typed structuredContent + JSON text

2025-11-25

Legacy

No (field omitted)

Legacy plain text (structuredContent stripped)

2024-11-05

Legacy

No (field omitted)

Legacy plain text (structuredContent stripped)

Missing / omitted

Legacy

No (field omitted)

Legacy plain text (structuredContent stripped)

2027-01-01 (unsupported)

Initialization rejected

No tools/list response

JSON-RPC unsupported protocol version

The captured modern list_issues schema is a JSON Schema object with an issues array and totalCount and pageInfo properties. The compatibility signal is the presence of the outputSchema member: on 2025-11-25, the captured list_issues dictionary omitted that member. The full schema and run output are in artifacts/logs/22-modern-tools-output-schema.txt and artifacts/logs/21-protocol-negotiation-results-v3.txt.

Why did GitHub MCP Server release 2.0.1 on 2026-10-07?

GitHub published v2.0.0 at 2026-10-06T23:34:00Z and v2.0.1 at 2026-10-07T08:13:24Z.

While v2.0.0 bumped the application version to 2.0.0, its go.mod file initially retained the unversioned module path:

-module github.com/github/github-mcp-server
+module github.com/github/github-mcp-server/v2

The v2.0.1 release notes call this a fix to "Publish proper module path for Go library users." Commit 55edd58d5e1127fe7ea3c036bc14dca66f7e41c4 changed the module declaration, build references, and internal imports to the /v2 path. The commit's README addition says the v2.0.0 tag predates the correction and cannot be used as a Go module.

Sources

Last verified: 2026-10-07.

Spotted an outdated or wrong claim? Agents can report it with evidence throughPOST /api/feedback; an editor checks every report. See llms.txt for the agent API.