Skip to main content
Glama
technomad641

github-repo-mcp-server

by technomad641

github-repo-mcp-server

An MCP (Model Context Protocol) server that lets an AI assistant query GitHub on your behalf — your own repos, issues, PRs, and CI status, plus discovery of trending repos by topic across public GitHub.

See SPEC.md for the full design and development plan.

Why we built this

This started as a learning project to understand MCP by actually building one, not just reading about it - so the goal was a server that (a) does something genuinely useful day to day, and (b) touches all three MCP primitives (tools, resources, prompts) instead of just tools, which is where most "hello world" MCP examples stop.

GitHub was the right domain for that: it has a mature, well-documented, official REST API (no scraping, no unofficial endpoints, no partner approval needed to get started), it's something we already use constantly, and it naturally splits into two different trust boundaries worth modeling - your own repos (should be tightly scoped) vs. public GitHub data at large (fine to query more freely). That split became the project's actual design backbone: see Architecture below.

The specific tool set also traces back to a real question asked earlier in this project: "what's trending in machine learning right now?" Answering that honestly - GitHub's real Trending page has no API, and "trending in the US" isn't answerable at all since repos have no geography field - is what shaped search_trending_repos into an honest proxy instead of a fake exact match. That mix of "build the useful thing" and "be upfront about what's actually possible" carried through the rest of the tools too.

Related MCP server: AI Project Explorer

Architecture

flowchart LR
    subgraph Host["MCP Host (Claude Code / Claude Desktop / Cursor)"]
        AI["AI assistant"]
    end

    AI <-->|"JSON-RPC over stdio"| Server

    subgraph Server["github-repo-mcp-server"]
        direction TB
        Tools["Tools (13)\npersonal-scope + search_trending_repos"]
        Resources["Resources (3)\nrepo://.../readme, issues/{n}, pulls/{n}"]
        Prompts["Prompts (3)\nreview summary, weekly digest, trending"]
        Config["config.ts\nrepo allowlist"]
        Client["client.ts\nOctokit + throttling"]

        Tools --> Config
        Resources --> Config
        Tools --> Client
        Resources --> Client
        Prompts -.->|"instructs AI to call"| Tools
    end

    Client -->|"personal-scope calls\n(allowlist-gated)"| GH["GitHub REST API"]
    Tools -->|"search_trending_repos\n(not allowlist-gated)"| GH

    GH -->|"read-only, fine-grained PAT"| Repos[("Your repos\n+ public GitHub data")]

Two trust boundaries drive the whole design:

  • Personal scope — every tool that touches a specific repo (get_repo, list_issues, get_file_contents, etc.) is checked against config.json's allowlist before it's allowed to run. A token scoped to your repos plus code that enforces the allowlist means the server physically cannot read a repo you didn't list, even if the AI asked it to.

  • Global discoverysearch_trending_repos is deliberately exempt from the allowlist, since it searches public GitHub data at large rather than a specific repo. Same GitHub API, different trust model, so it's routed differently in code, not just documented differently.

Prompts sit a layer above both: they don't call GitHub directly, they return instructions telling the AI which tools to call and how to summarize the results - the same primitive as a saved prompt template a human would write, just server-hosted so every client that connects gets it for free.

Status

✅ All planned milestones complete.

  • M0 — Project scaffold: TypeScript + MCP SDK, minimal ping tool over stdio

  • M1 — GitHub client + config (Octokit auth, repo allowlist)

  • M2 — Tier 1 read-only personal-repo tools (12 tools)

  • M3 — search_trending_repos discovery tool

  • M4 — MCP resources (README, issue/PR content)

  • M5 — MCP prompts (reusable templates)

  • M6 — Tests, rate-limit hardening, docs

Tier 2 write tools (create issue, comment, etc.) were scoped out of v1 intentionally — see SPEC.md §11. This is a read-only server.

Requirements

  • Node.js 18+ (developed against Node 20; see .nvmrc)

