Atlas / MCP servers / structured-world / gitlab-mcp

gitlab-mcpCAUTION

mcp/structured-world/gitlab-mcp

GitLab MCP server — issues, merge requests, pipelines, code search. 80+ tools.

Verdict
CAUTION
Grade
C
Trust score
78 /100
Exposed tools
145 117r · 17w · 11d
Transport
sse · stdio · streamable-http
License
Apache-2.0
Stars
7
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

[](https://www.npmjs.com/package/@structured-world/gitlab-mcp) [](https://www.npmjs.com/package/@structured-world/gitlab-mcp) [](./LICENSE) [](https://github.com/structured-world/gitlab-mcp/actions) [](https://codecov.io/gh/structured-world/gitlab-mcp) [](https://gitlab-mcp.sw.foundation/coverage/)

Advanced GitLab MCP server — 58 CQRS tools exposing 231 GitLab operations across 26 entity types. The tool catalog and parameters are filtered to each instance's GitLab version, tier, and token scopes, so the agent sees only what the connected instance actually supports.

[](https://gitlab-mcp.sw.foundation/downloads/gitlab-mcp-10.1.0.mcpb) [](vscode:mcp/install?%7B%22name%22%3A%22gitlab-mcp%22%2C%22command%22%3A%22npx%22%2C%22args%22%3A%5B%22-y%22%2C%22%40structured-world%2Fgitlab-mcp%22%5D%7D) [](vscode-insiders:mcp/install?%7B%22name%22%3A%22gitlab-mcp%22%2C%22command%22%3A%22npx%22%2C%22args%22%3A%5B%22-y%22%2C%22%40structured-world%2Fgitlab-mcp%22%5D%7D)

Packages

This is a monorepo with two npm packages:

  • **[@structured-world/gitlab-mcp](https:/
Read from source at commit ae74160da4f6OBSERVED · 2026-10-10
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.

claude-code (npm)
claude mcp add gitlab-mcp --env GITLAB_TOKEN=${GITLAB_TOKEN} -- npx -y @structured-world/[email protected]
03

Exposed tools (145)

117 read · 17 write · 11 destructive. Blast radius: 11 tools can delete or overwrite — an agent that can be talked into calling a tool can be talked into calling this one.

ToolRiskDescription
ASSIGNEESreadAssignee widget
CUSTOM_FIELDSreadCustom fields widget
CUSTOM_WIDGETreadCustom widget type
ContextreadRuntime session context management
CorereadProjects, namespaces, users, events
DESCRIPTIONreadDescription widget
DeveloperreadStandard development workflow (issues, MRs, pipelines)
EMPTY_WIDGETreadEmpty widget
IntegrationsreadThird-party service integrations
IterationsreadSprint/iteration planning (Premium)
LABELSreadLabels widget
LabelsreadLabel browsing and management
MILESTONEreadMilestone widget
MembersreadTeam member management and access levels
MilestonesreadMilestone tracking and burndown charts
Read-OnlyreadRead-only access for monitoring and viewing
ReleasesreadRelease management and asset links
SearchreadGlobal, project, and group search
SnippetsreadCode snippet management
TodosreadPersonal notification queue management
WEIGHTreadWeight widget
WebhooksreadWebhook configuration and testing
WikireadWiki page browsing and editing
all_required_patterns_toolreadTool with all required parameter naming patterns
another_unknownreadPerform another_unknown operation
anyof_toolreadTool with anyOf schema
array_toolreadTool with array schema
browse_access_tokensreadInspect access tokens (CI/automation credentials). Actions: list_personal (the current user
browse_commitswriteExplore repository commit history and diffs. Actions: list (browse commits with filters), get (retrieve commit metadata and stats), diff (view code changes). Related: browse_refs for branch/tag info.
browse_contractreadContract fixture
browse_crossref_overridereadOriginal. Related: manage_something to do.
browse_crossref_testwriteBrowse items. Actions: list, get. Related: manage_crossref_test to modify.
browse_deny_testwriteBrowse items. Related: manage_deny_target to create.
browse_deploy_keyswriteList and inspect deploy keys (SSH keys granting repo access to CI/automation). Actions: list (a project’s keys, or all instance keys when project_id is omitted — admin only), get (a single project key by ID). Related: manage_deploy_key to add/enable/update/delete.
browse_eventsreadTrack GitLab activity and events. Actions: user (your activity across all projects), project (specific project activity feed). Filter by date range, action type, or target type.
browse_filesreadExplore project file structure and read source code. Actions: tree (list directory contents with recursive depth control), content (read file at specific ref/branch), download_attachment (get uploaded file by secret+filename). Related: manage_files to create/update files.
browse_integrationsreadDiscover active project integrations and their configuration. Actions: list (all active: Slack, Jira, Discord, Teams, Jenkins, etc.), get (specific integration settings by slug). Related: manage_integration to configure/disable.
browse_iterationsreadView group iterations for agile sprint planning. Actions: list (filter by state: current, upcoming, closed), get (retrieve specific iteration details). Related: browse_work_items for items in an iteration.
browse_job_token_scopereadInspect a project CI/CD job token inbound access scope. Actions: get (the inbound/outbound scope toggles), list_projects (projects allowed to reach this project via CI_JOB_TOKEN), list_groups (groups on the allowlist). Related: manage_job_token_scope to change the allowlist.
browse_labelsreadList and inspect project or group labels. Actions: list (all labels with search filtering), get (single label by ID or name). Related: manage_label to create/update/delete.
browse_merge_requestswriteBrowse MRs
browse_milestonesreadTrack milestone progress with associated issues and MRs. Actions: list (filter by state/title/search), get (milestone details), issues (items in milestone), merge_requests (MRs targeting milestone), burndown (chart data for sprint tracking). Related: manage_milestone to create/update.
browse_mr_discussionswriteRead discussion threads and draft review notes on merge requests. Actions: list (all threads with resolution status), drafts (unpublished draft notes), draft (single draft details). Related: manage_mr_discussion to comment, manage_draft_notes to create drafts.
browse_namespacesreadExplore GitLab groups and user namespaces. Actions: list (discover available namespaces), get (retrieve details with storage stats), verify (check if path exists). Related: manage_namespace to create/update/delete groups.
browse_no_relatedreadBrowse items without cross-refs. Actions: list, get.
browse_override_testwriteBrowse items. Related: manage_nonexistent to create.
browse_pipelinesreadBrowse pipelines
browse_projectsreadFind, list, or inspect GitLab projects. Actions: search (find by name/topic across GitLab), list (browse accessible projects or group projects), get (retrieve full project details). Related: manage_project to create/update/delete projects.
browse_readonly_testwriteBrowse items. Related: manage_readonly_test to create.
browse_refsreadInspect branches, tags, and their protection rules. Actions: list_branches, get_branch, list_tags, get_tag, list_protected_branches, get_protected_branch, list_protected_tags (protection details and access levels). Related: manage_ref to create/delete/protect, browse_commits for commit history.
browse_registryreadInspect the GitLab Container Registry. Actions: list_repositories (a project
browse_releasesreadView project releases and asset download links. Actions: list (releases sorted by date), get (release details by tag name), assets (download link list for release). Related: manage_release to create/publish.
browse_runnersreadInspect CI runners. Actions: list_all (every runner on the instance - admin), list_owned (the current user
browse_searchreadSearch across GitLab resources globally or within a scope. Actions: global (entire instance), project (within specific project), group (within specific group). Searchable: projects, issues, merge_requests, milestones, users, blobs (code), commits, wiki_blobs, notes.
browse_snippetsreadFind and read code snippets with versioning support. Actions: list (personal/project/public scope with filtering), get (snippet metadata or raw file content). Related: manage_snippet to create/update.
browse_testwriteBrowse test items. Actions: list, get. Related: manage_test to create/update.
browse_tierless_crossrefreadBrowse tierless items. Actions: list. Related: manage_tierless_crossref to modify.
browse_tierless_refwriteBrowse items. Related: manage_tierless_ref to modify.
browse_todosreadView your GitLab todo queue (notifications requiring action). Actions: list (filter by state, action type, target type). Todos are auto-created for assignments, mentions, reviews, and pipeline failures. Related: manage_todos to mark done/restore.
browse_usersreadFind GitLab users with smart pattern detection. Actions: search (find users by name/email/username with transliteration support), get (retrieve specific user by ID). Related: browse_members for project/group membership.
browse_variablesreadList and inspect CI/CD variables for projects or groups. Actions: list (all variables with pagination), get (single variable by key with environment scope filter). Related: manage_variable to create/update/delete.
browse_webhooksreadList and inspect webhook configurations for projects or groups. Actions: list (all webhooks with event types and status), get (webhook details by ID). Related: manage_webhook to create/update/delete/test.
browse_wikireadRead wiki pages in projects or groups. Actions: list (all pages with metadata), get (page content by slug). Related: manage_wiki to create/update/delete.
browse_with_refwriteBrowse items. Related: manage_with_ref to modify.
browse_work_itemsreadFind and inspect issues, epics, tasks, and other work items. Actions: list (groups return epics, projects return issues/tasks, filter by type/state/labels), get (by numeric ID or namespace+iid from URL path). Related: manage_work_item to create/update/delete.
complex_toolreadComplex tool with various schema types
core_readonlyreadCore readonly tool
core_tool_1readCore tool 1
createwriteCreate new item
custom_actionreadPerform custom_action operation
deletedestructiveDelete an item
detail_toolreadTool for detail testing
developerreadDeveloper preset
enum_toolreadTool with enum-only schema
error_toolreadError tool
example_toolreadTool with various parameter names
filterreadFilter by type | status | priority
flat_toolreadTool with flat schema
free_toolreadTool that requires free tier
full-featuredreadFull featured project
getreadGet single item
get_profilereadIdentify the GitLab account this connection uses: a stable account id, display name, email when GitLab provides it, and the username with its instance.
get_projectreadGet project details
labels_readonlyreadLabels readonly
labels_tool_1readLabels tool 1
listreadList all items
list_projectsreadCore tool description
manage_admin_onlyreadTool that requires active admin-mode elevation
manage_all_deniedreadTool whose only action is denied
manage_contextreadContext management tool
manage_crossref_testreadManage items.
manage_deny_targetreadManage items.
manage_draft_noteswriteCreate and manage unpublished review comments on merge requests. Actions: create (new draft), update (modify text), publish (make single draft visible), publish_all (submit entire review), delete (discard draft). Related: browse_mr_discussions action
manage_fileswriteCreate, update, or upload repository files. Actions: single (create/update one file with commit message), batch (atomic multi-file commit), upload (add attachment returning markdown link). Related: browse_files to read existing files.
manage_integrationwriteConfigure or disable project integrations (50+ supported). Actions: update (enable/modify with integration-specific config), disable (deactivate integration). Note: gitlab-slack-application requires OAuth install from GitLab UI. Related: browse_integrations for discovery.
manage_labeldestructiveCreate, update, or delete project/group labels. Actions: create (name + hex color required), update (modify properties), delete (remove permanently). Related: browse_labels for discovery.
manage_memberdestructiveAdd, remove, or update access levels for project/group members. Actions: add_to_project, add_to_group (with access level + optional expiry), remove_from_project, remove_from_group, update_project, update_group (change access level). Related: browse_members for current membership.
manage_merge_requestwriteManage MR
manage_milestonedestructiveCreate, update, or delete project/group milestones. Actions: create (title + optional dates/description), update (modify properties or close/activate), delete (remove permanently), promote (elevate project milestone to group). Related: browse_milestones for progress tracking.
manage_pipelinereadManage pipeline
manage_readonly_testreadManage items.
manage_refdestructiveCreate, delete, and protect branches and tags. Actions: create_branch (from ref), delete_branch, protect_branch (set allowed roles), unprotect_branch, update_branch_protection, create_tag (annotated or lightweight), delete_tag, protect_tag, unprotect_tag. Related: browse_refs for inspection.
manage_registrydestructiveDelete GitLab Container Registry repositories and tags. Actions: delete_repository (remove a whole repository), delete_tag (remove one tag), delete_tags_bulk (regex cleanup with keep_n/older_than retention - destructive). Related: browse_registry to inspect before deleting.
manage_releasedestructiveCreate, update, or delete project releases with asset management. Actions: create (release from tag with notes/assets), update (modify metadata), delete (remove release, tag preserved), create_link (add asset URL), delete_link (remove asset). Related: browse_releases for discovery.
manage_runnerreadRegister and control CI runners. Actions: create_authentication_token (register a runner, GitLab 16+, returns a one-time token), update (settings), pause/resume (toggle job pickup), delete, reset_authentication_token (rotate the token). Related: browse_runners to discover runners.
manage_snippetdestructiveCreate, update, or delete code snippets with multi-file support. Actions: create (new snippet with files and visibility), update (modify content/metadata, file operations), delete (remove permanently). Related: browse_snippets for discovery.
manage_tierless_crossrefreadManage tierless items.
manage_tierless_refreadManage items.
manage_todosreadManage your GitLab todo queue. Actions: mark_done (complete a single todo), mark_all_done (clear entire queue), restore (undo completion). Related: browse_todos to view your todo list.
manage_variabledestructiveCreate, update, or delete CI/CD variables with environment scoping. Actions: create (key + value, set scope/protection/masking), update (modify value or settings), delete (remove permanently). Related: browse_variables for discovery.
manage_vulnerabilityreadDrive the vulnerability state machine (Ultimate). Actions: dismiss (with optional dismissal_reason + comment), confirm (genuine finding), resolve (fixed), revert (back to detected). Related: browse_vulnerabilities to discover vulnerability IDs.
manage_webhookdestructiveCreate, update, delete, or test webhooks for event-driven automation. Actions: create (URL + event types + optional secret), update (modify settings), delete (remove), test (trigger delivery for specific event). Related: browse_webhooks for inspection.
manage_wikidestructiveCreate, update, or delete wiki pages. Actions: create (new page with title/content/format), update (modify content or title), delete (remove permanently). Related: browse_wiki to read pages.
manage_with_refreadManage items.
mixed_params_toolreadTool with both common and action-specific parameters
mixed_tier_toolreadTool with mixed tiers
mrs_toolreadMRS tool
my_actionreadMy action description
nativereadNative output
new-reporeadA new repository
no_params_toolreadTool with no parameters
no_params_verbose_toolreadTool with empty schema for verbose testing
no_req_toolreadd
oneof_toolreadTool with oneOf schema
partial_req_toolreadd
premium_toolreadTool that requires premium tier
readonlyreadRead-only preset
ref_toolreadTool with $ref schema
refinement_toolreadTool with schema refinements
searchreadSearch for items
sorted_params_toolreadTool with params that need sorting
specific_toolreadSpecific tool description
testreadPath is C:\\Users\\name
test_toolreadTest tool description
tool_admin_paramreadTool with an admin-gated param
tool_with_paramsreadTool with tier-gated params
ultimate_toolreadTool that requires ultimate tier
unannotated_toolreadno requirements
unavailable_toolreadUnavailable tool
unknown_type_toolreadTool with unknown schema type
unresolved_ref_toolreadTool with unresolved $ref
updatewriteUpdate item
updated-namereadNew description
v1.0.0readUpdated description with **markdown**
verbose_toolreadTool for verbose testing
04

Trust audit

CAUTIONgrade C · trust 78/100 Install with care. The audit found things worth knowing before you trust its output.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codeWARN
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfaceWARN
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (4 observation(s))
Network
declared (2 observation(s))
Shell
declared (5 observation(s))
Dependencies
not all pinned
Secrets in source
found

Findings (25)

MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
packages/gitlab-mcp/tests/unit/cli/docker/docker-utils.test.ts:1328
databaseUrl: 'postgresql://user:pa$word@host:5432/db',
MEDIUMFilesystem / path · mcp.destructive_tools · CWE-22, CWE-59
delete, manage_label, manage_member, manage_milestone, manage_ref, manage_registry, manage_release, manage_snippet, manage_variable, manage_webhook, manage_wiki
Why it matters. 11 tool(s) can delete or overwrite
Fix. prefer a read-only mode or scoped tokens; the page states the blast radius
LOWInventory / provenance · inv.hidden_file · CWE-1104
.coderabbit.yaml
.coderabbit.yaml
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
.release-please-manifest.json
.release-please-manifest.json
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
.yarnrc.yml
.yarnrc.yml
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
packages/gitlab-mcp/.prettierignore
.prettierignore
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
packages/gitlab-mcp/.prettierrc.json
.prettierrc.json
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInformation disclosure · disclose.log_secret · CWE-209, CWE-532
packages/gitlab-mcp/tests/integration/schemas/access-tokens.test.ts:128
console.log(`  rotated project token on ${testProjectPath}`);
LOWInformation disclosure · disclose.log_secret · CWE-209, CWE-532
packages/gitlab-mcp/tests/integration/schemas/access-tokens.test.ts:130
console.log(`  project-token lifecycle not permitted: ${(error as Error).message}`);
LOWInformation disclosure · disclose.log_secret · CWE-209, CWE-532
packages/gitlab-mcp/tests/integration/schemas/audit-events.test.ts:97
console.log(`  list_instance not available for this token: ${(error as Error).message}`);
LOWInformation disclosure · disclose.log_secret · CWE-209, CWE-532
packages/gitlab-mcp/tests/integration/schemas/runners.test.ts:130
console.log(`  list_all not available for this token: ${(error as Error).message}`);
LOWInformation disclosure · disclose.log_secret · CWE-209, CWE-532
packages/gitlab-mcp/tests/manual/test-all-transport-server.ts:34
console.log(`  Token: ${GITLAB_TOKEN ? '✅ Provided' : '❌ Missing'}`);
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
.github/workflows/release-please.yml:434
# package.json (../../) carries the mirrored release version.
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
.github/workflows/release-please.yml:439
git add package.json README.md server.json ../../README.md ../../package.json ../gitlab-mcp-db/README.md
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
packages/gitlab-mcp/scripts/prepare-release.sh:89
render_readme ../../README.md . .
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
packages/gitlab-mcp/src/cli/docker/oauth-issuer-prompt.ts:6
import { issuerValidationError } from '../../oauth/config';
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
packages/gitlab-mcp/src/cli/init/connection.ts:6
import { enhancedFetch, GitLabTimeoutError } from '../../utils/fetch';
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
packages/gitlab-mcp/tests/manual/fixtures/workflow-gitlab.mjs:184
url: `http://127.0.0.1:${server.address().port}`,
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
packages/gitlab-mcp/tests/unit/middleware/mcp-auth-routes.test.ts:31
baseUrl = `http://127.0.0.1:${(server.address() as AddressInfo).port}`;
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
packages/gitlab-mcp/tests/unit/oauth/config.test.ts:121
['http://127.0.0.1:3333/', 'http://127.0.0.1:3333'],
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
packages/gitlab-mcp/tests/unit/oauth/helpers/fake-gitlab.ts:57
return `http://127.0.0.1:${address.port}`;
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
packages/gitlab-mcp/tests/unit/oauth/helpers/mcp-oauth-server.ts:66
url: `http://127.0.0.1:${port}`,
LOWNetwork egress · net.tls_off · CWE-200, CWE-319
packages/gitlab-mcp/tests/unit/services/InstanceConnectionPool.test.ts:499
rejectUnauthorized: false,
Why it matters. certificate verification is disabled
Fix. leave verification on
LOWNetwork egress · net.tls_off · CWE-200, CWE-319
packages/gitlab-mcp/tests/unit/utils/fetch.coverage.test.ts:281
process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
Why it matters. certificate verification is disabled
Fix. leave verification on
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
package.json
nx
Why it matters. 1 dependency range(s) float
Fix. pin exact versions or ship a lockfile

Gates applied: no_behavioural_pass.

Audited 2026-10-10 · audit v0.4.1 · source sha ae74160da4f6full audit observations/trust-audit/mcp-server/structured-world__gitlab-mcp.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-10ae74160da4f6CAUTIONC78first audit
06

Questions

What is the gitlab-mcp MCP server?

GitLab MCP server — issues, merge requests, pipelines, code search. 80+ tools.

What tools does gitlab-mcp expose?

145 in total: 117 read-only, 17 that write, and 11 that can delete or overwrite (delete, manage_label, manage_member, manage_milestone, manage_ref). Every one is listed on this page with its risk.

Is gitlab-mcp safe to connect to an agent?

With care. The audit graded it C (78/100) and found 25 things worth knowing before you trust this server, listed below with the exact line each was found on. Separately from the audit: 11 of its tools can destroy data, so scope the token you give it to what you actually need.

What credentials does gitlab-mcp need?

It reads CORP_GITLAB_SECRET, GITLAB_AUTH_COOKIE_PATH, GITLAB_TOKEN, GITLAB_TOKEN_TEST, MISSING_SECRET, MISSING_TOKEN, MY_TOKEN, NODE_TLS_REJECT_UNAUTHORIZED, OAUTH_CLIENT, OAUTH_CLIENT_ID, OAUTH_CLIENT_SECRET and OAUTH_DEVICE_POLL_INTERVAL from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How does gitlab-mcp run?

It speaks sse, stdio and streamable-http, so it runs as a local process your client starts. It is published on npm as @structured-world/gitlab-mcp at 10.1.0.

How current is this page?

The grade is for one exact copy of the source (ae74160da4f6), read on 2026-10-10. The repository is watched and re-audited when it changes.

Advertisement