wanadev/gitlab-mcp (wanadev/gitlab-mcp) is an MCP server listed on the M8ven Trust Index. It scores 58 out of 100, grade D. It declares 102 tools. No publisher has claimed this listing.
Provides full control over GitLab epics, issues, merge requests, pipelines, and more via a conversational interface, with dry-run safety.
Caution. Specific findings reduced this grade. They are listed on the page. Grades reflect the full trust pyramid: code, verification depth, and reputation. New projects cap at C until adoption is earned.
How we verified
Verified is a snapshot. Live keeps it current, and builds your track record.
⚡ Connect GitHub → continuous verification on every pushwhy connect →Who stands behind it
wanadev
Source: Glama
Claim it to get a verified publisher badge, a free copy of our full audit findings, and direct contact for any high-priority issues we find. Or connect your repo for our deepest verification, Live Monitored: read-only, revoke anytime. What we access →
Install from
The grade above is for the source repository. Registries can serve a different version, so we mark the ones we were not able to read.
These names and descriptions are the publisher's own, read from the source code. We print them as written. Our assessment is the findings above, not this list.
gitlab_setupGitLab MCP is not configured yet. Call this tool to show the user how to set up their GitLab token.
list_pipelinesList recent pipelines for a project. Filter by branch (ref) or status (running, pending, success, failed, canceled).
get_pipelineGet details of a specific pipeline (status, duration, jobs).
get_job_logGet the log output of a CI job (last 2000 chars).
retry_pipelineRetry a failed pipeline. dry_run=true by default.
cancel_pipelineCancel a running pipeline. dry_run=true by default.
list_branchesList branches of a project. Filter by search term.
create_branchCreate a new branch from a ref. dry_run=true by default.
list_repository_treeList files and directories in a project repository.
get_fileGet the content of a file from the repository.
list_protected_branchesList protected branches for a project, with their push/merge/unprotect access levels.
protect_branchProtect a branch with given push/merge/unprotect access levels. Access levels: 0=NoAccess, 30=Developer, 40=Maintainer, 60=Admin. dry_run=true by default.
unprotect_branchRemove branch protection rules from a branch. dry_run=true by default.
create_fileCreate a new file in a repository. Rejects if the file already exists. dry_run=true by default.
update_fileUpdate an existing file in a repository. Supports optimistic concurrency via last_commit_id. dry_run=true by default.
delete_fileDelete a file from a repository. dry_run=true by default. This is destructive on the branch.
commit_filesAtomically commit multiple file actions (create/update/delete/move/chmod) in a single commit. dry_run=true by default.
list_commitsList recent commits for a project. Filter by branch or file path.
list_epicsLister les epics d'un groupe GitLab. Filtrer par etat, recherche textuelle ou labels.
get_epicObtenir les details complets d'un epic par son numero (IID).
create_epicCreer un nouvel epic dans un groupe GitLab. Par defaut dry_run=true : retourne un apercu sans creer. Passer dry_run=false apres confirmation.
update_epicMettre a jour un epic existant. Par defaut dry_run=true : retourne un apercu sans modifier. Passer dry_run=false apres confirmation.
close_epicFermer un epic. Par defaut dry_run=true : retourne un apercu sans fermer. Passer dry_run=false apres confirmation.
reopen_epicReopen a closed epic. dry_run=true by default.
list_epic_issuesLister les issues rattachees a un epic. Affiche l'ID global et le IID projet de chaque issue.
add_issue_to_epicLink an issue to an epic. dry_run=true by default. Requires project_id and issue_iid (not the global issue ID).
list_epic_notesLister les commentaires d'un epic.
add_epic_noteAjouter un commentaire sur un epic. Par defaut dry_run=true.
update_epic_noteEdit the body of an existing epic note. Get note_id from list_epic_notes. dry_run=true by default.
delete_epic_noteDelete an existing epic note. This is destructive and cannot be undone. dry_run=true by default.
get_epic_widgetsGet Work Item widgets for an epic: health status, progress, milestone, iteration, and linked items.
set_epic_milestoneAssociate a milestone with an epic (uses Work Items API). dry_run=true by default.
set_epic_health_statusSet the health status of an epic (onTrack, needsAttention, atRisk, or null to clear). dry_run=true by default.
set_issue_health_statusSet the health status of an issue (onTrack, needsAttention, atRisk, or null to clear). dry_run=true by default.
set_epic_iterationAssociate an iteration (sprint) with an epic (uses Work Items API). dry_run=true by default.
get_work_item_idResolve the WorkItem global ID (gid://gitlab/WorkItem/N) for an epic or issue. Required as parent_work_item_id / child_work_item_ids on link_work_items and unlink_work_items.
link_work_itemsAttach one or more work items (issues or epics) as children of a parent work item (epic). Uses the Work Items hierarchy widget — the canonical GitLab 17+ replacement for add_issue_to_epic. Idempotent: existing children of the parent are preserved. Resolve GIDs via get_work_item_id. dry_run=true by d…
unlink_work_itemsDetach one or more work items from their current parent. Per-child operation: each child is unset from whatever parent it currently has (parent_work_item_id is accepted for symmetry but the unlink does not assert it). dry_run=true by default.
add_linked_itemCreate a link between two work items (epics or issues). Link types: RELATED, BLOCKS, BLOCKED_BY. dry_run=true by default.
list_issuesLister les issues d'un groupe GitLab. Filtrer par etat, recherche, labels, milestone ou assignee.
get_issueObtenir les details d'une issue par son projet et son numero (IID).
create_issueCreer une nouvelle issue dans un projet. Par defaut dry_run=true : retourne un apercu sans creer. Passer dry_run=false apres confirmation.
update_issueMettre a jour une issue existante. Par defaut dry_run=true : retourne un apercu sans modifier. Passer dry_run=false apres confirmation.
close_issueFermer une issue. Par defaut dry_run=true : retourne un apercu sans fermer. Passer dry_run=false apres confirmation.
reopen_issueReopen a closed issue. dry_run=true by default.
list_project_issuesList issues for a specific project (not group). Filter by state, labels, milestone, assignee, iteration.
list_issue_notesLister les commentaires d'une issue.
add_issue_noteAjouter un commentaire sur une issue. Par defaut dry_run=true.
update_issue_noteEdit the body of an existing issue note. Get note_id from list_issue_notes. dry_run=true by default.
delete_issue_noteDelete an existing issue note. This is destructive and cannot be undone. dry_run=true by default.
list_merge_requestsLister les merge requests d'un groupe GitLab. Filtrer par etat, auteur, reviewer, labels ou milestone.
get_merge_requestObtenir les details d'une merge request par son projet et son numero (IID).
create_merge_requestCreate a new merge request. dry_run=true by default.
update_merge_requestUpdate a merge request (title, description, labels, assignees, reviewers). dry_run=true by default.
merge_merge_requestMerge a merge request. dry_run=true by default.
approve_merge_requestApprove a merge request. dry_run=true by default.
rebase_merge_requestTrigger an asynchronous rebase of the MR's source branch on top of the target branch. Useful when CI requires a linear history before merge. dry_run=true by default.
list_mr_notesList comments on a merge request.
add_mr_noteAdd a comment to a merge request. dry_run=true by default.
update_mr_noteEdit the body of an existing MR note. Get note_id from list_mr_notes. dry_run=true by default.
delete_mr_noteDelete an existing MR note. This is destructive and cannot be undone. dry_run=true by default.
get_mr_diffGet the file changes (diff summary) of a merge request. Returns diff_refs (base_sha/head_sha/start_sha) needed to create line-positioned discussions via create_mr_discussion.
list_mr_approval_rulesList the project-level MR approval rules: who must approve, how many approvals are required, applies-to-which-branches.
create_mr_approval_ruleCreate a project-level MR approval rule. dry_run=true by default.
update_mr_approval_ruleUpdate an existing project-level MR approval rule. dry_run=true by default.
delete_mr_approval_ruleDelete a project-level MR approval rule. dry_run=true by default. This is destructive.
create_mr_discussionCreate a code-review comment on a specific line in an MR's diff (a 'discussion' in GitLab terminology). Requires the diff_refs (base_sha, head_sha, start_sha) returned by get_mr_diff. Provide exactly one of new_line / old_line. dry_run=true by default.
resolve_mr_discussionMark an MR discussion as resolved (or unresolved). dry_run=true by default.
list_milestonesLister les milestones d'un groupe GitLab. Filtrer par etat ou recherche textuelle.
get_milestoneObtenir les details d'un milestone par son ID.
create_milestoneCreer un nouveau milestone. Par defaut dry_run=true : retourne un apercu sans creer. Passer dry_run=false apres confirmation.
update_milestoneMettre a jour un milestone existant. Par defaut dry_run=true.
close_milestoneFermer un milestone. Par defaut dry_run=true.
list_project_milestonesList milestones at the project level. On GitLab CE/Free, milestones are project-scoped and this is the only way to list them.
get_project_milestoneGet details of a project-level milestone.
create_project_milestoneCreate a milestone on a project. dry_run=true by default.
update_project_milestoneUpdate a project-level milestone. dry_run=true by default.
close_project_milestoneClose a project-level milestone. dry_run=true by default.
list_groupsLister les groupes GitLab accessibles. IMPORTANT : appelez ce tool en premier quand l'utilisateur mentionne un groupe par son nom, pour obtenir le group_id (ID ou full_path) a passer aux autres tools.
list_projectsLister les projets d'un groupe GitLab. Filtrer par recherche ou statut d'archivage.
list_group_membersLister les membres d'un groupe GitLab avec leur niveau d'acces.
list_labelsLister les labels d'un groupe GitLab avec le nombre d'issues et MRs associees.
list_boardsLister les boards (tableaux kanban) d'un groupe GitLab avec leurs colonnes.
list_iterationsList iterations (sprints) for a GitLab group. Filter by state (upcoming, current, closed) or search by title. Requires GitLab Premium/Ultimate.
create_iterationCreate a new iteration (sprint) in a group. start_date and due_date are required (YYYY-MM-DD). dry_run=true by default.
update_iterationUpdate an existing iteration (sprint). The REST path uses iteration_iid (per-group), not the global id. dry_run=true by default.
get_work_item_type_idDiscover the global ID of a Work Item type (e.g. EPIC, ISSUE, TASK) for a given namespace. Required as workItemTypeId on workItemCreate. IDs vary per GitLab instance and version, so call this once per (namespace, type) and cache the result.
list_workitem_statusesList allowed Status widget values for a Work Item type in a group (GitLab 17+). Returns global IDs to pass as status_id to update_issue / update_epic.
create_labelCreate a label in a group. dry_run=true by default.
update_labelUpdate a label in a group. dry_run=true by default.
delete_labelDelete a label from a group. dry_run=true by default. This is destructive and cannot be undone.
add_group_memberAdd a user to a group with a given access level. dry_run=true by default.
add_project_memberAdd a user to a project with a given access level. dry_run=true by default.
update_member_access_levelChange a member's access level on a group or project. dry_run=true by default.
remove_memberRemove a user from a group or project. dry_run=true by default. This is destructive.
search_issuesSearch issues by full-text query within a project or group. Maps to GET /:scope/:id/search?scope=issues.
search_merge_requestsSearch merge requests by full-text query within a project or group. Maps to GET /:scope/:id/search?scope=merge_requests.
search_blobsSearch code/file contents by full-text query within a project or group. Returns matching blobs with line context. Maps to GET /:scope/:id/search?scope=blobs.
upload_fileUpload a file to a project so it can be embedded in an issue, MR, or epic description. Returns the Markdown snippet GitLab expects (e.g. ). Provide exactly one of file_path (read from local disk) or file_base64 (inline data). dry_run=true by default.
search_usersSearch for GitLab users globally by name or username.
1 further tool is not listed here. The complete surface is in the source.
Disclosed vulnerabilities in this server's declared npm dependencies (via OSV). Whether each is reachable depends on the installed versions.
@modelcontextprotocol/sdk has cross-client data leak via shared server/transport instance reuse
Anthropic's MCP TypeScript SDK has a ReDoS vulnerability
Model Context Protocol (MCP) TypeScript SDK does not enable DNS rebinding protection by default
GITLAB_BASE_URL"": "https://gitlab.com",GITLAB_READ_ONLY"": "false"GITLAB_TEST_GROUPGITLAB_TEST_PROJECT_IDGITLAB_TOKENSet in your environment (.bashrc, .zshrc, or system variable). The plugin will guide you on first launch if it's missing.All four hints declared on every tool
102/102 tools missing one or more hints — gitlab_setup (missing: destructiveHint, idempotentHint, openWorldHint); gitlab_setup (missing: destructiveHint, idempotentHint, openWorldHint); list_pipelines (missing: destructiveHint, idempotentHint, openWorldHint), +99 more. OpenAI's directory rejects tools where any of the four hints are missing or non-boolean.
For every tool, set all four hints (readOnlyHint, destructiveHint, idempotentHint, openWorldHint) to explicit true/false values that match the handler’s actual behaviour.
Tool inputs are validated
69/102 tool handlers declare input schemas (68%)
Declare an inputSchema with zod/joi/yup on every tool definition.
Tool handlers catch errors
100/102 tool handlers wrap calls in try/catch (98%)
Wrap each tool handler body in try/catch and return a structured error response.
Tests exist
No test files found
Add tests that exercise each declared tool.
Production dependencies are patched
0 critical, 3 high severity in production deps — @modelcontextprotocol/sdk@1.12.1 (high), @modelcontextprotocol/sdk@1.12.1 (high)
Run npm audit fix, or upgrade the affected packages to a non-vulnerable version.
Claim the listing to review these findings one by one and send us a correction where you disagree, straight to the team. Claiming also means we tell you when the grade moves, and reach you first if we find anything urgent.
[](https://m8ven.ai/mcp/wanadev/gitlab-mcp)?variant=verified from the URL.Vetting this one by hand? Tool Check is an MCP that scores other MCPs. Add it once and ask Claude, ChatGPT, or any MCP client to grade a server, surface CVEs, check the publisher, and suggest safer alternatives — before you install.
https://m8ven.ai/api/mcp/tool-check