Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

io.github.mmedum/gitlab-mcp

MCPB · GITLAB-MCP_2.4.0.MCPB

GitLab over MCP from your own account: issues, merge requests, reviews, the repository and CI.

+5 this week 59 Trust /100

Last scanned (18 minutes ago)

Scores higher than 95% of MCPB servers

Category Version Control

Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →

Supply Chain Security0
  • No malware scan is available for this kind of package: the supply-chain vendors we use do not cover it. This is a permanent gap in our coverage, not a finding about the package.Unverified
  • Known CVEs could not be checked: we found no dependency list to check in this bundle: either it runs a compiled binary, whose bundled manifests we do not read, or none of the package.json, requirements.txt, pyproject.toml or uv.lock files it ships for its runtime declares a dependency we can read (a requirements.txt that only points at a setup.py project, a local path, or a nested requirements file we cannot follow counts as none).Unverified
  • Install-script risk not yet assessed.Unverified
  • Dependency health could not be checked: we found no dependency list to check in this bundle: either it runs a compiled binary, whose bundled manifests we do not read, or none of the package.json, requirements.txt, pyproject.toml or uv.lock files it ships for its runtime declares a dependency we can read (a requirements.txt that only points at a setup.py project, a local path, or a nested requirements file we cannot follow counts as none).Unverified
