GitLab MCP has well-structured tool definitions with consistent naming (verb_noun pattern) and complete input schemas. All 5 tools follow the gitlab_* prefix convention. Descriptions are present and adequate (100-200 chars), explaining what each tool does. However, parameter descriptions lack actionable constraints (no enums for state filters, no min/max for per_page), and output schemas are not documented. Error handling is minimal, no recovery guidance or categorization. The _apiKey parameter is exposed as a tool input, violating secret-injection pattern. No tool annotations (readOnlyHint, idempotentHint) despite all tools being read-only. Overall: solid foundation, but missing production-grade polish around constraints, output documentation, and error guidance.
Get a file from a GitLab repository. Returns the file content (decoded from base64), file name, size, and encoding.
Get a single GitLab project by ID or URL-encoded path. Returns full project details including name, description, visibility, stars, forks, and default branch.
List issues in a GitLab project. Returns issue IID, title, state, labels, assignee, and URL.
List merge requests in a GitLab project. Returns MR IID, title, state, author, source/target branches, and URL.
List GitLab projects accessible to the authenticated user. Returns project ID, name, path, description, stars, and URL.
API key exposed as tool parameter (_apiKey). Credentials must be injected server-side via environment variables or vault, not passed in tool calls. Agent traces log all parameters, secrets leak into logs and prompt history.
Output schemas not documented. LLMs cannot plan downstream calls or extract required fields without knowing what each tool returns. E.g., gitlab_list_projects returns {projects: [{id, name, full_path, ...}]} but this is invisible to the agent.
State and filter parameters lack enum constraints. 'state' accepts free-form strings (e.g., 'opened', 'closed', 'all') but no enum is declared. LLMs may hallucinate invalid values like 'pending' or 'archived'. Use enum: ['opened', 'closed', 'all'] in schema.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 58 | 2026-07-28+ | v2 |
Numeric parameters (per_page) lack min/max constraints in schema. Description says 'default 20, max 100' but schema has no minimum/maximum fields. LLMs may pass 0, -1, or 10000. Add 'minimum': 1, 'maximum': 100 to schema.
No tool annotations (readOnlyHint, idempotentHint). All 5 tools are read-only and idempotent, but this is not declared in the schema. Add 'readOnlyHint': true to help agents understand these are safe to retry and do not modify state.