MCP server for GitLab integration providing tools to interact with GitLab projects, issues, merge requests, pipelines, and user information
Server has 8 tools with basic verb-noun naming (get_*, search_*) and descriptions present. However, critical gaps undermine quality: (1) All tools return unstructured markdown strings instead of structured JSON objects, breaking downstream tool chaining and forcing LLM text parsing. (2) No input schemas visible in source, tools use fastmcp decorators but parameter schemas are not explicitly defined in the provided code. (3) Descriptions lack actionable detail: 'Gets all projects assigned to me' doesn't explain when to use this vs search_projects, or what fields are returned. (4) No output schema documentation. (5) No error handling guidance, exceptions return raw error strings. (6) Parameters like 'state' and 'status' lack enum constraints in visible code. (7) No pagination support despite tools returning potentially large lists. Baseline: avg tool description ~60 chars (well below 194-char production baseline); no param descriptions visible; no structured output.
Gets my GitLab issues. State can be: opened, closed, all
Gets my merge requests. State can be: opened, closed, merged, all
Gets all projects assigned to me
Gets detailed information about a specific project
Gets issues for a specific project
Gets merge requests for a specific project
All tools return unstructured markdown strings instead of structured JSON. Breaks tool chaining and forces LLM to parse text. E.g., get_my_projects returns '📂 Found N projects:\n...' instead of {projects: [{id, name, url, ...}]}.
No input schemas visible in source code. Tools decorated with @mcp.tool() but parameter type definitions, enums, and constraints not shown. Cannot verify schema compliance.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 54 | 2026-07-28+ | v2 |
Gets pipelines for a specific project. Status can be: running, pending, success, failed, canceled, skipped, latest
Searches for projects by name
No pagination support. Tools like get_my_projects and get_my_merge_requests call .list(all=True), fetching entire result sets. No limit, offset, or cursor parameters exposed to LLM. Large result sets will exhaust context window.
Error handling returns raw exception strings (e.g., '❌ Error getting projects: {str(e)}'). No guidance on recovery, retry eligibility, or next steps. LLM cannot determine if error is transient or fatal.
Parameter descriptions incomplete. 'state' and 'status' parameters mention allowed values in docstring but lack enum constraints in schema. No min/max for numeric params. Descriptions under 50 chars for most tools.