Tools Overview
- Catalog-first
- Three surfaces
- Typed schemas
GitLab MCP Server exposes GitLab operations as MCP tools that AI assistants can invoke directly. It offers three tool modes: dynamic, meta-tool, and individual. All three reach the same GitLab API surface. They differ only in packaging, so the choice trades context cost against tool-list granularity — never capability.
Every mode is projected from one canonical action catalog. That gives all three identical handlers, typed schemas, and safety rules, apart from how a destructive call is confirmed. Otherwise only the presentation changes. Dynamic mode searches and executes canonical domain.action IDs. Meta-tool mode groups actions by domain. Individual mode registers one tool per operation.
Which tool mode should I use?
Section titled “Which tool mode should I use?”Dynamic mode is the default, and the right choice for most assistants. It keeps two tools in the model’s context and still reaches every GitLab operation. Choose meta-tool mode when your client works better with a fixed, domain-level tool list. Choose individual mode only when a client needs every operation enumerated up front.
| Mode | Public tools exposed | Best for | Relative token cost |
|---|---|---|---|
| Dynamic (default) | 2: gitlab_find_action, gitlab_execute_action | Most assistants; lowest context overhead | Lowest |
| Meta-tool | 34 on Free/CE, 40 on self-managed Premium, up to 52 on Ultimate | A fixed, discoverable, domain-level tool list | Medium |
| Individual | 868 on Free/CE, 1022 on self-managed Premium, up to 1094 on Ultimate | Clients that need every operation pre-listed | Highest |
Set the mode with the GITLAB_MCP_TOOL_SURFACE environment variable (dynamic, meta, or individual). Dynamic mode is used when GITLAB_MCP_TOOL_SURFACE is unset.
Operating modes
Section titled “Operating modes”How does individual mode work?
Section titled “How does individual mode work?”Individual mode registers one MCP tool per GitLab operation: 868 tools on Free/CE, 1022 tools on self-managed Premium, 1088 tools on self-managed Ultimate, or 1094 tools on GitLab.com Ultimate, where Orbit is available. This gives an AI assistant maximum granularity (every operation is a distinct, individually described tool) at the cost of significant context tokens spent listing and disambiguating tools during discovery.
Each tool requires exactly the parameters its action requires on the meta-tool and dynamic surfaces, which follow what GitLab requires of the request the action sends, apart from a few the server fills in itself, keeps required so it never sends a null in place of a value, or asks for as a choice of two, such as a member named by user_id or username. A parameter GitLab fills in when it is left out, such as the link_type of an issue link, is optional in every mode, and one GitLab cannot do without, such as the commit sha of a cherry-pick, is required in every mode.
- What it exposes
one visible MCP tool per GitLab operation, each with its own typed input and output schema — the whole catalog, flat.
- Requires
GITLAB_MCP_TOOL_SURFACE=individual, and a client with the context budget to hold the full tool list.- Tier effect
the tool count itself moves with the licence: Free/CE registers the base catalog, Premium and Ultimate add their gated tools, and lower tiers never see higher-tier input fields in the schemas.
- What it does not do
low-token startup: listing every tool is the point of this surface, so the discovery cost cannot be reduced without changing surface. Clients with small context windows should use the dynamic default instead.
How does meta-tool mode work?
Section titled “How does meta-tool mode work?”Meta-tool mode (GITLAB_MCP_TOOL_SURFACE=meta) consolidates related operations into domain-level meta-tools. Each meta-tool accepts an action parameter that routes to the appropriate handler, reducing the tool count to 34 meta-tools on Free/CE, 40 on self-managed Premium, 51 on self-managed Ultimate, or 52 on GitLab.com Ultimate, where Orbit is available. This dramatically improves token efficiency over individual mode while keeping a fixed, browsable tool list.
{ "tool": "gitlab_issue", "arguments": { "action": "create", "params": { "project_id": "my-group/my-project", "title": "Fix login redirect", "description": "Users are redirected to 404 after login", "labels": ["bug", "priority::high"] } }}- What it exposes
one dispatcher tool per domain (projects, issues, merge requests, pipelines…), each routing an
actionparameter to the same handlers the other surfaces use.- Requires
GITLAB_MCP_TOOL_SURFACE=meta. Per-action call shapes stay discoverable throughgitlab://toolsandgitlab://tools/{id}whateverGITLAB_MCP_META_PARAM_SCHEMAis set to.- Tier effect
Premium/Ultimate add dedicated enterprise meta-tools and give seven base dispatchers more actions:
gitlab_project,gitlab_group,gitlab_issue,gitlab_merge_request,gitlab_environment,gitlab_storage_moveandgitlab_runner.- What it does not do
each action’s exact parameter schema in
tools/listunder the defaultopaquemode: a dispatcher’s description carries a line of guidance per action, and an assistant reads the exact schema from the catalog resources (gitlab://tools/{id}) unlessGITLAB_MCP_META_PARAM_SCHEMAiscompactorfull.
How does the dynamic toolset work?
Section titled “How does the dynamic toolset work?”Dynamic mode (GITLAB_MCP_TOOL_SURFACE=dynamic) is the low-token default. It exposes only two public tools — gitlab_find_action and gitlab_execute_action (the singular gitlab_execute_action name is intentional) — while keeping every GitLab action reachable through the canonical catalog. The assistant first finds an action and its exact schema, then executes the canonical domain.action ID.
Because all three modes share the canonical action catalog, the safety rules come from one place: read-only filtering, safe mode, token-scope filtering, the destructive classification, schemas, and result formatting are the same on every surface. How a destructive call is confirmed differs in one way: the dynamic surface never prompts, so it needs confirm: true on every one unless GITLAB_MCP_YOLO_MODE skips the confirmation, as it does on every surface, which Destructive actions explains.
- What it exposes
two tools —
gitlab_find_actionandgitlab_execute_action— reaching the full canonical catalog: find returns exact schemas, execute runs the canonicaldomain.action.- Requires
- nothing: it is the default when
GITLAB_MCP_TOOL_SURFACEis unset.GITLAB_MCP_CAPABILITY_SURFACE=minimalshrinks the shared resource/prompt footprint further. - Tier effect
invisible in
tools/list(always two tools) but real in reach: find only surfaces, and execute only accepts, the actions the resolved tier registers.- What it does not do
a browsable tool list: the client sees two tools, so a human scanning
tools/listlearns nothing about coverage — that is whatgitlab://toolsand the find tool are for.
Tool naming convention
Section titled “Tool naming convention”All tools follow a consistent naming pattern:
- Individual tools: the prevailing form is
gitlab_{domain}_{action}(e.g.,gitlab_issue_create,gitlab_project_list), domain first; a legacy set is verb first instead (gitlab_list_issue_discussions,gitlab_add_ssh_key), and each name is declared in the action’s catalog spec rather than derived, so read it fromgitlab://toolsinstead of inferring it - Meta-tools:
gitlab_{domain}(e.g.,gitlab_issue,gitlab_project) - Dynamic actions: canonical
domain.actionIDs executed throughgitlab_execute_action(e.g.,issue.create,merge_request.list)
Base meta-tools (34)
Section titled “Base meta-tools ()”The 34 tools a Free/CE instance serves are 28 domain dispatchers, the gitlab_server diagnostics tool and five tools that take their arguments directly. Premium and Ultimate add actions to seven of these dispatchers; the number of actions each one has on each tier is in Meta-tools.
Project management
Section titled “Project management”| Meta-tool | Description | Key Actions |
|---|---|---|
gitlab_project | Projects with their settings, forks, stars, members, labels, milestones, boards, badges, webhooks, integrations, uploads, export and import, push mirrors, Pages and service accounts; approval rules, pull mirroring and push rules from Premium | list, get, create, update, delete, fork, star, archive, label_*, milestone_*, members, badge_*, upload |
gitlab_issue | Issue lifecycle with notes, discussions, links, work items (including work item types) and saved views, statistics, time tracking, award emoji and resource events; iterations from Premium | list, get, create, update, delete, note_*, link_*, discussion_*, work_item_*, time_* |
gitlab_group | Groups and subgroups with their members, labels, milestones, boards, badges, uploads, export and import, sharing, transfer, descendant projects and service accounts; epics, wikis, webhooks, protected branches, LDAP and SAML from Premium | list, get, create, update, delete, group_label_*, group_milestone_*, group_member_*, badge_* |
gitlab_user | Users and the current user: status, SSH and GPG keys, emails, activity, memberships, notification settings, namespaces, to-do items, impersonation and personal access tokens, user administration, and instance service accounts | get, current, list, ssh_keys, add_ssh_key, gpg_keys, emails, get_status, set_status, todo_*, list_service_accounts |
gitlab_wiki | Project wiki pages and attachments (group wikis are actions on gitlab_group) | list, get, create, update, delete, upload_attachment |
Code & repository
Section titled “Code & repository”| Meta-tool | Description | Key Actions |
|---|---|---|
gitlab_branch | Branch management and protection rules (including branch rule queries via GraphQL) | list, get, create, delete, protect, unprotect, rule_list |
gitlab_tag | Tag management, protection rules, and X.509 tag signatures (get_signature) | list, get, create, delete, protect, unprotect, get_signature |
gitlab_release | Release management and release asset links | list, get, create, update, delete, link_* |
gitlab_repository | Repository tree, files and their history, commits with their discussions, statuses and signatures, diffs, blame, compare (including cross-project), cherry-pick, revert, contributors, submodules, archives, changelogs, markdown | tree, compare, blob, archive, changelog_*, file_*, commit_*, commit_discussion_*, list_submodules, markdown_render |
gitlab_merge_request | MR lifecycle, approvals, pipelines, time tracking, subscriptions, context commits, award emoji and resource events; approval rules, approval settings and dependencies from Premium | list, get, create, update, merge, rebase, approve, approval_*, time_*, emoji_mr_*, event_mr_* |
Code review
Section titled “Code review”| Meta-tool | Description | Key Actions |
|---|---|---|
gitlab_mr_review | MR notes, threaded discussions, code diffs, draft notes, and diff versions | note_*, discussion_*, draft_note_*, changes_get, raw_diffs, diff_version_* |
| Meta-tool | Description | Key Actions |
|---|---|---|
gitlab_pipeline | Pipeline management, resource groups, test reports, trigger tokens, and pipeline schedules | list, get, create, cancel, retry, delete, wait, schedule_*, trigger_* |
gitlab_job | CI job management, artifacts, logs, pipeline bridges, and the CI job token scope (force cancel supported) | list, get, play, cancel, retry, erase, trace, artifacts, wait, token_scope_* |
gitlab_runner | CI/CD runners, their registration and authentication tokens, runner managers and jobs; runner controllers with their scopes and tokens from Ultimate | list, get, update, remove, jobs, controller_*, register, verify |
gitlab_ci_variable | CI/CD variables at instance, group, and project scope | list, get, create, update, delete (at each scope level) |
gitlab_environment | Environments, deployment records with their approvals and merge requests, and deploy freeze periods; protected environments from Premium | list, get, create, update, delete, stop, deployment_*, freeze_* |
Search & analysis
Section titled “Search & analysis”| Meta-tool | Description | Key Actions |
|---|---|---|
gitlab_search | Cross-resource search across projects, groups, and global scope | code, issues, merge_requests, commits, milestones, notes, projects, snippets, users, wiki |
Access & credentials
Section titled “Access & credentials”| Meta-tool | Description | Key Actions |
|---|---|---|
gitlab_access | Deploy keys, deploy tokens, project, group and personal access tokens with their rotation, access requests, and invites | deploy_key_*, deploy_token_*, token_project_*, token_group_*, token_personal_*, invite_* |
gitlab_admin | Instance administration: settings, appearance, license, broadcast messages, instance feature flags, system hooks, Sidekiq metrics, plan limits, topics, OAuth applications, custom attributes, usage data, imports, error tracking, alert metric images, secure files, Terraform states, cluster agents and the dependency proxy. Needs a token with admin_mode | sidekiq_*, settings_*, license_*, broadcast_message_*, system_hook_*, feature_* |
Packages & content
Section titled “Packages & content”| Meta-tool | Description | Key Actions |
|---|---|---|
gitlab_package | Package registry, container registry, and generic package publish/download | list, group_list, delete, publish, download, file_*, registry_*, protection_rule_* |
gitlab_snippet | Project and personal snippets with discussions, notes, and award emoji | list, get, create, update, delete, discussion_*, note_* |
gitlab_template | Project templates (gitignores, CI YAML, Dockerfiles, licenses) and CI linting | gitignore_*, ci_yml_*, dockerfile_*, license_*, project_template_*, lint |
Discovery & utilities
Section titled “Discovery & utilities”| Meta-tool | Description | Key Actions |
|---|---|---|
gitlab_feature_flags | Feature flag and feature flag user list management | feature_flag_*, ff_user_list_* |
gitlab_model_registry | ML model package file download from GitLab Model Registry | download |
gitlab_ci_catalog | CI/CD Catalog resource discovery (reusable components, templates) | list, get |
gitlab_custom_emoji | Group-level custom emoji management via GraphQL | list, create, delete |
gitlab_achievement | Achievements a group or project namespace defines and the awards made from them, via GraphQL | list, create, update, delete, award, revoke, recipients, user_list |
gitlab_storage_move | Repository storage moves of projects and snippets on every tier (12 actions); group storage moves add 6 more from Premium. Needs a token with admin_mode | retrieve_*, get_*, schedule_* |
Five more tools are registered alongside the dispatchers. They take their parameters directly, with no action envelope, and keep the same names in individual mode:
| Tool | Description |
|---|---|
gitlab_discover_project | Resolve a full git remote URL to a GitLab project ID and metadata |
gitlab_interactive_issue_create | Guided issue creation through MCP elicitation |
gitlab_interactive_mr_create | Guided merge request creation through MCP elicitation |
gitlab_interactive_project_create | Guided project creation through MCP elicitation |
gitlab_interactive_release_create | Guided release creation through MCP elicitation |
Enterprise-only tools
Section titled “Enterprise-only tools”When the resolved tier is Premium or Ultimate, the server registers up to 17 additional self-managed meta-tools for GitLab Premium and Ultimate features. Six arrive with Premium, for 40 meta-tools (the action count of each is in parentheses):
gitlab_audit_event (6), gitlab_enterprise_user (4, needs admin_mode), gitlab_geo (8, needs admin_mode), gitlab_group_scim (4), gitlab_merge_train (4), gitlab_project_alias (4, needs admin_mode)
Eleven more arrive with Ultimate, for 51 on a self-managed instance:
gitlab_attestation (2), gitlab_compliance_policy (2), gitlab_dependency (4), gitlab_dora_metrics (2), gitlab_external_status_check (8), gitlab_member_role (6), gitlab_security_attribute (5), gitlab_security_category (3), gitlab_security_finding (1), gitlab_security_scan_profile (3), gitlab_vulnerability (8)
On GitLab.com with a Premium or Ultimate tier, the catalog also registers gitlab_orbit with six read-only Knowledge Graph actions: status, schema, tools, dsl, query, and graph_status. That makes 52 meta-tools on GitLab.com Ultimate.
A group that needs admin_mode is left out for a token without that scope (Scope-based tool filtering). What the two tiers add to the base dispatchers is listed under Enterprise mode.
Frequently asked questions
What is the difference between meta-tool mode and dynamic mode?
Both meta-tool and dynamic mode reduce token cost compared with individual mode, but they package operations differently. Meta-tool mode exposes a fixed list of tools (34 on Free/CE, up to 52 on GitLab.com Ultimate), most of them domain-level tools routing on an action parameter, useful when a client works best with a stable, browsable tool list. Dynamic mode exposes only two tools and resolves operations on demand through search, giving the smallest possible tool list. Both share the same handlers and safety rules, apart from how a destructive call is confirmed.
Do all modes support the same GitLab operations?
Yes. Dynamic, meta-tool, and individual modes are all projected from one canonical action catalog, so they cover the same GitLab REST and GraphQL operations. They differ in packaging, not capability. Read-only filtering, safe mode, the destructive classification, token-scope filtering, and result formatting are shared by every mode. How a destructive call is confirmed is the one difference: the default dynamic surface never prompts, so it needs confirm: true on every one unless GITLAB_MCP_YOLO_MODE skips the confirmation, as it does on every surface.
How many tools does each mode expose?
Individual mode exposes 868 tools on Free/CE, 1,022 on self-managed Premium, 1,088 on self-managed Ultimate and 1,094 on GitLab.com Ultimate, where Orbit is available. Meta-tool mode exposes 34 tools on Free/CE, 40 on self-managed Premium, 51 on self-managed Ultimate and 52 on GitLab.com Ultimate. Dynamic mode always exposes exactly two public tools, regardless of how many GitLab operations are available.
Do Enterprise tools require a paid GitLab license?
Yes. Enterprise meta-tools, such as merge trains, DORA metrics, vulnerabilities, and compliance policies, require a GitLab Premium or Ultimate license on the connected instance. Forcing the Enterprise catalog on a Community Edition instance registers the tools, but the underlying API calls fail: Community Edition does not serve those endpoints and answers 404, and an unlicensed Enterprise Edition refuses them.
What are the three tool modes in GitLab MCP Server?
GitLab MCP Server offers three tool modes that expose the same GitLab API surface with different packaging. Dynamic mode (the default) exposes two public tools that search and execute a canonical action catalog. Meta-tool mode groups related operations into domain-level tools that route on an action parameter. Individual mode registers one MCP tool per GitLab operation. All three modes share identical handlers, typed schemas, and safety rules, apart from how a destructive call is confirmed.
Which tool mode is the most token-efficient?
Dynamic mode is the most token-efficient because it exposes only two public tools regardless of how many GitLab operations exist. The assistant first calls gitlab_find_action to retrieve an action and its schema, then calls gitlab_execute_action. This keeps the tool list small in the model's context window while still reaching every GitLab operation through the shared action catalog.
Further reading
Section titled “Further reading”- Tools by domain: every action of every catalog group, with its parameters and the tier it needs
- Meta-tools — detailed meta-tool architecture and usage
- Dynamic toolset: the low-token find and execute mode
- Orbit — GitLab.com Premium/Ultimate Knowledge Graph tools
- Resources & Prompts — read-only context and prompt templates
- Output format: what a tool result carries, in Markdown and in JSON
- Command line and environment variables: every setting that picks a surface, a tier or a filter
External references
Section titled “External references”- Model Context Protocol specification — the protocol these tools implement
- GitLab REST API v4 — the REST surface most tools call
- GitLab GraphQL API — the GraphQL surface used by the remaining domains