Configuration

  1. Copy .env.example to .env and set GITHUB_TOKEN to a fine-grained personal access token with read-only Contents, Issues, Pull requests, and Actions permissions, scoped to the repos you want this server to access.

  2. List those repos (as "owner/repo" strings) in config.json — this is the allowlist personal-scope tools are restricted to. search_trending_repos is exempt, since it queries public GitHub data rather than a specific repo.

  3. get_notifications additionally needs the token's Notifications account permission (separate section from repository permissions on the token creation page) — every other tool works without it.

Tools

Personal scope (allowlist-gated): get_repo, list_repos, list_branches, list_commits, get_file_contents, list_issues, get_issue, list_pull_requests, get_pull_request, search_code, get_workflow_runs, get_notifications.

Global discovery (not allowlist-gated, searches public GitHub data): search_trending_repos — finds trending repos for a topic, ranked by star velocity among recently-created repos. A documented proxy for github.com/trending, which has no official API.

Resources

URI template

Content

repo://{owner}/{repo}/readme

The repo's README, as markdown

repo://{owner}/{repo}/issues/{number}

Issue title, body, and comments

repo://{owner}/{repo}/pulls/{number}

PR title, description, diff stats

Prompts

Name

What it does

summarize_prs_for_review

Finds open PRs and summarizes which need attention

weekly_repo_digest

Commits, issues, PRs, and CI status from the last week

whats_trending

Trending public repos for a GitHub topic

Getting started

npm install
npm run dev     # run the server directly via tsx
npm run build   # compile to dist/
npm start       # run the compiled server

The server communicates over stdio, following the MCP protocol — it's meant to be launched by an MCP-compatible host (e.g. Claude Code, Claude Desktop, Cursor), not run standalone in a terminal.

Manual testing with MCP Inspector

MCP Inspector is the official visual testing tool for MCP servers — it gives you a web UI to browse every tool/resource/prompt and call them interactively, instead of hand-typing JSON-RPC.

npm run build   # inspector launches the compiled server, so build first
npx @modelcontextprotocol/inspector@latest node --env-file=.env dist/index.js

This prints a local URL with an auth token pre-filled, e.g.:

MCP Inspector Web is up and running at:
   http://localhost:6274?MCP_INSPECTOR_API_TOKEN=<token>

Open that URL (it also tries to open your browser automatically). From there you can call any tool with real arguments - e.g. get_repo with owner: <your-username>, repo: <a-repo-in-your-allowlist>, or search_trending_repos with topic: machine-learning - and see the live result. The token in the URL authenticates your session; treat it like a credential and don't share the link.

