Skip to content

Reference implementation showcase: GitHub MCP Server card + AI/MCP catalog (live wire formats & routes) #34

Description

@SamMorrowDrums

Reference implementation showcase — GitHub MCP Server

A working reference implementation of SEP-2127 (Server Card) + AI Catalog discovery for the GitHub MCP Server is now wired end-to-end across three documents. This issue captures the live wire formats and routes so the WG can sanity-check the shape against the spec. Values below were captured from a running build with dev hostnames substituted for production (github.com, api.githubcopilot.com); icon data: URIs are elided for readability.

Discovery flow

flowchart LR
  C[Client] -->|GET /.well-known/ai-catalog.json| A[github.com]
  A -->|entry.url| SC[api.githubcopilot.com/mcp/server-card]
  C -->|GET server-card| SC
  SC -->|remotes0.url| M[api.githubcopilot.com/mcp/]
  C -->|connect streamable-http| M
Loading

Routes

Document Route Served by Media type
AI Catalog GET https://github.com/.well-known/ai-catalog.json github.com application/ai-catalog+json
MCP Catalog (transitional) GET https://github.com/.well-known/mcp/catalog.json github.com application/json
Server Card GET https://api.githubcopilot.com/mcp/server-card hosted GitHub MCP Server application/mcp-server-card+json

Per-environment hosts (same shapes, host varies):

Env Catalog host Card host
github.com (dotcom) github.com api.githubcopilot.com
Proxima / data-residency {tenant}.ghe.com copilot-api.{tenant}.ghe.com
GHES not served not served

The card host is derived per-request (e.g. from X-Forwarded-Host) so a single implementation serves every tenant; GHES is deliberately excluded.

Shared HTTP behavior (all three endpoints)


1. Server Card — application/mcp-server-card+json

GET https://api.githubcopilot.com/mcp/server-card

{
  "$schema": "https://static.modelcontextprotocol.io/schemas/v1/server-card.schema.json",
  "name": "io.github.github/github-mcp-server",
  "version": "1.4.0",
  "description": "Connect AI assistants to GitHub - manage repos, issues, PRs, and workflows through natural language.",
  "title": "GitHub",
  "websiteUrl": "https://github.com/github/github-mcp-server",
  "repository": {
    "url": "https://github.com/github/github-mcp-server",
    "source": "github",
    "id": "942771284"
  },
  "icons": [
    { "src": "data:image/png;base64,iVBORw0KGgoAAAANSUh…(GitHub mark, light)", "mimeType": "image/png", "sizes": ["24x24"], "theme": "light" },
    { "src": "data:image/png;base64,iVBORw0KGgoAAAANSUh…(GitHub mark, dark)",  "mimeType": "image/png", "sizes": ["24x24"], "theme": "dark" }
  ],
  "remotes": [
    {
      "type": "streamable-http",
      "url": "https://api.githubcopilot.com/mcp/",
      "headers": [
        {
          "description": "Authorization header with authentication token (PAT or App token)",
          "isRequired": true,
          "isSecret": true,
          "name": "Authorization"
        }
      ],
      "supportedProtocolVersions": ["2025-11-25", "2025-06-18", "2025-03-26", "2024-11-05"]
    }
  ]
}

Notes:

  • Remote-only: no packages, no enumerated primitives (tools/resources/prompts) — those stay in the MCP Registry server.json and runtime listing, per the card/remote-only shape.
  • name, title, description, repository are kept identical to the Registry document so the card and registry entry describe the same server.
  • version mirrors the runtime serverInfo.version.
  • Icons are embedded as self-contained data: URIs (no external image dependency) and emitted in a fixed order so the body — and therefore the ETag — is deterministic.
  • For Proxima the single remote url becomes https://copilot-api.{tenant}.ghe.com/mcp/.

2. AI Catalog — application/ai-catalog+json (spec_version 1.0)

GET https://github.com/.well-known/ai-catalog.json

{
  "spec_version": "1.0",
  "entries": [
    {
      "identifier": "urn:air:github.github.io:github-mcp-server",
      "display_name": "GitHub MCP Server",
      "media_type": "application/mcp-server-card+json",
      "url": "https://api.githubcopilot.com/mcp/server-card",
      "description": "Connect AI assistants to GitHub - manage repos, issues, PRs, and workflows through natural language."
    }
  ]
}
  • identifier is the AIR URN derived deterministically from the canonical card name io.github.github/github-mcp-server → reverse namespace io.github.githubgithub.github.iourn:air:github.github.io:github-mcp-server.
  • url equals the Server Card URL above (the integration contract), and media_type advertises what the client will receive there.

3. MCP Catalog (transitional subset) — application/json (specVersion draft)

GET https://github.com/.well-known/mcp/catalog.json

{
  "specVersion": "draft",
  "entries": [
    {
      "identifier": "urn:air:github.github.io:github-mcp-server",
      "displayName": "GitHub MCP Server",
      "mediaType": "application/mcp-server-card+json",
      "url": "https://api.githubcopilot.com/mcp/server-card",
      "description": "Connect AI assistants to GitHub - manage repos, issues, PRs, and workflows through natural language."
    }
  ]
}
  • This is a structural subset of the AI Catalog entry (camelCase, displayName instead of display_name), served alongside the forward ai-catalog.json for present-day clients. The forward application/ai-catalog+json document is the primary; the MCP Catalog is transitional — relevant to the direction in Remove the MCP Catalog #26.

Relation to open WG threads

Happy to expose a live endpoint or share the full (un-elided) bodies if useful for conformance testing.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions