mcp-github-db-server
Provides structured tools for interacting with GitHub repositories, including listing repositories, reading files, listing directory contents, searching code, listing issues, creating issues, and listing pull requests.
Provides tools for interacting with a local SQLite database, including listing tables, describing table schemas, running read-only queries, executing write statements or DDL, and upserting project records.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mcp-github-db-serverlist open issues on my repo and save a summary to the database"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
mcp-github-db-server
An MCP (Model Context Protocol) server that gives AI agents — Claude Code, Claude Desktop, or any other MCP client — structured, tool-based access to GitHub repositories and a local SQLite database, plus a set of custom Claude Code skills built on top of it.
Instead of an agent shelling out to git/curl or hallucinating repo
structure, it gets a small, well-typed toolset: browse a repo's file tree,
read files, search code, list/create issues and PRs, and query or update a
local database — all with Zod-validated inputs and JSON-safe outputs.
Why this exists
Agents are most useful when they have narrow, auditable tools instead of raw shell access. This project is a small, readable reference for that pattern:
One MCP server, two backends. GitHub (via Octokit) and SQLite (via
better-sqlite3) are exposed through the same tool-calling interface, so an agent can cross-reference "what's in this repo" with "what have I already recorded about it" in one conversation.Claude Code skills on top. Three skills (
github-explorer,db-assistant,repo-health-check) show how to turn a raw toolset into guided workflows — when to call which tool, how to summarize results, and where to stop and ask before taking a write action.
Related MCP server: repogate
Architecture
┌─────────────────────────┐
Claude Code / │ MCP Client (stdio) │
Claude Desktop ├─────────────────────────┤
│ Claude Code Skills │
│ • github-explorer │
│ • db-assistant │
│ • repo-health-check │
└───────────┬─────────────┘
│ MCP (tools/list, tools/call)
┌───────────▼─────────────┐
│ mcp-github-db-server │
│ ┌─────────┐ ┌─────────┐ │
│ │ github │ │database │ │
│ │ tools │ │ tools │ │
│ └────┬────┘ └────┬────┘ │
└───────┼───────────┼──────┘
│ │
┌──────▼───┐ ┌────▼──────┐
│ GitHub │ │ SQLite │
│ REST API │ │ (local) │
└──────────┘ └───────────┘Tools
GitHub (src/tools/github.ts)
Tool | Description |
| List repos visible to the authenticated token |
| Read a file's contents at a given ref |
| List entries at a path (directory listing) |
| Search code via GitHub's code search |
| List issues, filtered by state |
| Create a new issue |
| List pull requests, filtered by state |
Database (src/tools/database.ts)
Tool | Description |
| List tables in the local SQLite database |
| Show a table's columns/types |
| Run a read-only |
| Run a write statement ( |
| Idempotent insert/update into the |
db_query and db_execute are intentionally split so a client can offer
"read-only mode" by only ever calling the former.
Claude Code skills (.claude/skills/)
github-explorer— browsing, searching, and summarizing a GitHub repo.db-assistant— querying and safely writing to the local database.repo-health-check— a composite workflow that pulls live GitHub signal (open issues/PRs, missing hygiene files) and snapshots it into the database so repeat checks can show a trend over time.
Each SKILL.md documents when to use which tool, not just what the tool
does — e.g. preferring github_search_code over guessing file paths, or
narrating a DELETE before running it.
Setup
git clone https://github.com/<your-username>/mcp-github-db-server.git
cd mcp-github-db-server
npm install
cp .env.example .env # then fill in GITHUB_TOKEN
npm run buildGITHUB_TOKEN needs repo scope (classic PAT) or equivalent fine-grained
read/write access to whichever repositories you want the agent to touch.
GITHUB_DEFAULT_OWNER / GITHUB_DEFAULT_REPO are optional — set them to
avoid passing owner/repo on every call.
Running standalone
npm startThe server speaks MCP over stdio and logs a one-line startup message to stderr (stdout is reserved for the protocol).
Connecting to Claude Code / Claude Desktop
Copy .mcp.json.example to .mcp.json (project-scoped) or merge it into your
global Claude Desktop config, filling in your token:
{
"mcpServers": {
"github-db": {
"command": "node",
"args": ["./dist/index.js"],
"env": {
"GITHUB_TOKEN": "ghp_...",
"DATABASE_PATH": "./data/app.sqlite"
}
}
}
}The .claude/skills/ directory in this repo is picked up automatically by
Claude Code when you open this folder as a project, so the three skills above
become available alongside the MCP tools.
Seeding the database
npm run db:seedCreates data/app.sqlite (if it doesn't exist) and inserts a starter row into
the projects table.
Development
npm run dev # run the server directly with tsx (no build step)
npm run typecheck # tsc --noEmitSecurity notes
db_queryrejects anything that isn'tSELECT/WITH/EXPLAIN; writes must go throughdb_execute.All table/column identifiers used in dynamic SQL are validated against
^[A-Za-z_][A-Za-z0-9_]*$before being interpolated — user-supplied values always go through parameterized placeholders instead.GITHUB_TOKENis read from the environment only; it's never logged or echoed back through a tool response..envand the SQLite data directory are git-ignored by default.
License
MIT — see LICENSE.
Available Tools
12 toolsdb_describe_tableB
Show column names, types, and constraints for a table.
| Name | Required | Description | Default |
|---|---|---|---|
| table | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden. 'Show' reasonably implies a read-only operation and the sentence discloses what information comes back (names, types, constraints), but it says nothing about behavior when the table is absent, permission requirements, or whether system/catalog tables are visible.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the essential verb and returned fields come first and nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple single-parameter read tool with no output schema, the description covers the core return content but omits error behavior and the exact identifier form for the one required parameter. Adequate but with clear gaps given the zero schema coverage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is one required parameter with 0% schema description coverage, so the description must compensate and it does not. 'For a table' gives no guidance on whether the name should be schema-qualified, case-sensitive, or an exact identifier, which is exactly the ambiguity that breaks DB introspection calls.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Show) and resource (column names, types, constraints for a table), which is clearly distinct from db_list_tables (which tables exist) and db_query (run SQL). It doesn't name those siblings explicitly, so differentiation is inferred rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied — an agent can infer this is the introspection step before querying, but there is no stated when-to-use, when-not-to-use, or routing to db_list_tables/db_query for discovery versus execution.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
db_executeB
Run a write statement (INSERT/UPDATE/DELETE/CREATE TABLE) against the local database. Returns affected row count.
| Name | Required | Description | Default |
|---|---|---|---|
| sql | Yes | ||
| params | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description does disclose that this mutates data, operates on the local database only, and returns affected row count — useful facts. It omits transactional behavior, whether DDL like CREATE TABLE is permanent, permission requirements, and any warning that statements are irreversible.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences with the mutation scope front-loaded and the return value second. Nothing redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The return value is stated, which helps against no output schema, but for a destructive write tool with zero annotations and zero schema coverage the description leaves key gaps: parameter binding semantics and the safety profile of DDL statements.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for both parameters, so the description must carry the load and it does not: it never explains that 'sql' is the statement string or that 'params' are positional bind values. An agent must guess the shape of the params array and its binding order.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (run/write) and resource (local database) and enumerates the statement types covered (INSERT/UPDATE/DELETE/CREATE TABLE). The 'write statement' framing implicitly separates it from the read-oriented db_query sibling, though it never names that tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The word 'write' implies reads belong to db_query, but the description never states when to use db_execute versus db_query or db_upsert_project, nor any exclusions. Usage is inferable but not explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
db_list_tablesB
List all tables in the local SQLite database.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden, yet it never states that this is a read-only operation, whether views/indexes are included in "all tables", or how results are shaped/ordered. For a low-risk listing call that is tolerable, but the disclosure gap is real.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; nothing is redundant and the scope qualifier is included rather than buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema and no annotations, so the description is the only source of behavioral detail, and it omits return shape and what counts as a table. Adequate to select and call the tool, but thin for a discovery primitive other DB tools depend on.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is no per-parameter semantics to explain and the description correctly spends no words on them. Baseline 4 applies for a parameterless tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("List all tables") scoped to "the local SQLite database", which distinguishes it from the github_list_* siblings and from db_describe_table/db_query. It stops short of explicitly contrasting with those DB siblings, but the resource itself is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: an agent must infer that this is the discovery step before db_describe_table or db_query. No explicit when-to-use, prerequisites, or named alternatives are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
db_queryA
Run a read-only SQL query (SELECT/WITH/EXPLAIN only) against the local database and return the rows.
| Name | Required | Description | Default |
|---|---|---|---|
| sql | Yes | ||
| limit | Yes | ||
| params | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose the key safety trait: read-only, limited to SELECT/WITH/EXPLAIN, returning rows. It does not mention permissions, timeouts, cost/rate limits, error behavior, or whether the limit applies to returned rows versus scanned rows.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence, front-loaded with the verb and read-only constraint, with no wasted words. The parenthetical statement-type restriction is compact and useful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the core operation, safety restriction, and return shape at a high level, which is adequate for a read-only query tool. However, with no annotations, no output schema, and zero schema description coverage, the missing parameter semantics for 'limit' and 'params' leave clear gaps an agent would need to guess.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, but it only vaguely implies the 'sql' parameter. It says nothing about 'limit' (including its default of 200 and max of 1000) or about 'params' as bound values, leaving two of three parameters undocumented anywhere.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('Run a read-only SQL query ... against the local database') and states the return ('return the rows'). The read-only restriction also distinguishes it from the sibling db_execute, which handles writes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly scopes when this tool applies by restricting allowed statements to SELECT/WITH/EXPLAIN, which implicitly excludes writes and routes them elsewhere. It does not explicitly name db_execute or db_list_tables as alternatives, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
db_upsert_projectB
Convenience helper: insert or update a row in the projects table by unique project name.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| notes | No | ||
| repoFullName | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full behavioral burden. It identifies this as an upsert mutation, but it does not explain overwrite semantics, whether omitted columns are preserved or cleared, permission requirements, conflict behavior, or what the operation returns.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single efficient sentence with the key operation and resource front-loaded. There is no unnecessary text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations, no output schema, and 0% schema description coverage, the description is too sparse. It omits important upsert behavior, parameter details, and result expectations that an agent would need before invoking it safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description should compensate, but it only mentions the unique project name. It does not describe the roles of `notes` or `repoFullName`, nor does it clarify that `name` is required and the others are optional.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific operation and resource: insert or update a row in the `projects` table, keyed by unique project name. It is clearer than a generic database mutation, though it does not explicitly contrast itself with `db_execute` or `db_query`.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'Convenience helper' and the table-specific behavior imply when the tool should be used: for upserting project rows by name. However, it does not explicitly say when to use this instead of `db_execute`, `db_query`, or other database tools, nor does it state exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
github_create_issueC
Create a new issue in a GitHub repository.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | ||
| repo | No | ||
| owner | No | ||
| title | Yes | ||
| labels | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden, yet it only implies a write operation. It says nothing about required permissions, whether creating an issue triggers notifications or webhooks, what happens with duplicate titles, or what the response contains.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence, front-loaded with the action. It is efficient with no wasted clauses, though its brevity here reflects under-specification rather than disciplined economy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with zero annotation coverage, no output schema, and 0% parameter documentation, the description is far too thin. An agent cannot confirm auth requirements, required fields beyond the schema's single 'required' entry, or what is returned on success.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 5 parameters. The description only obliquely covers repo/owner via 'in a GitHub repository' and says nothing about title being required, the role of body, or label semantics and format (names vs IDs). Four of five parameters remain undocumented in both schema and description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Create a new issue in a GitHub repository.' An agent can distinguish this from the sibling read tools (github_list_issues, github_list_pull_requests) by the verb alone, though the description never names an alternative explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no guidance on when to use this instead of github_list_issues or other siblings, and states no prerequisites such as authentication, required scopes, or whether the target repository must already exist. The agent must infer all preconditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
github_get_fileB
Read a file's contents from a GitHub repository at a given ref.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | Branch, tag, or commit SHA. Defaults to the default branch. | |
| path | Yes | Path to the file within the repo, e.g. src/index.ts | |
| repo | No | ||
| owner | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description still conveys that this is a read operation returning file contents, which is minimally sufficient. However, it omits authentication requirements, rate limits, error behavior for missing files, encoding/size limits, and does not describe the response structure (there is no output schema).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a single front-loaded sentence with zero wasted words. The verb and resource appear immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a four-parameter tool with no annotations and no output schema, one sentence is too thin. It does not explain how owner/repo are provided, does not describe the return value beyond 'contents,' and leaves auth/error behavior unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%, with repo and owner undocumented in both schema and description. The description only vaguely references 'at a given ref' and does not clarify how owner/repo are supplied or add meaning beyond the schema's own path/ref descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb ('Read') and resource ('file's contents from a GitHub repository at a given ref'), making the core action clear. It is distinguishable from siblings like github_list_directory and github_search_code by outcome, though it does not explicitly name alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: call this when you know the file path and want its contents. There is no explicit when-to-use/when-not guidance, and no mention of using github_list_directory to discover paths or github_search_code to locate files.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
github_list_directoryC
List files and subdirectories at a given path in a GitHub repository.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | ||
| path | Yes | Directory path. Empty string for repo root. | |
| repo | No | ||
| owner | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden and largely drops it: nothing about token/auth requirements for private repos, rate limits, result truncation (GitHub caps large directories), or how entries are ordered. Only 'List' hints at a read-only operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler, mapping directly to verb and scope. It is efficient, though its brevity edges into under-specification rather than pure concision.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With four parameters at 25% coverage, no annotations, and no output schema, the description should explain what is returned (entry names only vs. type/size/SHA) and how owner/repo/ref combine. None of that is present, so an agent knows the purpose but not the contract.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 25% — just 'path' is documented. 'owner', 'repo', and especially 'ref' (branch/tag/commit selector) are unexplained in both schema and description, and the description does not compensate; it only vaguely gestures at 'a GitHub repository' and 'a given path'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('List') and resource ('files and subdirectories at a given path in a GitHub repository'), which is enough to separate it from github_get_file (single file) and github_list_repos (repos, not contents). It stops short of naming those siblings explicitly, so it is clear but not maximally differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description never says when to use this versus github_get_file, github_search_code, or a recursive listing, and offers no prerequisites (auth, private repo access). Usage is only inferable from the verb 'List', which is the same bar as the MID calibration example.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
github_list_issuesC
List issues for a repository, optionally filtered by state.
| Name | Required | Description | Default |
|---|---|---|---|
| repo | No | ||
| owner | No | ||
| state | Yes | open | |
| perPage | Yes |
TDQS
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 does not disclose pagination behavior, whether results are sorted, authentication needs, rate limits, or what a listing returns — all important for a read/list tool with 0% 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single efficient sentence with no filler, front-loading the resource and optional filter. Slightly under-specified rather than overly concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no annotations, no output schema, and 0% parameter coverage across four parameters, the description is too thin. An agent lacks pagination, auth, and result-shape context needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate, but it only alludes to repo and state filtering. It says nothing about owner or perPage (the pagination cap of 100, defaults), leaving half the parameters unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: 'List issues for a repository'. Clear what it does and that filtering is optional. It doesn't explicitly differentiate from siblings like github_list_pull_requests, but list vs create is obvious.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'optionally filtered by state' implies usage context, but there is no explicit when-to-use guidance, no mention of the alternative github_create_issue, and no note about pagination or result limits when listing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
github_list_pull_requestsC
List pull requests for a repository, optionally filtered by state.
| Name | Required | Description | Default |
|---|---|---|---|
| repo | No | ||
| owner | No | ||
| state | Yes | open | |
| perPage | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are supplied, so the description carries the full burden and largely drops it. It does not state that this is a read-only operation, whether private repos require authentication, how pagination behaves (perPage is oddly required), or what the response looks like. For a zero-annotation tool, that is a substantial gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the resource and the filter qualifier both arrive immediately. Nothing in it is padding, though the small size is in tension with the thin coverage elsewhere.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no annotations, no output schema, and 0% schema description coverage, this definition leaves an agent without permissions context, return-shape expectations, or pagination semantics. Given that two of four parameters are required, the description should have done considerably more.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across four parameters, so the description must compensate and barely does. It implies a repo identifier and a state filter, but never explains the owner/repo split, perPage paging, or the enum values — and it calls state "optional" while the schema marks it required, which is actively misleading.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("List pull requests for a repository") with a scoping qualifier, which is enough to distinguish it from siblings like github_list_issues and github_list_repos by resource type. It stops short of 5 because the scope is thin — no mention of pagination limits, sort order, or what the listing contains.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use or when-not-to-use guidance and no named alternatives. The only hint is "optionally filtered by state," but with no guidance on defaults, pagination strategy, or when to use this versus other GitHub listing tools, the agent must infer everything.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
github_list_reposA
List repositories visible to the authenticated GitHub token (own repos, plus any orgs the token can see).
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | Which repos to return, mirroring the GitHub API's `type` filter. | owner |
| perPage | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full behavioral burden. It usefully discloses the auth-dependent visibility scope (own repos plus visible orgs), but omits pagination behavior, ordering, error handling, and whether results are read-only.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero waste. The scope is stated immediately and nothing is repeated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter list tool, the description covers the high-level scope but leaves gaps around pagination, per-page behavior, and return shape. It is adequate to begin a call but not fully complete without annotations or an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 50%: the `type` parameter has a schema description, but `perPage` does not. The tool description adds no parameter-level meaning beyond the schema and does not explain how `perPage` controls pagination or how the parenthetical scope maps to `type`.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List repositories') plus an explicit scope ('visible to the authenticated GitHub token'). The sibling tools operate on files, directories, issues, pull requests, search, or database objects, so an agent can immediately distinguish this tool's purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use it by naming the token-scoped repo listing, but it does not give explicit when-to-use/when-not-to-use guidance or name any alternative tool. Usage is inferable but not spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
github_search_codeB
Search code across GitHub (or scoped to one repo) using GitHub's code search syntax.
| Name | Required | Description | Default |
|---|---|---|---|
| repo | No | ||
| owner | No | ||
| query | Yes | Search query, e.g. 'useEffect repo:owner/repo language:typescript' | |
| perPage | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It says nothing about authentication requirements, rate limits (GitHub code search is heavily throttled), pagination, or the 50-item cap on results — all things an agent needs before calling a code search endpoint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence, front-loaded with the action and resource, with the parenthetical scope qualifier in the right place. Nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an unannotated tool with no output schema and only 25% parameter coverage, the description is too thin: it omits auth/rate-limit behavior, result-cap semantics, and the meaning of half the parameters. An agent could invoke it but could not predict its behavior or cost.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 25%: just `query` is documented, while `repo`, `owner`, and `perPage` have no explanation in either schema or description. The phrase 'or scoped to one repo' gestures at the `repo` parameter but does not clarify how `owner` and `repo` interact or what `owner` alone does.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Search code across GitHub', with an explicit scope option (org-wide vs single repo). It is clearly distinguishable from siblings like github_get_file or github_list_directory, though the description never names an alternative for the case where the file path is already known.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage by referencing GitHub's code search syntax, but it gives no explicit when-to-use guidance, no condition for choosing this over github_get_file, and no note about prerequisites such as authentication for code search.
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.
12 tool updates
v1.0.0- First observed
db_describe_table - First observed
db_execute - First observed
db_list_tables - First observed
db_query - First observed
db_upsert_project - First observed
github_create_issue - First observed
github_get_file - First observed
github_list_directory - First observed
github_list_issues - First observed
github_list_pull_requests - First observed
github_list_repos - First observed
github_search_code
TDQS
Scored across 12 tools
Most tools have clearly distinct resource-and-action purposes: GitHub reads, issue creation, PR listing, and DB read/write/table inspection are separable. The main overlap is db_upsert_project versus db_execute, since upsert_project is a specialized write helper that could also be done via generic execution.
The set follows a predictable domain-prefixed verb_noun pattern: github_list_repos, github_get_file, db_list_tables, db_describe_table, db_upsert_project. Minor deviations are db_query and db_execute, which omit a noun object but remain clear and consistent with the db_ prefix.
Twelve tools is well within a reasonable range for a server combining GitHub reads/issue creation with local SQLite access. Each tool covers a distinct operation, and the surface does not feel bloated or thin.
The database side is fairly complete with table listing, schema description, read queries, writes, and an upsert helper. The GitHub side is notably incomplete: it can list issues and create issues, but has no update/close/get issue, no PR creation or merge, and no PR detail or comment operations.
Maintenance
Related MCP Connectors
MCP server for your apps' tools and custom tools, plus hosted AI agents and approval-gated workflows
- UnifAPIOAuthcom.unifapi
Hosted MCP server for live public-data APIs and Skills for AI agents.
AI-native git hosting — repos, PRs, issues, CI gates, and AI code review over MCP (60 tools).
An MCP server that gives your AI access to the source code and docs of all public github repos
Related MCP Servers
- AlicenseBqualityCmaintenanceMCP server that exposes GitHub operations as tools for AI agents, enabling code search, issue management, and PR review.1228 PyPIMIT
- AlicenseNot gradedqualityBmaintenanceMCP server that wraps the GitHub REST API into tools for repo queries, issue/PR management, code review, search, and authentication, letting coding agents operate GitHub directly in conversations.5 npmMIT
- FlicenseNot gradedqualityCmaintenanceEnables AI agents to interact with GitHub via MCP, managing repositories, issues, PRs, and analyzing repository health through tools like list_repositories, read_issues, create_issue, comment_on_pr, and analyze_repo_health.-
- AlicenseNot gradedqualityCmaintenanceEnables AI clients such as Cursor to interact with GitHub repositories and perform issue listing, triage, health checks, prioritization, commenting, weekly digests, and release-note generation through purpose-built MCP tools.1 npmMIT