Provenance & Transparency100
  • Source repository is publicly reachable at the declared URL. View diagnostics → Pass
  • Cryptographically verified build provenance (signed, bound to mmedum/gitlab-mcp). View diagnostics → Pass
  • Clear OSI-approved license (Apache-2.0).Pass
  • Actively maintained (last published 6 days ago).Pass
  • Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability65
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 18362 tokens (~291/item across 63 items; 63 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management67
  • Stability observed for 20 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage100
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 100% of tool parameters carry a description.Pass
  • Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety94
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • 6 of 8 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "get_merge_request" implies "merge" and declares readOnlyHint instead, contradicting what its own name says it does. See how to fix → Partial
  • An AI judge read all 64 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a current MCP spec version (2026-07-28).Pass

Unverified: 1 category

A category scored 0 because we could not verify it: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.

Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 17 Oct 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 63 to 67. That category is still filling its 30-day observation window: 19 days of observed history at the previous scan, 20 at this one. The score rises as the window fills, whether or not the server changes.

  • 15 Oct 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 57 to 60. That category is still filling its 30-day observation window: 17 days of observed history at the previous scan, 18 at this one. The score rises as the window fills, whether or not the server changes.

  • 14 Oct 26 +37
    • Injection markers: unverified → pass ▲ security
    • Stability: unverified → 0.57 ▲ functional
    • Tool coverage: unverified → 100 ▲ functional
    • MCP protocol: unverified → pass ▲ functional
    • Package version: 2.2.1 → 2.4.0 functional
  • 13 Oct 26 +12
    • Provenance: unverified → pass ▲ security
    • The attested source repository moved: mmedum/gitlab-mcp security
    • Maintenance: unverified → pass ▲ functional
    • Package version: 2.2.1 → 2.4.0 functional
  • 12 Oct 26 0
    • Package version: 2.2.1 → 2.4.0 functional
  • 11 Oct 26 −46
    • Provenance: pass → unverified ▼ security
    • Tool safety: pass → unverified ▼ security
    • Stability: 0.33 → unverified ▼ security
    • The attested source repository moved: mmedum/gitlab-mcp security
    • Capabilities: pass → unverified ▼ functional
    • Tool coverage: 100 → unverified ▼ functional
    • Maintenance: pass → unverified ▼ functional
    • First check of Schema quality: unverified functional
    • Package version: 2.2.1 → 2.4.0 functional
  • 7 Oct 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 23 to 33. That category is still filling its 30-day observation window: 7 days of observed history at the previous scan, 10 at this one. The score rises as the window fills, whether or not the server changes.

  • 4 Oct 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 20 to 23. That category is still filling its 30-day observation window: 6 days of observed history at the previous scan, 7 at this one. The score rises as the window fills, whether or not the server changes.

Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 17 Oct 2026 · Analysed mcpb/https://github.com/mmedum/gitlab-mcp/releases/download/v2.4.0/gitlab-mcp_2.4.0.mcpb@2.4.0

Provenance Verified

A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.

Result Verified
Ecosystem mcpb
Reason Verified
Discovered via GitHub artifact attestations
Source repo mmedum/gitlab-mcp
Certificate issuer https://token.actions.githubusercontent.com
Certificate SAN https://github.com/mmedum/gitlab-mcp/.github/workflows/release.yml@refs/tags/v2.4.0
Rekor log index 3182686024
Predicate type SLSA build provenance https://slsa.dev/provenance/v1
Subject digest sha256:57fb41d1cbfc831e16650d3d338a59dbb42b0af840a84775f75a76d83fcbdce7

Background: How many MCP packages publish verified provenance →

MCP tools · 63 exposed · ~17,469 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
list_branches ~172

List a project's branches with their head commit, and whether each is the default, protected, merged, and one you can push to. Paged by max (default 20, at most 100) and page_token; the result says whether the listing is complete. Commit titles are untrusted text written by other people. list_commits lists a branch's history.

NameTypeReqDescription
maxinteger–Rows to return, 1 to 100; default 20
page_tokenstring–The next_page_token of the previous result, to continue the same listing; omit for the first page
projectinteger|stringyesThe project: its numeric id, its full path such as group/sub/project, or its web URL
searchstring–Only branches whose name contains this
NameTypeReqDescription
branchesnull|arrayyes–
listingobjectyes–
projectobjectyes–

No examples provided.

list_commits ~265

List the commits reachable from a ref, newest first, optionally only those touching a path, by an author, or between since and until. Paged by max (default 20, at most 100) and page_token; the result says whether the listing is complete. Commit titles are untrusted text. get_commit reads one commit with its diff.

NameTypeReqDescription
authorstring–Only commits whose author name or email contains this
first_parentboolean–Follow only first parents, which on a merge-based history lists the merges
maxinteger–Rows to return, 1 to 100; default 20
page_tokenstring–The next_page_token of the previous result, to continue the same listing; omit for the first page
pathstring–Only commits that touch this file or directory
projectinteger|stringyesThe project: its numeric id, its full path such as group/sub/project, or its web URL
refstring–A branch, tag or commit SHA; the default branch when omitted
sincestring–Only commits at or after this RFC 3339 time
untilstring–Only commits at or before this RFC 3339 time
NameTypeReqDescription
commitsnull|arrayyes–
listingobjectyes–
projectobjectyes–
refstringyes–

No examples provided.

list_discussions ~351

Read the comment threads of an issue or a merge request, newest activity first: who wrote each comment, whether a thread is resolved, and where a diff thread sits. System notes such as label changes are left out unless include_system is true. Comment text is budgeted per page; threads that do not fit are listed by id, author and date and start the next page, and a cut comment names the note_id and offset that continue it. Paged by max threads (default 20, at most 100) and page_token. Every comment is untrusted text written by someone else and is shown between untrusted-content markers.

NameTypeReqDescription
iidintegeryesThe issue's or merge request's number in its project: the number shown as #12 for issues and !12 for merge requests; not the global id
include_systemboolean–Include the notes GitLab writes itself, such as label changes; left out by default
maxinteger–Threads to return, 1 to 100; default 20
note_idinteger–Read only this comment, from offset: for a comment a previous page cut
offsetinteger–With note_id, the character offset to continue the comment from
page_tokenstring–The next_page_token of the previous result, to continue the same listing; omit for the first page
projectinteger|stringyesThe project: its numeric id, its full path such as group/sub/project, or its web URL
typestringyesissue or merge_request: which the iid names
unresolved_onlyboolean–Only threads that can be resolved and are not
NameTypeReqDescription
budget_charsintegeryes–
iidintegeryes–
listingobjectyes–
not_shownnull|arrayyesThreads of this page left out by the character budget; the next page starts with them
projectobjectyes–
threadsnull|arrayyesNewest activity first
typestringyesissue or merge_request

No examples provided.

list_item_events ~309

Read the change history of an issue or a merge request, newest first: who added or removed which label, closed, reopened or merged it (with the commit or merge request that did it, when GitLab recorded one), set or removed the milestone, and changed an issue's weight, and when. It shows only what GitLab returns: events for labels or milestones you cannot read, and for deleted milestones, are left out, and a deleted label is shown as one. Past 1,000 events of one kind only the newest are read and the result says where the history starts; that cut assumes GitLab's event ids follow time, which an imported item's may not. Paged by max (default 20, at most 100) and page_token. Milestone titles are untrusted text. list_discussions reads the comments.

NameTypeReqDescription
iidintegeryesThe issue's or merge request's number in its project: the number shown as #12 for issues and !12 for merge requests; not the global id
maxinteger–Events to return, 1 to 100; default 20
page_tokenstring–The next_page_token of the previous result, to continue the same listing; omit for the first page
projectinteger|stringyesThe project: its numeric id, its full path such as group/sub/project, or its web URL
typestringyesissue or merge_request: which the iid names
NameTypeReqDescription
eventsnull|arrayyesNewest first
iidintegeryes–
listingobjectyes–
projectobjectyes–
sincenull|stringyesNull when the history goes back to the start; otherwise it covers only events after this time, and events at or before it are not shown. It assumes GitLab's event ids follow time, which an imported i…
typestringyesissue or merge_request

No examples provided.

list_job_artifacts ~179

List the files a job kept as artifacts, with their sizes. Paged by max (default 20, at most 100) and page_token. get_job_artifact reads one text file.

NameTypeReqDescription
job_idintegeryesThe job's id, as list_jobs gives it
maxinteger–Rows to return, 1 to 100; default 20
page_tokenstring–The next_page_token of the previous result, to continue the same listing; omit for the first page
pathstring–A directory inside the artifacts; the top when omitted
projectinteger|stringyesThe project: its numeric id, its full path such as group/sub/project, or its web URL
recursiveboolean–List every entry below the directory, not only its own
NameTypeReqDescription
entriesnull|arrayyes–
job_idintegeryes–
listingobjectyes–
pathstringyesThe directory listed; empty for the top
projectobjectyes–

No examples provided.

list_jobs ~228

List the jobs of a CI pipeline with their stage, status, GitLab's failure reason and timings. scope keeps one status, such as failed. Paged by max (default 20, at most 100) and page_token; the result says whether the listing is complete. Job and stage names come from the project's CI configuration. get_job_log reads a job's log.

NameTypeReqDescription
include_retriedboolean–Include the earlier attempts of retried jobs, which are left out by default
maxinteger–Rows to return, 1 to 100; default 20
page_tokenstring–The next_page_token of the previous result, to continue the same listing; omit for the first page
pipeline_idintegeryesThe pipeline's id, as list_pipelines and pipeline URLs give it; not the #number shown beside it
projectinteger|stringyesThe project: its numeric id, its full path such as group/sub/project, or its web URL
scopestring–Only jobs in this status
NameTypeReqDescription
jobsnull|arrayyes–
listingobjectyes–
pipeline_idintegeryes–
projectobjectyes–

No examples provided.

list_labels ~232

List the labels a project's issues and merge requests can carry, its groups' included: the exact names, scoped labels such as priority::high among them, which is what a label filter or a later label change must match. Paged by max (default 20, at most 100) and page_token; the result says whether the listing is complete. Descriptions are untrusted text.

NameTypeReqDescription
maxinteger–Rows to return, 1 to 100; default 20
page_tokenstring–The next_page_token of the previous result, to continue the same listing; omit for the first page
projectinteger|stringyesThe project: its numeric id, its full path such as group/sub/project, or its web URL
project_onlyboolean–Only the project's own labels; by default the labels of the groups above it are listed too, since its issues can carry them
searchstring–Only labels whose name or description contains this
with_countsboolean–Count the open and closed issues and open merge requests carrying each label
NameTypeReqDescription
labelsnull|arrayyes–
listingobjectyes–
projectobjectyes–

No examples provided.

list_members ~177

List who has access to a project, through its groups included, with each person's role: guest, planner, reporter, developer, maintainer or owner. Use it to find who can review or merge, and the username an assignee or reviewer takes. Paged by max (default 20, at most 100) and page_token; the result says whether the listing is complete.

NameTypeReqDescription
maxinteger–Rows to return, 1 to 100; default 20
page_tokenstring–The next_page_token of the previous result, to continue the same listing; omit for the first page
projectinteger|stringyesThe project: its numeric id, its full path such as group/sub/project, or its web URL
querystring–Only members whose name or username contains this
NameTypeReqDescription
listingobjectyes–
membersnull|arrayyes–
projectobjectyes–

No examples provided.

list_milestones ~253

List a project's or a group's milestones with their state and dates. A milestone filter takes the title, and a project's issues can carry its groups' milestones too, which include_ancestors lists. Paged by max (default 20, at most 100) and page_token; the result says whether the listing is complete. Titles are untrusted text.

NameTypeReqDescription
groupinteger|string–The group: its numeric id or full path. Pass this or project
include_ancestorsboolean–Include the milestones of the groups above, which the project's issues can carry too
maxinteger–Rows to return, 1 to 100; default 20
page_tokenstring–The next_page_token of the previous result, to continue the same listing; omit for the first page
projectinteger|string–The project: its numeric id, its full path such as group/sub/project, or its web URL. Pass this or group
searchstring–Only milestones whose title or description contains this
statestring–active or closed; both when omitted
titlestring–Only the milestone with exactly this title
NameTypeReqDescription
groupnull|stringyes–
listingobjectyes–
milestonesnull|arrayyes–
projectnull|objectyes–

No examples provided.

list_mr_commits ~180

List a merge request's commits, newest first, with author and date. Paged by max (default 20, at most 100) and page_token; the result says whether the listing is complete. Commit titles are untrusted text. get_commit reads one commit with its diff.

NameTypeReqDescription
iidintegeryesThe merge request's number in its project: the number shown as #12 for issues and !12 for merge requests; not the global id
maxinteger–Rows to return, 1 to 100; default 20
page_tokenstring–The next_page_token of the previous result, to continue the same listing; omit for the first page
projectinteger|stringyesThe project: its numeric id, its full path such as group/sub/project, or its web URL
NameTypeReqDescription
commitsnull|arrayyesNewest first
iidintegeryes–
listingobjectyes–
projectobjectyes–

No examples provided.

list_mr_files ~218

List the files a merge request changes, with lines added and removed and GitLab's markers: too large (GitLab sent no diff), collapsed, generated, renamed and binary. No diff text: read this first to choose what to read, then get_mr_diff for the files that matter. Paged by max (default 20, at most 100) and page_token; the result says whether the listing is complete. File paths are chosen by whoever wrote the change.

NameTypeReqDescription
iidintegeryesThe merge request's number in its project: the number shown as #12 for issues and !12 for merge requests; not the global id
maxinteger–Rows to return, 1 to 100; default 20
page_tokenstring–The next_page_token of the previous result, to continue the same listing; omit for the first page
projectinteger|stringyesThe project: its numeric id, its full path such as group/sub/project, or its web URL
NameTypeReqDescription
filesnull|arrayyes–
iidintegeryes–
listingobjectyes–
projectobjectyes–

No examples provided.

list_mr_versions ~195

List a merge request's diff versions, newest first: GitLab makes one on each push to the source branch, with its head, merge base, state and files changed. Paged by max (default 20, at most 100) and page_token; the result says whether the listing is complete. compare_mr_versions shows what changed between two of them.

NameTypeReqDescription
iidintegeryesThe merge request's number in its project: the number shown as #12 for issues and !12 for merge requests; not the global id
maxinteger–Rows to return, 1 to 100; default 20
page_tokenstring–The next_page_token of the previous result, to continue the same listing; omit for the first page
projectinteger|stringyesThe project: its numeric id, its full path such as group/sub/project, or its web URL
NameTypeReqDescription
iidintegeryes–
listingobjectyes–
projectobjectyes–
versionsnull|arrayyesNewest first

No examples provided.

list_pipelines ~307

List a project's CI pipelines, newest first, by ref, commit, status, source, who started them and when they were updated. Paged by max (default 20, at most 100) and page_token; the result says whether the listing is complete. get_pipeline reads one with its failed jobs; get_merge_request names a merge request's head pipeline.

NameTypeReqDescription
maxinteger–Rows to return, 1 to 100; default 20
order_bystring–id (default), status, ref, updated_at or user_id
page_tokenstring–The next_page_token of the previous result, to continue the same listing; omit for the first page
projectinteger|stringyesThe project: its numeric id, its full path such as group/sub/project, or its web URL
refstring–Only pipelines for this branch or tag
shastring–Only pipelines for this commit
sortstring–desc (default) or asc
sourcestring–Only pipelines started this way, such as push, merge_request_event, schedule or web
statusstring–Only pipelines in this status
updated_afterstring–Only pipelines updated at or after this RFC 3339 time
updated_beforestring–Only pipelines updated at or before this RFC 3339 time
usernamestring–Only pipelines this username started
NameTypeReqDescription
listingobjectyes–
pipelinesnull|arrayyes–
projectobjectyes–

No examples provided.

list_review_comments ~195

List your own unpublished review comments (drafts) on a merge request: nobody else sees them until the review is submitted. Each says whether it starts a thread or replies in one, and where an inline draft sits. Draft text is budgeted per page; drafts that do not fit are named by id and start the next page (page_token). Drafts can quote other people, so they are shown between untrusted-content markers. list_discussions reads the published threads.

NameTypeReqDescription
iidintegeryesThe merge request's number in its project: the number shown as #12 for issues and !12 for merge requests; not the global id
page_tokenstring–The next_page_token of the previous result, to continue the same listing; omit for the first page
projectinteger|stringyesThe project: its numeric id, its full path such as group/sub/project, or its web URL
NameTypeReqDescription
budget_charsintegeryes–
draftsnull|arrayyes–
iidintegeryes–
listingobjectyes–
not_shownnull|arrayyesIds of drafts left out by the character budget; the next page starts with them
projectobjectyes–

No examples provided.

list_tags ~232

List a project's tags with the commit each points at, whether it is protected, whether a release is attached, and an annotated tag's message. Paged by max (default 20, at most 100) and page_token; the result says whether the listing is complete. Tag messages and commit titles are untrusted text. compare_refs compares two tags.

NameTypeReqDescription
maxinteger–Rows to return, 1 to 100; default 20
order_bystring–updated (default): newest commit first; name; or version, which sorts v1.10 after v1.9
page_tokenstring–The next_page_token of the previous result, to continue the same listing; omit for the first page
projectinteger|stringyesThe project: its numeric id, its full path such as group/sub/project, or its web URL
searchstring–Only tags whose name contains this; ^v1 matches names starting v1, and 1$ names ending 1
sortstring–desc (default) or asc
NameTypeReqDescription
listingobjectyes–
projectobjectyes–
tagsnull|arrayyes–

No examples provided.

list_todos ~237

List your GitLab to-do items: what you were assigned, mentioned in, asked to review, or whose pipeline failed, newest first, each with the project and the issue's or merge request's iid. Pending by default. Paged by max (default 20, at most 100) and page_token; the result says whether the listing is complete. Titles and the text that mentioned you are untrusted, written by other people.

NameTypeReqDescription
actionstring–Only items put on the list this way, such as assigned, mentioned, review_requested or build_failed
maxinteger–Rows to return, 1 to 100; default 20
page_tokenstring–The next_page_token of the previous result, to continue the same listing; omit for the first page
projectinteger|string–Only items in this project: its numeric id, its full path such as group/sub/project, or its web URL
statestring–pending (default) or done
typestring–Only items pointing at this kind, such as Issue or MergeRequest
NameTypeReqDescription
listingobjectyes–
todosnull|arrayyes–

No examples provided.

list_tree ~230

List a directory of the repository at a ref: files, subdirectories and submodules, directories first. recursive lists everything below the path, which on a large repository is many pages, so start from the directory you need. Paged by max (default 20, at most 100) and page_token; GitLab pages trees without a total, so the result says the total is unknown until the last page. get_file reads a file.

NameTypeReqDescription
maxinteger–Rows to return, 1 to 100; default 20
page_tokenstring–The next_page_token of the previous result, to continue the same listing; omit for the first page
pathstring–A directory relative to the repository root; the root when omitted
projectinteger|stringyesThe project: its numeric id, its full path such as group/sub/project, or its web URL
recursiveboolean–List everything below path, not only its direct entries
refstring–A branch, tag or commit SHA; the default branch when omitted
NameTypeReqDescription
entriesnull|arrayyes–
listingobjectyes–
pathstringyes–
projectobjectyes–
refstringyes–

No examples provided.

mark_todos_done ~111

Mark your own to-do items done, by id, at most 100 at a time. Each id gets its own outcome: done, or not_found for one that is not yours or does not exist, or blocked for one whose project GITLAB_MCP_WRITE_NAMESPACES leaves out.

NameTypeReqDescription
dry_runboolean–Return what would be sent without writing anything
idsnull|arrayyesTo-do item ids, as list_todos gave them; at most 100
NameTypeReqDescription
dry_runbooleanyesTrue when nothing was written; the result describes what would have been
escaped_commandsnull|arrayyesLines GitLab would have run as quick actions, sent with a leading backslash so they show as text
itemsnull|arrayyes–
notesnull|arrayyes–
outcomestringyesdone, partly_done, none_done or dry_run
targetobjectyes–
would_sendnull|objectyesThe request a dry run did not send; null when something was written

No examples provided.

publish_review_comment ~255

Publish one of your own draft review comments now, on its own, as the thread or reply it was drafted as; submit_review publishes all of them at once. A reply drafted to resolve its thread resolves it when your role may, and any other reply reopens a resolved thread, as GitLab does. A draft with a quick-action line is refused. GitLab does not say what it created, so the server reads the threads afterwards and reports the comment; if GitLab deleted the draft without saving it, the outcome is lost and the result gives the text back. Never repeated after a lost answer. The result names the project's visibility: in a public project, what is written is public.

NameTypeReqDescription
draft_idintegeryesThe draft's id, as list_review_comments or add_review_comment gave it
dry_runboolean–Check the draft and return what would be sent without writing anything
iidintegeryesThe merge request's number in its project: the number shown as #12 for issues and !12 for merge requests; not the global id
projectinteger|stringyesThe project: its numeric id, its full path such as group/sub/project, or its web URL
NameTypeReqDescription
discussion_idstringyesThe thread the comment is in; for a new thread, empty when lost or a dry run
draft_idintegeryes–
dry_runbooleanyesTrue when nothing was written; the result describes what would have been
escaped_commandsnull|arrayyesLines GitLab would have run as quick actions, sent with a leading backslash so they show as text
iidintegeryes–
kindstringyesthread (it starts one) or reply (it joins one)
line_rangenull|objectyesThe lines a multi-line comment covers; null for one line
note_idintegeryesThe published comment's id, found by reading the threads afterwards; 0 when lost or a dry run
notesnull|arrayyes–
outcomestringyespublished; lost when GitLab deleted the draft without saving a comment; or dry_run
positionnull|objectyesWhere on the diff the comment sits, as read back, or the draft's place on a dry run; null for one not on a line
targetobjectyes–
thread_resolvednull|booleanyesWhether the thread is resolved after publishing, as read back; null when lost or a dry run
untrusted_bodystringyesThe draft's text, only when it was lost, so it can be added again; empty otherwise
updated_atnull|stringyesThe comment's updated_at; pass it to update_comment. Null when lost or a dry run
would_sendnull|objectyesThe request a dry run did not send; null when something was written

No examples provided.

react ~336

React with an emoji on an issue, a merge request or a comment on one (note_id), or remove your reaction with remove: true. Only your own reactions change. The result says unchanged when you already reacted with it, or had no such reaction to remove. GitLab refuses an emoji it does not know, a comment it wrote itself and an item you may not react to alike, as not found. A reaction on a comment moves the comment's updated_at, which update_comment and delete_comment compare; one on an issue or a merge request does not. The result names the project's visibility: in a public project, what is written is public.

NameTypeReqDescription
dry_runboolean–Return what would be sent, and whether you reacted with it now, without writing anything
emojistringyesThe emoji's name, such as thumbsup, thumbsdown, tada, heart, eyes or rocket; +1 and -1 are thumbsup and thumbsdown. A custom emoji works only in a project in a group that defines it
iidintegeryesThe number in its project: the number shown as #12 for issues and !12 for merge requests; not the global id
note_idinteger–React on this comment, as list_discussions gave its id, rather than on the issue or merge request itself
projectinteger|stringyesThe project: its numeric id, its full path such as group/sub/project, or its web URL
removeboolean–Remove your reaction with this emoji instead of adding it
typestringyesissue or merge_request
NameTypeReqDescription
dry_runbooleanyesTrue when nothing was written; the result describes what would have been
emojistringyesThe emoji's name as GitLab stores it when a read or its answer showed it, which may differ from the one given: +1 is thumbsup
escaped_commandsnull|arrayyesLines GitLab would have run as quick actions, sent with a leading backslash so they show as text
iidintegeryes–
note_idintegeryesThe comment reacted on; 0 for the issue or merge request itself
notesnull|arrayyes–
outcomestringyesadded, removed, unchanged (it already was so) or dry_run
reactednull|booleanyesWhether your reaction with this emoji is there after the call; in a dry run, as read now. Null when unknown: past 1,000 reactions, a read cannot find yours
targetobjectyes–
typestringyesissue or merge_request
would_sendnull|objectyesThe request a dry run did not send; null when something was written

No examples provided.

resolve_discussion ~195

Resolve a thread on a merge request or an issue, or reopen it with reopen: true. The result gives the thread's state as GitLab reported it, and says when it already was in that state. The result names the project's visibility: in a public project, what is written is public.

NameTypeReqDescription
discussion_idstringyesThe thread, as list_discussions names it
dry_runboolean–Return what would be sent without writing anything
iidintegeryesThe number in its project: the number shown as #12 for issues and !12 for merge requests; not the global id
projectinteger|stringyesThe project: its numeric id, its full path such as group/sub/project, or its web URL
reopenboolean–Mark the thread unresolved instead of resolved
typestring–issue or merge_request, what iid names; default merge_request
NameTypeReqDescription
discussion_idstringyes–
dry_runbooleanyesTrue when nothing was written; the result describes what would have been
escaped_commandsnull|arrayyesLines GitLab would have run as quick actions, sent with a leading backslash so they show as text
notesnull|arrayyes–
outcomestringyesresolved, reopened, unchanged or dry_run
resolvedbooleanyesThe thread's state after the call, as GitLab reported it
targetobjectyes–
would_sendnull|objectyesThe request a dry run did not send; null when something was written

No examples provided.

resolve_url ~160

Turn a GitLab web URL into the arguments other tools take, and say what it points at: a project, issue, merge request, file with its lines, commit, compare, pipeline, job or wiki page. Use it on any link a person pastes instead of taking the URL apart: a project path has any number of groups, and GitLab's routes have changed shape over the years. Most URLs need no request; a file or tree URL whose branch name contains slashes costs one branch lookup to find where the branch ends. A URL on another host is refused [invalid], because the token belongs to the configured instance only.

NameTypeReqDescription
urlstringyesA GitLab web URL on the configured instance, as a person would paste it
NameTypeReqDescription
argumentsobjectyesThe arguments to pass that tool
end_linenull|integeryes–
fromstringyes–
idnull|integeryesA pipeline or job id
iidnull|integeryes–
kindstringyesproject, issue, merge_request, file, commit, compare, pipeline, job or wiki
linenull|integeryes–
note_idnull|integeryes–
pathstringyes–
projectstringyesThe project's full path
refstringyes–
ref_candidatesnull|arrayyesOther ways the URL's ref and path could split, when a lookup did not settle it
shastringyes–
slugstringyes–
tostringyes–
toolstringyesThe tool that reads this, or empty when none is registered

No examples provided.

revert_commit ~183

Undo a commit on a branch with a new commit that reverses it. The default branch and protected branches are refused [blocked]: code reaches them through a merge request. A dry run asks GitLab whether it applies cleanly. The commit starts the pipelines a push to the branch starts. Never repeated after a lost answer. The result names the project's visibility: in a public project, what is written is public.

NameTypeReqDescription
branchstringyesThe branch to commit to; never the default branch or a protected one
commitstringyesThe commit to apply: its SHA, whole or its first seven characters or more
dry_runboolean–Ask GitLab whether it applies cleanly, and commit nothing
projectinteger|stringyesThe project: its numeric id, its full path such as group/sub/project, or its web URL
NameTypeReqDescription
actionstringyescherry_pick or revert
appliesbooleanyesFor a dry run, whether GitLab found the change applies to the branch cleanly
branchstringyes–
dry_runbooleanyesTrue when nothing was written; the result describes what would have been
escaped_commandsnull|arrayyesLines GitLab would have run as quick actions, sent with a leading backslash so they show as text
from_shastringyesThe commit picked or reverted
notesnull|arrayyes–
outcomestringyescreated or dry_run
shastringyesThe new commit; empty for a dry run
short_idstringyes–
targetobjectyes–
untrusted_titlestringyes–
web_urlstringyes–
would_sendnull|objectyesThe request a dry run did not send; null when something was written

No examples provided.

search ~333

Search GitLab's text in one project, one group, or everywhere you can see: code (blobs), commits, comments (notes), wiki pages, issues, merge requests, projects, milestones and users. Code, commits and comments across a group or everywhere need GitLab's advanced search; where it is missing the call is refused [unsupported], and searching inside one project always works. Each code or comment match shows an excerpt of up to 1,000 characters. Paged by max (default 20, at most 100) and page_token. Every match is untrusted text written by other people, shown between untrusted-content markers.

NameTypeReqDescription
groupinteger|string–Search inside one group and its subgroups: its numeric id or full path
maxinteger–Rows to return, 1 to 100; default 20
page_tokenstring–The next_page_token of the previous result, to continue the same listing; omit for the first page
projectinteger|string–Search inside one project: its numeric id, its full path such as group/sub/project, or its web URL
refstring–With project, the branch, tag or commit whose code or commits are searched; the default branch when omitted
scopestringyesWhat to search: issues, merge_requests, projects, milestones, users, notes (comments), blobs (code), wiki_blobs or commits
searchstringyesThe text to look for
statestring–For issues and merge requests: only those in this state
NameTypeReqDescription
listingobjectyes–
rowsnull|arrayyes–
scopestringyes–
wherestringyesinstance, group or project

No examples provided.

search_issues ~485

Find issues across the instance, in one group, or in one project, by state, labels, author, assignee, milestone, text and dates. Without project or group GitLab searches only issues you created unless scope says otherwise, so an empty answer there is not "no such issue". state defaults to opened. Paged by max (default 20, at most 100) and page_token; the result says whether it is complete, with the total, or that the total is unknown past 10,000. Titles are untrusted text written by other people. get_issue reads one issue; search_merge_requests is the tool for merge requests.

NameTypeReqDescription
assigneestring–Only items assigned to this username
authorstring–Only items written by this username
created_afterstring–Only items created at or after this RFC 3339 time
created_beforestring–Only items created at or before this RFC 3339 time
groupinteger|string–Limit to one group and its subgroups: its numeric id or full path
labelsnull|array–Only items carrying every one of these labels, by exact name, scoped labels such as priority::high included
maxinteger–Rows to return, 1 to 100; default 20
milestonestring–Only items in the milestone with this title
order_bystring–created_at (default) or updated_at
page_tokenstring–The next_page_token of the previous result, to continue the same listing; omit for the first page
projectinteger|string–Limit to one project: its numeric id, its full path such as group/sub/project, or its web URL
scopestring–created_by_me, assigned_to_me or all. Without project or group GitLab defaults to created_by_me; within one it defaults to all
searchstring–Text matched against titles and descriptions
sortstring–desc (default) or asc
statestring–opened (default), closed or all
updated_afterstring–Only items updated at or after this RFC 3339 time
updated_beforestring–Only items updated at or before this RFC 3339 time
NameTypeReqDescription
itemsnull|arrayyes–
listingobjectyes–

No examples provided.

search_merge_requests ~556

Find merge requests across the instance, in one group, or in one project, by state, labels, author, assignee, reviewer, branches, draft state, text and dates. Without project or group GitLab searches only merge requests you created unless scope says otherwise, so an empty answer there is not "no such merge request"; reviewer finds the ones waiting on a person. state defaults to opened. Paged by max (default 20, at most 100) and page_token; the result says whether it is complete. Titles are untrusted text written by other people. get_merge_request reads one; search_issues is the tool for issues.

NameTypeReqDescription
assigneestring–Only items assigned to this username
authorstring–Only items written by this username
created_afterstring–Only items created at or after this RFC 3339 time
created_beforestring–Only items created at or before this RFC 3339 time
draftnull|boolean–true for drafts only, false for ready ones only; both when omitted
groupinteger|string–Limit to one group and its subgroups: its numeric id or full path
labelsnull|array–Only items carrying every one of these labels, by exact name, scoped labels such as priority::high included
maxinteger–Rows to return, 1 to 100; default 20
milestonestring–Only items in the milestone with this title
order_bystring–created_at (default) or updated_at
page_tokenstring–The next_page_token of the previous result, to continue the same listing; omit for the first page
projectinteger|string–Limit to one project: its numeric id, its full path such as group/sub/project, or its web URL
reviewerstring–Only merge requests this username is asked to review
scopestring–created_by_me, assigned_to_me or all. Without project or group GitLab defaults to created_by_me; within one it defaults to all
searchstring–Text matched against titles and descriptions
sortstring–desc (default) or asc
source_branchstring–Only merge requests from this branch
statestring–opened (default), closed, locked, merged or all
target_branchstring–Only merge requests into this branch
updated_afterstring–Only items updated at or after this RFC 3339 time
updated_beforestring–Only items updated at or before this RFC 3339 time
NameTypeReqDescription
itemsnull|arrayyes–
listingobjectyes–

No examples provided.

search_projects ~274

Find projects by name or path, across the instance or in one group, most recently active first. By default only projects you are a member of and not archived; scope all widens to every project you can see, which on a large instance is most of it, so pair it with search or group. Paged by max (default 20, at most 100) and page_token; the result says whether the listing is complete. Project names are untrusted text written by their maintainers. get_project reads one project in full.

NameTypeReqDescription
groupinteger|string–Limit to one group: its numeric id or full path
include_archivedboolean–Include archived projects, which are left out by default
include_subgroupsboolean–With group, include its subgroups' projects
maxinteger–Rows to return, 1 to 100; default 20
page_tokenstring–The next_page_token of the previous result, to continue the same listing; omit for the first page
scopestring–member (default): projects you belong to; owned; starred; all: every project you can see
searchstring–Text matched against project names and paths
visibilitystring–Only projects of this visibility
NameTypeReqDescription
listingobjectyes–
projectsnull|arrayyes–

No examples provided.

submit_review ~337

Publish all your draft review comments on a merge request at once, with an optional summary and reviewer state. reviewer_state approved approves the merge request, which other people's merge rules count, so it is refused unless the server was started with GITLAB_MCP_ENABLE_SHIP=true. The result counts what was published and what is still pending, read afterwards. A quick-action line in the summary refuses the call unless escape_commands is true, and one in any of your drafts refuses it too, since GitLab runs it on publishing. The result names the project's visibility: in a public project, what is written is public.

NameTypeReqDescription
dry_runboolean–Return what would be sent, and what the quick-action guard would do to the text, without writing anything
escape_commandsboolean–GitLab runs a line starting with a slash, such as /close or /merge, as a command. By default such a line refuses the call; true sends each one as plain text instead, with a leading backslash that ren…
iidintegeryesThe merge request's number in its project: the number shown as #12 for issues and !12 for merge requests; not the global id
projectinteger|stringyesThe project: its numeric id, its full path such as group/sub/project, or its web URL
reviewer_statestring–reviewed, requested_changes, or approved; approved is an approval and needs GITLAB_MCP_ENABLE_SHIP=true
summarystring–A summary comment published with the review, in Markdown
NameTypeReqDescription
dry_runbooleanyesTrue when nothing was written; the result describes what would have been
escaped_commandsnull|arrayyesLines GitLab would have run as quick actions, sent with a leading backslash so they show as text
notesnull|arrayyes–
outcomestringyespublished or dry_run
publishedintegeryesDrafts that were published
remainingintegeryesYour drafts still unpublished, read after the call
reviewer_statestringyesThe reviewer state sent, empty when none
summarybooleanyesTrue when a summary comment was sent with the review
targetobjectyes–
would_sendnull|objectyesThe request a dry run did not send; null when something was written

No examples provided.

subscribe ~223

Subscribe yourself to an issue's or a merge request's notifications, or unsubscribe with unsubscribe: true. You are already subscribed, until you unsubscribe, to what you created, are assigned to or asked to review, commented on, reacted to, changed in a way GitLab notes, or are @-mentioned in. The result says whether you are subscribed, and says unchanged when you already were so. On a merge request GitLab allows it only to a Developer or higher, or its author or an assignee. Only you see your subscriptions.

NameTypeReqDescription
dry_runboolean–Return what would be sent, and whether you are subscribed now, without writing anything
iidintegeryesThe number in its project: the number shown as #12 for issues and !12 for merge requests; not the global id
projectinteger|stringyesThe project: its numeric id, its full path such as group/sub/project, or its web URL
typestringyesissue or merge_request
unsubscribeboolean–Unsubscribe instead of subscribing
NameTypeReqDescription
dry_runbooleanyesTrue when nothing was written; the result describes what would have been
escaped_commandsnull|arrayyesLines GitLab would have run as quick actions, sent with a leading backslash so they show as text
iidintegeryes–
notesnull|arrayyes–
outcomestringyessubscribed, unsubscribed, unchanged (it already was so) or dry_run
subscribedbooleanyesWhether you are subscribed after the call, as GitLab answered; in a dry run, as read now
targetobjectyes–
typestringyesissue or merge_request
web_urlstringyes–
would_sendnull|objectyesThe request a dry run did not send; null when something was written

No examples provided.

track_time ~593

Set or reset the time estimate of an issue or a merge request, and add or reset its time spent: estimate or reset_estimate, add_spent or reset_spent, at least one. updated_at from your latest read is required, and the call is refused [stale] if the item changed since; adding or resetting spent time also needs total_time_spent from that read, since GitLab does not move updated_at when spent time is added or reset. Adding or resetting spent time is never repeated after a lost answer; the result then says what a read of the total shows. The result gives the time stats before and after, as read back, and says so when nothing changed. GitLab records each change as a note on the item. The result names the project's visibility: in a public project, what is written is public.

NameTypeReqDescription
add_spentstring–Add this duration to the time spent, in the same form as estimate; a leading minus, such as -30m, subtracts, down to zero at most
dry_runboolean–Return what would be sent without writing anything
estimatestring–Set the estimate to this duration, such as 3h30m, 1w 2d or 1.5 (hours). Units mo, w, d, h and m; 1mo is 4w, 1w is 5d, 1d is 8h
iidintegeryesThe number in its project: the number shown as #12 for issues and !12 for merge requests; not the global id
projectinteger|stringyesThe project: its numeric id, its full path such as group/sub/project, or its web URL
reset_estimateboolean–Remove the estimate
reset_spentboolean–Set the time spent back to zero
total_time_spentnull|integer–Required with add_spent or reset_spent: the seconds spent as your latest read gave them, time_stats.total_time_spent of get_issue or get_merge_request or total_time_spent of track_time. GitLab does n…
typestringyesissue or merge_request
updated_atstringyesThe updated_at of your latest read of it, as get_issue or get_merge_request returned it. The write is refused [stale] if it changed since. A [stale] refusal is NOT a retry signal: read it again and d…
NameTypeReqDescription
afternull|objectyesThe time stats read back after the write; null on a dry run
beforeobjectyesThe time stats read before the write
changednull|arrayyestime_estimate and total_time_spent when they differ after the write, as read back
dry_runbooleanyesTrue when nothing was written; the result describes what would have been
escaped_commandsnull|arrayyesLines GitLab would have run as quick actions, sent with a leading backslash so they show as text
iidintegeryes–
notesnull|arrayyes–
outcomestringyesupdated, unchanged or dry_run
sentnull|arrayyesThe time tracking requests sent, in order, such as add_spent_time 30m; empty when none was needed
targetobjectyes–
total_time_spentintegeryesThe seconds spent now, as GitLab reported them; pass it as total_time_spent to the next track_time that adds or resets spent time
typestringyesissue or merge_request
updated_atnull|stringyesAs read after the write, or before it when nothing was sent; pass it as updated_at to the next track_time or update
web_urlstringyes–
would_sendnull|objectyesThe request a dry run did not send; null when something was written

No examples provided.

unlink_issues ~170

Remove the link between two issues. With no link between them, the result is unchanged. The result names the project's visibility: in a public project, what is written is public.

NameTypeReqDescription
dry_runboolean–Return what would be sent without writing anything
iidintegeryesThe first issue's number in its project: the number shown as #12 for issues and !12 for merge requests; not the global id
projectinteger|stringyesThe project the first issue is in: its numeric id, its full path such as group/sub/project, or its web URL
target_iidintegeryesThe other issue's number in its project
target_projectinteger|string–The project the other issue is in; the first issue's project when omitted
NameTypeReqDescription
dry_runbooleanyesTrue when nothing was written; the result describes what would have been
escaped_commandsnull|arrayyesLines GitLab would have run as quick actions, sent with a leading backslash so they show as text
iidintegeryes–
link_idintegeryesThe link's id; 0 when there is none
link_typestringyesrelates_to, blocks or is_blocked_by, from the first issue's side
notesnull|arrayyes–
outcomestringyeslinked, unlinked, unchanged or dry_run
targetobjectyes–
target_iidintegeryes–
target_projectobjectyes–
would_sendnull|objectyesThe request a dry run did not send; null when something was written

No examples provided.

update_comment ~421

Replace the text of one of your own comments on an issue or a merge request, keeping it where it is: in its thread, with its replies, on its diff line. Another person's comment is refused [blocked], even where GitLab would allow it. updated_at from your read is required, and the call is refused [stale] if the comment changed since. The result counts what the old text lost and gives the new updated_at. Anyone the new text newly mentions is notified. A quick-action line in the body refuses the call unless escape_commands is true. The result names the project's visibility: in a public project, what is written is public.

NameTypeReqDescription
bodystringyesThe comment's new text, in Markdown, replacing the old one whole; the result counts what it removed
dry_runboolean–Check the comment and return what would be sent, and what the quick-action guard would do to the text, without writing anything
escape_commandsboolean–GitLab runs a line starting with a slash, such as /close or /merge, as a command, in an edit too. By default such a line refuses the call; true sends each one as plain text instead, with a leading ba…
iidintegeryesThe number in its project: the number shown as #12 for issues and !12 for merge requests; not the global id
note_idintegeryesThe comment's id, as list_discussions or add_comment gave it
projectinteger|stringyesThe project: its numeric id, its full path such as group/sub/project, or its web URL
typestringyesissue or merge_request
updated_atstringyesThe comment's updated_at as list_discussions or the last update_comment returned it. The edit is refused [stale] if it changed since. A [stale] refusal is NOT a retry signal: read the comment again b…
NameTypeReqDescription
body_removednull|objectyesWhat replacing the text took out; null when it was not replaced
dry_runbooleanyesTrue when nothing was written; the result describes what would have been
escaped_commandsnull|arrayyesLines GitLab would have run as quick actions, sent with a leading backslash so they show as text
iidintegeryes–
note_idintegeryes–
notesnull|arrayyes–
outcomestringyesupdated, unchanged or dry_run
targetobjectyes–
typestringyesissue or merge_request
updated_atnull|stringyesPass as updated_at to the next update_comment; null for a dry run
would_sendnull|objectyesThe request a dry run did not send; null when something was written

No examples provided.

update_issue ~608

Change an issue. Only the fields given change; labels and assignees are added and removed, never replaced by a list. updated_at from your latest read is required, and the call is refused [stale] if the issue changed since. The result reports the labels before and after, the fields that changed as GitLab read them back, and says so when nothing did. A quick-action line in the description refuses the call unless escape_commands is true. The result names the project's visibility: in a public project, what is written is public. When the client can ask, the server also asks the person before it makes a confidential issue public; a call they do not confirm is [blocked], changes nothing, and is not to be made again unless they ask.

NameTypeReqDescription
add_assigneesnull|array–Usernames to assign, beside those already assigned
add_labelsnull|array–Label names to add, exactly as they exist; other labels stay
clear_due_dateboolean–Remove the due date
clear_milestoneboolean–Remove the milestone
confidentialnull|boolean–true makes the issue confidential; false makes a confidential issue public, which needs GITLAB_MCP_ENABLE_SHIP=true
descriptionnull|string–A new description, replacing the old one whole; the result counts what it removed
dry_runboolean–Return what would be sent, and what the quick-action guard would do to the text, without writing anything
due_datenull|string–A new due day, YYYY-MM-DD
escape_commandsboolean–GitLab runs a line starting with a slash, such as /close or /merge, as a command. By default such a line refuses the call; true sends each one as plain text instead, with a leading backslash that ren…
iidintegeryesThe issue's number in its project: the number shown as #12 for issues and !12 for merge requests; not the global id
milestonenull|string–A milestone's exact title, in the project or its groups
projectinteger|stringyesThe project: its numeric id, its full path such as group/sub/project, or its web URL
remove_assigneesnull|array–Usernames to unassign
remove_labelsnull|array–Label names to remove; other labels stay
statestring–close or reopen
titlenull|string–A new title
updated_atstringyesThe updated_at of your latest read of it, as get_issue or get_merge_request returned it. The write is refused [stale] if it changed since. A [stale] refusal is NOT a retry signal: read it again and d…
NameTypeReqDescription
assigneesnull|arrayyesUsernames
changednull|arrayyesThe fields whose value differs after the write, as GitLab reported it
confidentialbooleanyes–
description_removednull|objectyesWhat replacing the description took out; null when it was not replaced
dry_runbooleanyesTrue when nothing was written; the result describes what would have been
due_datestringyes–
escaped_commandsnull|arrayyesLines GitLab would have run as quick actions, sent with a leading backslash so they show as text
iidintegeryes–
labelsnull|arrayyesThe labels GitLab reported after the write
labels_beforenull|arrayyesThe labels before an update; empty for a create
milestonenull|objectyes–
notesnull|arrayyes–
outcomestringyescreated, updated, unchanged or dry_run
statestringyes–
targetobjectyes–
updated_atnull|stringyesPass as updated_at to the next update_issue
web_urlstringyes–
would_sendnull|objectyesThe request a dry run did not send; null when something was written

No examples provided.

Install

How do I install the io.github.mmedum/gitlab-mcp server?

io.github.mmedum/gitlab-mcp ships as an MCPB bundle, a single file you download and open in an MCP host that supports MCPB bundles, such as Claude Desktop. The host reads the launch command from the bundle's own manifest, so there is no command to copy. Before opening it, check the file's SHA-256 matches the one the MCP registry declares for it, 57fb41d1cbfc831e16650d3d338a59dbb42b0af840a84775f75a76d83fcbdce7; the commands to do that are on this page. If it does not match, do not open it.

mcpb · gitlab-mcp_2.4.0.mcpb

Download bundle

Check the download matches the SHA-256 the MCP registry declares before you open it. If it does not match, do not open the file.

SHA-256

57fb41d1cbfc831e16650d3d338a59dbb42b0af840a84775f75a76d83fcbdce7

macOS / Linux

echo "57fb41d1cbfc831e16650d3d338a59dbb42b0af840a84775f75a76d83fcbdce7  gitlab-mcp_2.4.0.mcpb" | shasum -a 256 -c

Windows (PowerShell)

(Get-FileHash -Algorithm SHA256 .\gitlab-mcp_2.4.0.mcpb).Hash -eq "57fb41d1cbfc831e16650d3d338a59dbb42b0af840a84775f75a76d83fcbdce7"

Run it in the folder you saved the bundle to, then open the file with an MCPB-capable host such as Claude Desktop.

Common questions

What is the io.github.mmedum/gitlab-mcp server?

io.github.mmedum/gitlab-mcp is listed in the public MCP registry as io.github.mmedum/gitlab-mcp. GitLab over MCP from your own account: issues, merge requests, reviews, the repository and CI. This page covers its MCPB bundle (https://github.com/mmedum/gitlab-mcp/releases/download/v2.4.0/gitlab-mcp_2.4.0.mcpb).

Is the io.github.mmedum/gitlab-mcp server safe to use?

io.github.mmedum/gitlab-mcp scores 59 out of 100 on VerifyMCP. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the io.github.mmedum/gitlab-mcp server expose?

io.github.mmedum/gitlab-mcp exposes 63 tools: add_comment, add_review_comment, add_todo, cherry_pick_commit, compare_mr_versions, and 58 more. Their descriptions and schemas cost roughly 17,469 tokens of context every time the server is loaded.

What licence is the io.github.mmedum/gitlab-mcp server under?

io.github.mmedum/gitlab-mcp declares the Apache-2.0 licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.