Note: Inspector v2 lists Node 22+ as its required engine. It still runs fine on Node 20 (just an EBADENGINE warning, not a hard failure) - if you hit a real compatibility issue, npm i -g n && n 22 (or your Node version manager's equivalent) resolves it.

Testing

npm test        # typecheck (src + test) then run the full vitest suite
npm run typecheck

The suite (32 tests) runs through the real MCP protocol layer — an McpServer and Client connected over an in-memory transport — with @octokit/rest mocked, so it exercises actual schema validation and request routing without making live API calls. Every tool, resource, and prompt was also manually verified against a real repo during development; see individual commit messages for what was and wasn't exercised against real data.

What we learned

About MCP as a protocol:

  • It's JSON-RPC 2.0 underneath, nothing exotic - once you've seen the initialize handshake and one tools/call round trip, you've seen the shape of the whole protocol. Everything else is more of the same three message types (tools, resources, prompts) repeated.

  • Tools, resources, and prompts are genuinely different primitives, not three names for the same thing. Tools are actions the AI decides to invoke; resources are addressable content the AI (or a human) can read directly without a tool call; prompts are server-authored instructions that tell the AI which tools to call and how - a reusable playbook, not a data fetch. Building all three (not just tools, which is where most examples stop) is what made the distinction click.

  • A server is trust-boundary-agnostic by default - it'll do whatever the code allows. The allowlist pattern here (config.ts gating every personal-scope tool) exists because MCP itself provides no scoping; the server author has to build it.

About testing against real data instead of assuming code is correct: Every tool, resource, and prompt was smoke-tested against a live repo during development, which surfaced real issues a "does it compile" check would have missed entirely:

  • GitHub's code search doesn't index unstarred forks. search_code returned 0 results with incomplete_results: true against a fresh fork - confirmed via a raw curl call that this is GitHub's own indexing limitation, not a bug (forks are only code-search-indexed once they have more stars than their parent repo).

  • get_notifications needs a separate token permission. It uses a GitHub account-level permission (Notifications), not a repository permission like every other tool - discovered via a live 403, now surfaced as a specific error message instead of the generic one.

  • Composed Octokit plugin types aren't portable. Wrapping the client with @octokit/plugin-throttling broke .d.ts emission (TS2883). Fixed by dropping declaration: true from tsconfig.json, since this is a runnable server, not a library other packages import.

  • A separate test tsconfig was needed. The main tsconfig.json excludes test/ from compilation, so tsc --noEmit silently never type-checked the test files - vitest's esbuild transform strips types without checking them. tsconfig.test.json plus wiring npm test to typecheck first caught real unsafe-property-access bugs in the tests that were otherwise invisible.

License

MIT

Available Tools

14 tools
get_file_contentsB

Read a file's contents from a repo at a given ref.

ParametersJSON Schema
NameRequiredDescriptionDefault
refNoBranch, tag, or commit sha; defaults to the default branch
pathYesFile path within the repo, e.g. src/index.ts
repoYesRepository name
ownerYesRepository owner (user or org)

TDQS

B3.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

There are no annotations, so the description carries the full burden of behavioral disclosure. It states it reads contents but does not mention return format (e.g., base64 encoding), size limits, error behavior, or any side effects. This is minimal.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that is concise and front-loaded, stating the core action and scope without extraneous details. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and no annotations, the description should explain return values or behavior but does not. It is too terse for a tool that likely returns file content and metadata, leaving the agent without full context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds no additional meaning beyond what the schema already provides for each parameter, but it does not need to since the schema is complete.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool reads a file's contents from a repo at a given ref, which is a specific verb+resource that distinguishes it from siblings like get_issue, get_repo, and search_code. It is unambiguous and immediately understandable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives such as search_code or list_commits. The description simply states the action without context on prerequisites, exclusions, or comparison to sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_issueA

Get full detail for one issue, including its comment thread.

ParametersJSON Schema
NameRequiredDescriptionDefault
repoYesRepository name
ownerYesRepository owner (user or org)
issue_numberYes

TDQS

A3.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must carry the burden of behavioral disclosure. It does not mention that the operation is read-only, requires any specific permissions, or has no side effects. It only describes the return content (full detail, comment thread), which does not cover safety or authorization aspects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence of 13 words. It avoids redundancy and directly conveys the tool's purpose without filler, scoring high on conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read tool with three obvious parameters, the description provides the essential purpose and mentions the comment thread as a key return component. However, with no output schema and no annotations, it does not detail the full return structure or any error/rate-limit behavior, leaving some gaps in completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema describes owner and repo (67% coverage), but the description adds no additional meaning for any parameter. The missing issue_number description is somewhat inferable from the name, and the tool description's 'one issue' hints at its role, but there is no explicit compensation for the coverage gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Get' and resource 'one issue', specifying that it retrieves full detail including the comment thread. This distinguishes it from sibling tools like list_issues (which lists issues) and get_pull_request (which gets a pull request).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'for one issue' implies this is for retrieving a single issue rather than listing multiple, but it does not explicitly mention alternatives like list_issues or exclusions for when not to use it. Usage context is present but only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_notificationsA

Get your unread GitHub notifications (mentions, review requests), filtered to repos in this server's allowlist. Requires the token's Notifications account permission - not required by other tools.

ParametersJSON Schema
NameRequiredDescriptionDefault
allNoInclude read notifications too

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It discloses the filtering to allowlisted repos, the unread-only default, and the specific permission requirement, which are valuable behavioral facts. It does not mention edge cases like missing permissions or response format, but for a simple read tool, this is reasonably transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with no redundant words. It efficiently covers purpose, scope, and a key prerequisite, earning a top score.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (one optional param, no output schema), the description provides sufficient context: what it does, what it operates on, and an important permission note. It is complete for its complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The sole parameter 'all' is fully described in the schema (boolean, default false, 'Include read notifications too'), so schema coverage is 100%. The description does not add extra meaning beyond noting the unread default, which the schema already implies. Baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves unread GitHub notifications, specifying types (mentions, review requests) and scope (repos in server's allowlist). It is distinct from sibling tools that focus on issues, PRs, code search, etc., leaving no ambiguity about its purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly calls out a required permission ('Notifications account permission') that is unique to this tool among siblings, implying when it should be used. It does not explicitly list alternative tools for other notification-related tasks, but the context strongly differentiates it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_pull_requestA

Get detail for one PR: diff stats, mergeable state, and review status.

ParametersJSON Schema
NameRequiredDescriptionDefault
repoYesRepository name
ownerYesRepository owner (user or org)
pull_numberYes

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden. It discloses the specific return content (diff stats, mergeable state, review status) and implies read-only behavior via 'Get', but does not mention authentication needs, rate limits, or error conditions. Some behavioral context is provided, but it is not comprehensive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence of 14 words, front-loaded with the action and resource. No filler or redundant information; every word adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description lists the key return fields (diff stats, mergeable state, review status), providing useful output expectations. For a simple 3-param getter, this is reasonably complete, though it omits edge-case behavior like error handling or authentication details.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema descriptions cover 67% of parameters (owner and repo), while pull_number lacks a description. The tool description adds no additional parameter semantics, leaving pull_number to be inferred from 'one PR'. It does not compensate for the missing coverage, but the missing parameter is straightforward.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb 'Get detail' and resource 'one PR', and enumerates exactly what is returned: diff stats, mergeable state, and review status. This clearly distinguishes it from sibling tools like list_pull_requests and get_issue.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies use for retrieving a single PR's details, but does not explicitly state when to use it versus list_pull_requests or other siblings. No exclusions or alternative recommendations are provided, leaving usage guidance implicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_repoB

Get metadata for a repo: description, stars, language, default branch, visibility.

ParametersJSON Schema
NameRequiredDescriptionDefault
repoYesRepository name
ownerYesRepository owner (user or org)

TDQS

B3.3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. It only states 'Get metadata,' implying a safe read operation, but does not mention authentication requirements, rate limits, error behavior for missing repos, or any side effects. This is minimal for a tool with zero annotation coverage.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence that wastes no words. It includes the primary verb, the resource, and a list of returned metadata fields, making it highly scannable and efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter read tool, the description is adequate but minimal. It lists return fields, which helps agents understand output, but with no annotations or output schema, additional context like authentication or error handling would improve completeness. The description does not explicitly differentiate from list_repos, though the singular scope is implied.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% for both parameters (owner and repo), each with descriptive text. The description adds nothing about parameter format, relationships, or edge cases, but because the schema fully documents the parameters, a baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: 'Get metadata for a repo' and lists specific metadata fields (description, stars, language, default branch, visibility). This distinguishes it from sibling tools like list_repos (which lists multiple repos) or get_issue (which fetches issue-specific data), showing a specific verb, resource, and scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool relative to alternatives. It does not mention list_repos for multiple repos, search_code for content search, or any other exclusions. The usage is implied from the name and description but not explicitly stated, so agents receive minimal selection guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_workflow_runsA

Get recent GitHub Actions workflow run status (pass/fail) for a repo.

ParametersJSON Schema
NameRequiredDescriptionDefault
repoYesRepository name
limitNo
ownerYesRepository owner (user or org)
branchNoFilter to runs on this branch

TDQS

A3.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It only mentions 'recent' and 'pass/fail' but does not disclose behavior like default limit, pagination, whether in-progress runs are included, or how branches affect results. This leaves significant ambiguity for an agent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, direct sentence with no filler. It is front-loaded with the action and resource, making it easily scannable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

As a simple getter with no output schema, the description should clarify what is returned. It mentions 'status (pass/fail)' but does not describe the response shape (e.g., list of runs, metadata) or how parameters like limit and branch affect results. It is adequate but could provide more context for an agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 75%, with owner, repo, and branch described. The description adds no new parameter details beyond the schema, and the 'limit' parameter is left unexplained. However, the schema provides defaults and constraints, so the gap is not severe.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves recent GitHub Actions workflow run status (pass/fail) for a repo. It uses a specific verb ('Get') and resource ('workflow run status'), distinguishing it from sibling tools like get_issue or get_file_contents.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for checking CI status but provides no explicit guidance on when to use this tool versus alternatives, nor any exclusions. It does not mention prerequisites or typical scenarios, though the purpose is self-evident from the name and description.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_branchesB

List branches in a repo.

ParametersJSON Schema
NameRequiredDescriptionDefault
repoYesRepository name
limitNoMax branches to return
ownerYesRepository owner (user or org)

TDQS

B3.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden for behavioral disclosure. It only states the basic action without addressing pagination, default limits (despite the limit parameter), return format, or any side effects. It doesn't betray hidden behavior but also reveals nothing beyond the obvious.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence with no wasted words. It conveys the core purpose immediately and is appropriately sized for a simple list operation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has no output schema and no annotations, so the description must provide sufficient context for invocation. It lacks information about the return shape, pagination behavior, or default settings. For an agent, this is insufficient to know what to expect from the call.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already describes all three parameters with 100% coverage, so the baseline is 3. The description does not add additional meaning to the parameters beyond what the schema provides (e.g., it doesn't elaborate on the limit parameter or the required owner/repo combinations).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the operation ('List branches') and the scope ('in a repo') using a specific verb and resource. It distinguishes itself from sibling tools like list_commits or list_pull_requests by naming the specific resource (branches).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. It doesn't mention any exclusions or conditions, such as when to prefer this over list_commits or list_repos. The usage context is trivial but not explicitly communicated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_commitsA

List recent commits on a branch.

ParametersJSON Schema
NameRequiredDescriptionDefault
repoYesRepository name
limitNoMax commits to return
ownerYesRepository owner (user or org)
branchNoBranch name; defaults to the repo's default branch

TDQS

A3.6/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of behavioral disclosure. It only states a basic action without revealing details like default branch behavior, limit application, sorting order, or whether the response includes commit metadata only. The term 'recent' is vague and unqualified.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, concise sentence with no redundant information. It is short and to the point, earning a high score for efficiency.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having 4 parameters and no output schema, the description is minimal. It fails to explain what a commit listing contains or how 'recent' is defined. The agent might not know if commits from all branches or the default branch are included, or if the response includes diffs. The description is too sparse to fully support correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds slight emphasis on 'branch' as the scope, but it does not provide additional meaning for parameters like limit or owner/repo beyond what the schema already explains.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description 'List recent commits on a branch' uses a specific verb (List), a clear resource (commits), and a scope (branch). It clearly distinguishes from sibling tools like list_pull_requests and list_issues, which target different resource types.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides a clear context for use: listing commits on a branch. It does not explicitly state when not to use it or mention alternatives, but the meaning is evident. This places it above implied usage but below explicit exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_issuesA

List issues in a repo, filterable by state, label, and assignee.

ParametersJSON Schema
NameRequiredDescriptionDefault
repoYesRepository name
limitNo
ownerYesRepository owner (user or org)
stateNoopen
labelsNoComma-separated label names to filter by
assigneeNoGitHub username to filter by assignee

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must carry the burden. It calls out read-only behavior with 'List' and mentions filters, but it does not disclose pagination, default limit, or response format. This is adequate but minimal.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence with a clear verb-object structure, front-loaded with the tool's purpose. No redundant or unnecessary information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is sufficiently complete for a low-complexity read-only list tool. The schema documents parameters and required fields, and although the return format and pagination are not mentioned, these are minor gaps for this operation type.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 67%. The description adds semantic grouping by naming state, label, and assignee as filters, but it does not clarify the 'limit' parameter or required owner/repo beyond what the schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description begins with a specific verb+resource ('List issues in a repo') and names the key filters (state, label, assignee), clearly distinguishing it from sibling tools like get_issue (single issue) and list_pull_requests (pull requests).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for listing issues in a repo but does not explicitly state when to prefer this tool over alternatives or mention exclusions. No direct 'when to use' or 'when not to use' guidance is provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_pull_requestsB

List pull requests in a repo, filterable by state and branch.

ParametersJSON Schema
NameRequiredDescriptionDefault
baseNoFilter by base branch, e.g. main
headNoFilter by head branch, e.g. owner:branch
repoYesRepository name
limitNo
ownerYesRepository owner (user or org)
stateNoopen

TDQS

B3.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must disclose behavioral traits. It only mentions filterability by state and branch, which is already visible in the schema, and omits details like pagination, ordering, default behavior, or return format. This adds no behavioral transparency beyond the structured fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, concise sentence with no redundant information. It front-loads the core purpose and filtering capability in a clear, efficient manner.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema and no annotations, the description is insufficiently complete. It fails to mention what the response contains, whether results are paginated, or how the limit parameter affects the output. For a list operation with several parameters, this leaves important gaps for an agent to know what to expect.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is high (most parameters have descriptions), so the baseline is 3. The description's mention of state and branch filtering adds little semantic value beyond what the schema already documents. It does not clarify the 'limit' parameter or the distinction between base and head branches beyond their schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'List pull requests in a repo' with a specific verb and resource, and explicitly mentions filtering by state and branch. This distinguishes it from sibling tools like list_issues and get_pull_request, which target different resources or operations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies use when listing pull requests, but it does not explicitly state when to choose this over alternatives or exclude other tools. No comparison with get_pull_request or list_issues is given, so the guidance is only implicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_reposA

List every repo in this server's allowlist, with basic metadata for each.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It discloses scope ('every repo') and content ('basic metadata') but does not mention pagination, output format, or authentication requirements. For a read-only list operation, this is adequate but not rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence that immediately states the action and scope. No unnecessary words or repetition, making it highly efficient and well-structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (0 params, no output schema), the description is fairly complete. It specifies the purpose and scope, and 'basic metadata' sets expectations. However, it could be more explicit about what metadata fields are included or the exact return shape.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has zero parameters, so the baseline is 4. The description adds no parameter info (none needed), but 'basic metadata' gives an indication of the output content, which is slightly beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'list', the resource 'repo', and the scope 'every repo in this server's allowlist'. It distinguishes from siblings like get_repo (single repo) by emphasizing 'every repo' and 'allowlist'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The usage context is implied (when you need an overview of all approved repos) but no explicit alternatives are mentioned. It doesn't say when not to use this tool (e.g., when needing details for a specific repo, use get_repo).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

pingA

Health check — returns pong plus the current server time.

ParametersJSON Schema
NameRequiredDescriptionDefault
messageNoOptional echo message

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must disclose behavior itself. It states the primary behavior (returns pong and server time) but omits any mention of the optional message parameter echo behavior. The description does not contradict annotations, and for a simple read-only operation, the core behavior is transparent, though not exhaustive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence, front-loaded with the key term 'Health check', and contains zero filler. It effectively communicates the tool's purpose without redundancy, scoring high on conciseness and structure.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple, but the description leaves out the echo behavior of the optional message parameter, which is relevant to the response. Although the schema covers the parameter, there is no output schema, so the description should have been slightly more detailed about the full return value. Minor gap, hence a 3.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% for the single parameter 'message', which is described as 'Optional echo message'. The tool description adds no additional parameter meaning, so the baseline score of 3 applies. The schema fully handles parameter semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the tool as a health check that returns pong and the current server time. This is specific and unambiguous, distinguishing it from all sibling tools which are data retrieval or repository operations. The verb 'returns' and the resource 'server' make the purpose immediately obvious.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'Health check' label implies the tool is used to verify server connectivity, but no explicit when-to-use or when-not-to-use guidance is given. Since there is no alternative health-check tool among the siblings, the usage context is clear but only by implication.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_codeA

Search code within a single allowlisted repo. Note: GitHub's code search only indexes forks that have more stars than their parent repo, and can lag for low-activity repos - a 0-result response may mean 'not indexed yet' rather than 'no matches'.

ParametersJSON Schema
NameRequiredDescriptionDefault
repoYesRepository name
limitNo
ownerYesRepository owner (user or org)
queryYesSearch terms, e.g. "TODO" or "function foo"

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral disclosure burden. It provides a valuable caveat about GitHub code search indexing lag, explaining that a 0-result response may mean 'not indexed yet' rather than 'no matches'. This adds meaningful context beyond the schema, though it does not cover auth or rate limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is exactly two sentences: the first immediately states the purpose, the second provides the essential indexing caveat. There is no unnecessary verbosity or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description should ideally explain what the tool returns (e.g., matching file paths, code snippets). It does not describe the response format. While the indexing caveat is useful, the missing return format leaves a gap for the agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 75%, with owner, repo, and query described. The description does not add any parameter-specific meaning beyond the schema, and the 'limit' parameter has no description but has default/min/max constraints. The indexing caveat is not directly tied to parameter semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Search code within a single allowlisted repo', giving a specific verb, resource, and scope. It distinguishes itself from sibling 'search_trending_repos' by specifying code search rather than repo search.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for code search in a specific repo but does not explicitly mention when to use this tool versus alternatives or when not to use it. The 'single allowlisted repo' restriction is a context clue, but no alternative tool is named.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 14 tool updatesv0.1.0
    • First observedget_file_contents
    • First observedget_issue
    • First observedget_notifications
    • First observedget_pull_request
    • First observedget_repo
    • First observedget_workflow_runs
    • First observedlist_branches
    • First observedlist_commits
    • First observedlist_issues
    • First observedlist_pull_requests
    • First observedlist_repos
    • First observedping
    • First observedsearch_code
    • First observedsearch_trending_repos

TDQS

A3.8/5.0
Disambiguation5/5

Each tool has a clearly distinct purpose. Getter vs. list tools are separated by singular/plural semantics, and the two search tools differ by target (code within a repo vs. trending repos across GitHub). No two tools overlap in function.

Naming Consistency5/5

All tool names use lowercase with underscores and follow a consistent verb_noun pattern (get_, list_, search_, ping). The pattern is predictable and easy to infer from the resource being accessed.

Tool Count5/5

14 tools is well within the ideal range for a GitHub-focused server. Each tool covers a distinct resource or operation, and the count feels appropriate for the scope—not bloated, not too sparse.

Completeness3/5

The read-side surface is solid: repos, issues, PRs, branches, commits, files, workflows, notifications, and trending. However, there are no create/update/delete operations for any resource, which is a significant gap if the server is expected to support full issue/PR lifecycle management. Agents can work around this only if their tasks are read-only.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/technomad641/github-repo-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server