A Model Context Protocol server for GitHub that provides tools to interact with GitHub repositories, issues, pull requests, users, organizations, and other GitHub features through MCP.
This GitHub MCP server has 6 tools, all read-only with basic descriptions and input schemas. The tool names follow verb_noun convention (get_, list_, enable_), which is good. However, descriptions are generic and lack the specificity needed for LLM decision-making. Parameter descriptions are minimal or missing. Schemas are present but simple. The server lacks pagination support, output schema documentation, and error handling guidance. Most critically, the dynamic toolset system (enable_toolset, list_available_toolsets, get_toolset_tools) creates a meta-layer that obscures actual tool capabilities, agents must first discover, then enable, then query tools before using them. This adds friction and makes reasoning harder. No evidence of structured output, field naming conventions for chaining, or recovery guidance.
Enable one of the sets of tools the GitHub MCP server provides, use get_toolset_tools and list_available_toolsets first to see what this will enable
Get details of the authenticated GitHub user. Use this when a request is about the user's own profile for GitHub. Or when information is missing to build other tool calls.
Get member usernames of a specific team in an organization. Limited to organizations accessible with current credentials
Get details of the teams the user is a member of. Limited to organizations accessible with current credentials
Lists all the capabilities that are enabled with the specified toolset, use this to get clarity on whether enabling a toolset would help you to complete a task
List all available toolsets this GitHub MCP server can offer, providing the enabled status of each. Use this when a task could be achieved with a GitHub tool and the currently available tools aren't enough. Call get_toolset_tools with these toolset names to discover specific tools you can call
No documented output schemas. Tool descriptions state what is returned (e.g., 'Get details of the authenticated GitHub user') but the response structure is not documented. LLMs cannot plan downstream tool calls or extract required fields (e.g., user_id for chaining) without seeing the schema.
Parameter descriptions are minimal or missing required detail. Example: 'user' param in get_teams has description 'Username to get teams for. If not provided, uses the authenticated user.', lacks clarity on format (email vs username vs display name), and does not explain when to use it vs get_me.
Dynamic toolset discovery adds unnecessary cognitive load. Agents must first list_available_toolsets, then enable_toolset, then get_toolset_tools before calling actual GitHub tools. This multi-step discovery should be flattened, expose all tools directly or document the discovery flow more clearly. No guidance on when to enable which toolset.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 57 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 35 | - | v1 |
Tool descriptions lack WHEN guidance. Example: 'Get details of the authenticated GitHub user. Use this when a request is about the user's own profile for GitHub. Or when information is missing to build other tool calls.', The second clause is vague. Under what conditions exactly should get_me be called vs get_teams? No clear decision tree.
No pagination support documented. Tools like get_teams and get_team_members may return large lists. No limit, offset, page, or cursor parameters visible. Lists that exceed context windows will degrade LLM reasoning and risk truncation.
No error handling guidance. Tools make external API calls to GitHub (implied by naming and context). No documentation of failure modes, recovery steps, or retryability. If get_teams fails due to permission denied or network timeout, the LLM has no guidance on what to do next.
enable_toolset description is unclear: 'Enable one of the sets of tools the GitHub MCP server provides, use get_toolset_tools and list_available_toolsets first to see what this will enable'. The imperative tone ('use X first') forces a specific ordering and makes the purpose opaque. What does 'enable' mean? Does it add tools to the capability list? Persist state? Require a follow-up call?
Risk classification present (READ_ONLY on all tools) but tool annotations (readOnlyHint, idempotentHint) not visible in schema. readOnlyHint should be present and true for all 6 tools to signal to clients that these are safe to call without side effects.