{
  "connector": "github",
  "label": "GitHub",
  "vendor_docs": "https://docs.github.com/rest",
  "summary": "A GitHub organization that answers REST v3, GraphQL v4, Git smart HTTP reads and webhooks, plus the GitHub MCP server's tools.",
  "surfaces": [
    {
      "kind": "REST",
      "path": "/",
      "notes": "REST API v3 (repos, contents, git data, issues, pulls, releases, search, Actions, checks)"
    },
    {
      "kind": "GraphQL",
      "path": "/graphql",
      "notes": "GraphQL API v4"
    },
    {
      "kind": "Git",
      "path": "/<owner>/<name>.git",
      "notes": "smart HTTP `clone` and `fetch`, read-only"
    },
    {
      "kind": "Webhooks",
      "path": "repository and organization hooks",
      "notes": "event deliveries to your endpoint"
    },
    {
      "kind": "MCP",
      "path": "/mcp",
      "notes": "Streamable HTTP, the `github-mcp-server` tool set"
    }
  ],
  "api_versions": [
    "REST API v3",
    "GraphQL API v4"
  ],
  "supported": [
    {
      "item": "Repositories, contents, trees, blobs, refs, commits and statuses"
    },
    {
      "item": "Issues, comments, labels, pull requests, reviews and merges"
    },
    {
      "item": "Releases, tags, gists, notifications, starring, event feeds, `/emojis` and `/meta`"
    },
    {
      "item": "GitHub's error envelopes (`{message, documentation_url, status}`) and `Retry-After` on throttled calls"
    },
    {
      "item": "PyGithub and Octokit REST calls, per the consumer coverage matrix"
    },
    {
      "item": "Security alerts, advisories and the Actions writes"
    }
  ],
  "unsupported": [
    {
      "item": "Pushing over Git; change content through the Contents and Git Data APIs"
    },
    {
      "item": "Classic REST projects, repository discussions over REST, and packages (GitHub's 404 envelope)"
    }
  ],
  "differences": [
    {
      "scenario": "GitHub Actions",
      "difference": "Workflows do not execute; runs, jobs, logs and artifacts are derived from commit history, and every fourth run fails.",
      "guidance": "Do not assert on what a workflow did; assert that your client reads runs, jobs and logs."
    },
    {
      "scenario": "Merging a pull request",
      "difference": "The merge flips state and mints a merge sha; there is no three-way merge or conflict detection, and `mergeable` is stored, not computed.",
      "guidance": "Do not test merge conflicts against the replica."
    },
    {
      "scenario": "Checks",
      "difference": "Checks are green unless the run is one of the seeded failures.",
      "guidance": "Do not expect checks to react to your commits."
    },
    {
      "scenario": "Search",
      "difference": "A qualifier parser over the stored data; relevance ordering, `best-match` scoring and code-search tokenization differ.",
      "guidance": "Assert that the expected item is found, not on rank."
    },
    {
      "scenario": "Branch protection",
      "difference": "The default branch reports a protection object, but nothing enforces it.",
      "guidance": "Do not assert that a push or merge to a protected branch is refused."
    },
    {
      "scenario": "Rate limits",
      "difference": "`/rate_limit` is static; real throttling only comes from fault injection.",
      "guidance": "Inject `throttle` or `quota_limit` to test backoff."
    }
  ],
  "faults_supported": [
    {
      "fault": "throttle",
      "behaviour": "403 \"API rate limit exceeded\" with `Retry-After` and `X-RateLimit-Remaining` `0`, GitHub's primary limit"
    },
    {
      "fault": "fail_next",
      "behaviour": "The next N calls fail as `throttle` does, then clear"
    },
    {
      "fault": "quota_limit",
      "behaviour": "429 with the secondary-rate-limit message and `Retry-After`"
    },
    {
      "fault": "error_rate",
      "behaviour": "500 \"Server Error\" for the given fraction of calls"
    },
    {
      "fault": "latency_ms",
      "behaviour": "Fixed added latency on every data-plane request"
    }
  ]
}
