A Model Context Protocol server created by RickardHF.
The server defines 10 tools with basic descriptions and parameter schemas using Zod. However, the implementation exhibits significant quality gaps aligned with production baseline expectations. Tool descriptions are short (most under 50 chars), lack context about when to use each tool versus similar ones, and do not explain consequences (especially for WRITE operations). Parameter descriptions exist but are minimal (e.g., 'Repository owner', 'Repository name' repeat across tools without guidance on expected format). Output schemas are completely undocumented, there is no specification of what fields are returned, making it impossible for LLMs to plan downstream calls. Error handling is generic; code shows catch blocks that return 500 status with error.message, providing no recovery guidance. The schema definitions use Zod but are not exposed in a machine-readable way to the LLM context. Tools 8 (get-pull-requests) has a parameter mismatch: it accepts pullNumber but description says 'Get all pull requests', semantically contradictory. No tool accepts pagination parameters despite APIs typically returning lists. No validation of input ranges or formats is evident in the visible code.
Create a new branch in a GitHub repository.
Create a new pull request in a GitHub repository.
Create security issues in a GitHub repository.
Get GitHub user information based on the username.
Get a pull request in a GitHub repository.
Get all pull requests in a GitHub repository.
Output schemas completely undocumented. No specification of what fields tools return, making it impossible for LLMs to extract data for downstream calls or plan multi-step operations. This violates the pattern:tool and pattern:response-shaper requirements.
Tool get-pull-requests has semantic contradiction: description says 'Get all pull requests' but requires a pullNumber parameter. This is either a parameter naming error (should be singular get-pull-request) or the description is wrong (should accept owner/repo only and return paginated results). This violates naming clarity and tool-description patterns.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 47 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 39 | - | v1 |
Retrieves the security status of a GitHub repository. This includes Dependabot alerts, code scanning alerts, and secret scanning alerts.
List branches in a GitHub repository.
List all open issues in a GitHub repository.
List security issues in a GitHub repository.
Descriptions are too short and generic. list-open-issues, list-security-issues, get-pull-request all have descriptions under 50 chars. Current descriptions lack disambiguation (e.g., when to use list-open-issues vs list-security-issues vs create-security-issue).
Parameter descriptions are minimal and repetitive. 'Repository owner' and 'Repository name' appear 8+ times without explaining format expectations, whether paths or just names, or how they map to GitHub API.
No pagination support. list-security-issues, list-open-issues, list-branches, and get-pull-requests return full results without limit, offset, or cursor parameters. Per pattern:paginated-result, tools returning lists must accept page/offset and limit parameters. This risks context window exhaustion and poor LLM reasoning on large datasets.
WRITE operations lack confirmation or dry-run support. create-security-issue, create-new-branch, and create-new-pull-request have no dry-run or confirmation parameters. Per pattern:confirmation-request, irreversible operations should require explicit confirmation to prevent agent mistakes.
Error handling is non-actionable. Code in branch.ts and process.ts shows generic catch blocks returning {status: 500, error: error.message}. Per pattern:recovery-guide and review:actionable-errors, errors must tell LLMs what to do next (retry vs ask user vs abort) and include the invalid value and constraint violated. Example: missing owner should return 'Invalid owner: got "undefined", must be a valid GitHub username or org name.'
GitHub token retrieved via 'gh auth token' shell command and passed through every function. Per pattern:secret-injection, credentials should never appear in tool parameters or logs. Current approach risks leaking tokens in request traces. Should use environment-based secret injection (GITHUB_TOKEN env var) and never log the token value.
No response field consistency for chaining. E.g., create-new-branch returns {status, url} but does not return the branch name or SHA. Per pattern:tool-chain, if downstream tools (e.g., create-new-pull-request) need branchName, the create response must provide it. Similarly, create-new-pull-request should return pull_request_id for downstream operations like get-pull-request.
No input validation visible. Code does not validate owner/repo format, branchName format, or pullNumber range before calling GitHub API. Per review:param-validation-rules, invalid inputs should be rejected with clear error messages before making external calls. E.g., 'Invalid pullNumber: got "abc", must be a positive integer.'
No rate limiting or timeout configuration. Tools make unbounded GitHub API calls without explicit timeout or rate limit checks. Per pattern:scope-declaration and review pattern, runaway agents could hammer the API. Should include per-request timeout and check GitHub rate limit headers.