The GitLab MCP server has well-structured tool definitions with complete schemas and descriptions for all 10 tools. All tools follow verb_noun naming conventions (get_, create_, list_) and have descriptions ranging from 60-95 characters, which is within the production baseline of 34-392 chars. Input schemas are properly defined with JSON Schema types, required fields, and parameter descriptions. However, there are significant gaps: (1) NO output schemas are documented, LLMs have no visibility into response structure, forcing them to guess what fields are returned and what chaining is possible. (2) No error handling guidance or recovery hints in descriptions. (3) No pagination support documented for list tools (list_merge_requests) despite potentially returning large result sets. (4) No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite having mixed READ_ONLY and WRITE tools. (5) Parameter descriptions are minimal (9-35 chars on average) and lack actionable guidance, e.g., 'GitLab project ID or path (e.g., "group/project" or "123")' is good, but many lack examples or constraints. (6) The create_merge_request tool has redundant parameter pairs (assigneeId/assigneeIds, reviewerId/reviewerIds) without documenting mutual exclusivity or precedence. (7) No security notes about token handling despite requiring GITLAB_API_TOKEN. Definition quality is above average due to complete schemas, but output documentation and error handling push it into fair range.
Create a merge request in a GitLab project
Get commit details and diff from a GitLab commit URL
Get failed jobs by pipeline ID or by latest merge request pipeline
Get job artifacts metadata and download links
Get job log (trace) for a job
Get merge request details including title, description, and optionally the diff/changes
No output schemas documented for any tool. LLMs cannot plan downstream calls or know what fields to extract from responses. E.g., get_merge_request returns unknown structure; get_pipeline_jobs response fields not specified.
list_merge_requests lacks pagination parameters (limit, offset/page) and no result count documented. Potentially returns unbounded results, risking context window exhaustion.
create_merge_request exposes conflicting parameter pairs: assigneeId vs assigneeIds, reviewerId vs reviewerIds. No documentation of mutual exclusivity, precedence, or behavior if both are provided. LLMs will guess and may send both.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 59 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 46 | - | v1 |
Get comments (notes) for a merge request
Get pipelines for a merge request
Get jobs for a pipeline
List merge requests for a project
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) present. The create_merge_request tool is marked WRITE but LLMs see no formal signal of destructiveness. Agents cannot distinguish safe retries from operations with side effects.
No error handling guidance or recovery hints in any tool description. If get_merge_request fails with 404, description provides no hint to search for the MR or check the project exists.
Parameter descriptions are minimal (avg 15-30 chars). Many lack format hints, examples, or constraints. E.g., 'Merge request internal ID (IID)' does not explain what an IID is or how it differs from a global ID.
No security guidance in tool descriptions or server initialization. GITLAB_API_TOKEN is required but no mention of scoping, token safety, or that tokens must not appear in logs. Agents may inadvertently leak credentials.