Skip to main content
Glama
mungowang
by mungowang

@mohou/gitlab-mcp

An MCP server and a CLI for a self-hosted GitLab CE 11.3.0 instance, built around the merge-request workflow: create, read the diff, comment on a line, reply, resolve, merge.

Two front ends, one core. The CLI has no tool list of its own - its subcommands and flags are derived from the same Zod schemas the MCP tools declare, so the two cannot drift.

Why this exists instead of glab or an existing MCP server

GitLab 11.3.0 was released in September 2018. Every maintained tool has moved on:

Tool

Why it does not work here

glab (official CLI)

Officially supports GitLab 16.0+; 15.x and earlier are explicitly unsupported

GitLab's official MCP server

Requires GitLab 18.3+ (/api/v4/mcp and OAuth dynamic client registration)

Community GitLab MCP servers

Written against the current API and GraphQL; against 11.3 they 404 or silently misbehave

The REST API v4 does exist on 11.3 and is complete enough for review work. What it lacks is everything newer, and this client is written against the 11.3 API documentation rather than against today's docs - see What 11.3 does not have.

Related MCP server: mcp-gitlab

Requirements

  • Node.js 22.6+ (the sources are TypeScript, run directly by Node's type stripping - there is no build step)

  • A GitLab personal access token with the api scope

Install

# as a dependency of something else
npm install @mohou/gitlab-mcp

# the MCP client launches the server through npx, so nothing must be installed first:
npx -y @mohou/gitlab-mcp

# the CLI, without installing anything globally:
npx -y --package @mohou/gitlab-mcp mohou-gitlab tools

The package ships two binaries: gitlab-mcp (the MCP server, named to match the package so that npx @mohou/gitlab-mcp finds it) and mohou-gitlab (the CLI).

From a source checkout - there is no build step, Node runs the TypeScript directly:

cd gitlab-mcp
npm install
npm test          # 89 offline tests against a mock GitLab 11.3

Configure

Variable

Meaning

GITLAB_BASE_URL

instance root, e.g. http://gitlab.example.com (not /api/v4)

GITLAB_TOKEN

personal access token, sent as the PRIVATE-TOKEN header

GITLAB_READ_ONLY

true registers only read-only tools, and the CLI refuses write subcommands

GITLAB_TIMEOUT_MS

request timeout, default 30000

GITLAB_MAX_RETRIES

retries for 429/502/503/504, default 2

GITLAB_TLS_REJECT_UNAUTHORIZED

false for a self-signed certificate

The token must be treated as a write credential: read_api does not exist before GitLab 12.10, so api is the narrowest scope that can read the API at all. Use a dedicated account, not a personal one.

Registering the MCP server

Any MCP client works; the server speaks stdio.

{
  "mcpServers": {
    "gitlab": {
      "command": "npx",
      "args": ["-y", "@mohou/gitlab-mcp"],
      "env": {
        "GITLAB_BASE_URL": "http://gitlab.example.com",
        "GITLAB_TOKEN": "glpat-xxxxxxxxxxxx"
      }
    }
  }
}

From a source checkout, point command at node and args at the absolute path to bin/gitlab-server.mjs instead.

In this harness (dsh), register it with the mini-app MCP tool instead of editing a file:

mini_app_mcp_add id=gitlab command=node args=["/path/gitlab-mcp/bin/gitlab-server.mjs"] env={GITLAB_BASE_URL:..., GITLAB_TOKEN:...}

Two things to know about that path:

  • ${credential:NAME} / ${env:NAME} placeholders are resolved for the one-off check but not for the live MCP client until the host restarts. Pass literal values, or register the row and restart once, then verify with mini_app_mcp_list.

  • The harness reaches the host over VPN. If the VPN is down, the first call fails with network error: fetch failed - is the VPN connected and the host reachable?.

CLI

export GITLAB_BASE_URL=http://gitlab.example.com
export GITLAB_TOKEN=glpat-xxxx

# installed: `mohou-gitlab ...`   |   without installing: `npx -y --package @mohou/gitlab-mcp mohou-gitlab ...`
node bin/gitlab.mjs tools                       # every tool, read-only ones marked
node bin/gitlab.mjs describe mr_comment_on_line # purpose and flags
node bin/gitlab.mjs whoami                      # proves base URL + token
node bin/gitlab.mjs mr_list --project group/app --state opened --per-page 10
node bin/gitlab.mjs mr_changes --project group/app --iid 12 --max-patch-chars 2000
node bin/gitlab.mjs mr_comment_on_line --project group/app --iid 12 \
    --path src/app.ts --line 42 --body "this branch is unreachable"
node bin/gitlab.mjs raw_api --method GET --path /projects/group%2Fapp/merge_requests
  • Tool names may be given in full or without the gitlab_ prefix (mr_list = gitlab_mr_list).

  • Flags are dashed and accept the schema spelling too: --source-branch and --source_branch are the same flag. --no-include-system sets a boolean false.

  • Output is JSON on stdout, diagnostics on stderr. Exit codes: 0 ok, 1 the call failed, 2 bad usage.

  • --host, --token, --token-file override the environment for one call (the token is removed from argv, so it does not appear in ps); --dry-run prints the request instead of sending it.

A review, end to end

gitlab_mr_list      {project, state:"opened"}                  # which MR
gitlab_mr_get       {project, iid}                             # state, merge_status, work_in_progress
gitlab_mr_changes   {project, iid, maxPatchChars:4000}          # files, counts, capped patches
gitlab_mr_discussions {project, iid, onlyUnresolved:true}       # what is still open
gitlab_mr_comment_on_line {project, iid, path, line, side, body}
gitlab_mr_reply     {project, iid, discussion_id, body}
gitlab_mr_resolve   {project, iid, discussion_id}
gitlab_mr_pipelines {project, iid}                             # the merge gate
gitlab_mr_merge     {project, iid, sha}                        # sha pins the source HEAD

gitlab_mr_comment_on_line is the tool that earns its keep. GitLab does not accept "file + line": a diff note needs the merge request's base/start/head SHAs and the old-side line number. This tool reads the newest diff version, reconstructs the hunk numbering, fills both line numbers in, and refuses locally when the line is not in the diff - naming the ranges that would have worked:

cannot place a comment at src/app.ts:99 (new side). src/app.ts: no commentable new-side line 99
(commentable new-side lines: 10-18). Lines that exist in the diff can be commented on;
use gitlab_mr_changes to see the diff.

Tools

Core tools (code, src/entities/):

Tool

R/W

Purpose

gitlab_whoami

ro

the authenticated user - the cheapest way to prove the token

gitlab_server_version

ro

which GitLab version is answering

gitlab_project_get / gitlab_project_search

ro

resolve a project path or id

gitlab_labels_list / gitlab_users_search

ro

label names, and the numeric user ids this API takes

gitlab_branches_list / gitlab_file_get

ro

branches; one file at a ref, capped

gitlab_mr_list / gitlab_mr_get

ro

find and read merge requests

gitlab_mr_changes

ro

per-file diff summary with capped patches

gitlab_mr_discussions

ro

threads, with each diff comment's file and line

gitlab_mr_pipelines / gitlab_mr_versions

ro

the merge gate; diff versions (debugging)

gitlab_mr_create / gitlab_mr_update

rw

create and edit, including the draft translation

gitlab_mr_comment

rw

a comment on the merge request itself

gitlab_mr_comment_on_line

rw

a diff comment on one line

gitlab_mr_reply / gitlab_mr_resolve

rw

continue a thread; resolve it

gitlab_mr_merge

rw

merge, with the failure modes explained

gitlab_raw_api

rw

any endpoint - the escape hatch

Declared extras (tools.d/gitlab-extras.json, read-only, no code): issues, members, project pipelines, pipeline jobs, commits, tags, group projects. See tools.d/README.md for the declaration DSL and how to add more.

npm run tools:describe -- <filter> prints the contract as the model sees it, asked of the server itself over stdio.

What 11.3 does not have

Every entry here is a trap a tool written against current documentation would fall into.

Missing

Consequence here

Merge request approvals API

There is no approve endpoint on CE 11.3 (doc/api/merge_request_approvals.md does not exist in the 11.3 tree). Review state is carried by diff comments and by resolving threads.

reviewers attribute

Assignment is the only way to route a merge request; gitlab_mr_list has no reviewer filter.

draft parameter

A draft merge request is one whose title starts with WIP: , reported back as work_in_progress: true. gitlab_mr_create/gitlab_mr_update take draft and translate it.

read_api scope

Tokens are all-or-nothing write credentials.

Global code search

/search has no blobs scope at the top level; code search is per project.

Keyset pagination

Offset pagination only; every list tool reports pagination.nextPage.

squash on merge

Squash is set on the merge request when it is created or updated, not at merge time.

rules/workflow/needs in CI

12.x features. CI config for this instance must use only/except.

/projects/:id/users (unverified)

Not used here; user lookup goes through the global /users endpoint.

GraphQL

Experimental at best on 11.0+; this client is REST v4 only.

Two error messages exist purely because of this table: a 400 mentioning reviewer_ids, draft or approval rules, and a 401 explaining the scope situation.

Reading the right documentation

Do not read today's API docs when changing this code. Read the version-matched ones from the source tag that produced the instance:

https://gitlab.com/gitlab-org/gitlab-foss/-/raw/v11.3.0/doc/api/merge_requests.md
https://gitlab.com/gitlab-org/gitlab-foss/-/raw/v11.3.0/doc/api/discussions.md

That is where the parameters in this client were checked, including the detail that a diff version reports head_commit_sha / base_commit_sha / start_commit_sha while a comment position wants head_sha / base_sha / start_sha.

Verification

npm test runs against test/mock-gitlab.mjs, which is faithful to the 11.3 shapes (the *_commit_sha naming, hunk numbering, the 405/406/409 merge failures, nested validation errors) rather than to GitLab's behaviour. Only a real instance can settle the rest:

GITLAB_BASE_URL=http://gitlab.example.com GITLAB_TOKEN=... \
  npm run verify:live -- --project <group/app> --iid <mr>          # read-only
GITLAB_BASE_URL=... GITLAB_TOKEN=... \
  npm run verify:live -- --project <group/app> --iid <mr> --write  # + create/delete a diff note

It reports PASS/FAIL/SKIP per assumption and exits non-zero on any failure. In --write mode the only mutation is one probe comment, which it deletes again.

Result against a live GitLab CE 11.3.0 instance (revision 17bd59a): 14 passed, 0 failed, in both modes. What only that run could establish, and did:

  • PRIVATE-TOKEN authentication works on 11.3.

  • A project path arrives correctly percent-encoded.

  • Pagination headers are present and usable (184 merge requests, nextPage=2).

  • GET /versions names its SHAs base_commit_sha / start_commit_sha / head_commit_sha, which is not what a comment position calls them - the mapping the client performs is correct.

  • Real diff text parses, and a real line resolves to a commentable position.

  • A nested position object is accepted when creating a diff note - the single assumption the offline suite could never test, since it was written from the same reading of the docs.

  • The created note comes back carrying its position, appears in the discussions list, toggles through resolve/unresolve, and deletes cleanly.

  • A merged merge request still reports merge_status: can_be_merged, so state is the field that decides whether a merge is possible. The tool descriptions say so.

Still unverified live, and deliberately listed rather than glossed over:

Area

Why, and how to close it

The draft positive case (WIP: title -> work_in_progress: true)

Needs a merge request that is actually a draft; the verified project had none among 100.

gitlab_mr_create / gitlab_mr_update / gitlab_mr_merge

Needs a throwaway branch in a project where creating a merge request is acceptable; 11.3 has no API to delete a merge request, so the residue is one closed or merged one.

Everything else in this file that is not one of those two lines has been exercised against the real instance.

Extending

  • A new endpoint with no logic - add a declaration to tools.d/*.json. No code, no restart of anything but the server.

  • A new endpoint with logic, or a non-JSON response - add a tool in src/entities/. Text endpoints (job traces, raw files) cannot be expressed in the JSON layer, because that layer parses every response as JSON.

  • Both front ends pick it up automatically: the MCP tool and the CLI subcommand appear together.

Layout: src/gitlab.ts (transport, pagination, error translation) - src/diff.ts (unified diff → position) - src/entities/ (tools) - src/jsonTools.ts (the declaration DSL) - src/cli.ts + src/args.ts (CLI) - src/index.ts (MCP server).

Maintainer: publishing

Prerequisites, in order:

  1. Node 22.6+ locally, and npm test green (prepublishOnly enforces it).

  2. npm login (or NPM_TOKEN in the environment) for the account that may publish.

  3. The @mohou scope must exist and you must be able to publish to it. A scoped name is not optional: npm rejects mohou/gitlab-mcp, so the package is @mohou/gitlab-mcp. If @mohou is not yet an npm organization, create it on npmjs.com and add yourself as an owner - or, for an internal registry, map the scope instead:

    # .npmrc (safe to commit - no token in it)
    @mohou:registry=https://your-internal-registry/

    That .npmrc also decides where npm publish goes, so set it before publishing.

  4. publishConfig.access = "public" is already set in package.json; without it a scoped package publishes as restricted and fails on a free plan.

Then:

npm test                      # 93 offline tests
npm run pack:check            # the file list that would ship - verify dist/ and tools.d/ are in it
npm run verify:package        # pack, install into a temp dir, run both binaries, speak MCP to them
npm publish --dry-run         # the whole publish path, including prepublishOnly, without publishing
npm version patch             # or minor/major; updates package.json + git tag
npm publish                   # prepublishOnly runs both gates above

Development needs no build; the published package does

This is the one place where the package departs from a plain "run the TypeScript" layout, and the reason is a hard Node restriction:

ERR_UNSUPPORTED_NODE_MODULES_TYPE_STRIPPING

Node strips types for the application's own sources but refuses to do so for anything under node_modules. So src/*.ts runs fine in a checkout (and every test relies on that) and cannot run at all once installed as a dependency. The package therefore ships dist/*.js, built by scripts/build.mjs (esbuild, dependencies kept external).

The bin entries resolve the entry source first, bundle second:

bin/gitlab-server.mjs   ->  src/index.ts  if it exists, else dist/index.js
bin/gitlab.mjs          ->  src/cli.ts    if it exists, else dist/cli.js

Sources first, not bundle first, and the order is not cosmetic: preferring dist/ means that after any build a checkout silently runs the stale bundle, which once hid a real bug in the sibling jira-mcp project during exactly this kind of verification. The published tarball contains no src/ at all, so an install takes the bundle path; npm run verify:package fails if src/ ever appears in the tarball, because shipping it would send an install down the source path into ERR_UNSUPPORTED_NODE_MODULES_TYPE_STRIPPING.

prepack runs the build, so npm pack and npm publish always emit a fresh bundle; dist/ is gitignored. Editing a tool means editing the TypeScript, and nothing else - tests run the sources and publishing rebuilds.

Other notes specific to this package:

  • tools.d/ must ship. The server loads tools.d/*.json from the package root at startup; if that directory were dropped from files, every JSON-declared tool would disappear and startup would fail. Both pack:check and verify:package check for it.

  • engines requires Node 22.6+ because the fallback path and the test suite use type stripping. The bundle itself would run on older Node.

  • No provenance attestation. npm publish --provenance needs a public source repository on a supported CI provider; this repository is self-hosted, so provenance is not available.

  • Run npm publish --dry-run before the real one. npm exports its configuration to lifecycle scripts, so a dry run reaches prepublishOnly with npm_config_dry_run=true - which once made verify:package fail, because npm pack prints a filename without writing the file and the install that follows hits ENOENT. The script neutralises that variable; the dry run is the check that it stays neutralised.

  • prepublishOnly runs the offline suite and the package verification only. The live checks (npm run verify:live) need VPN access and a token, so they are not part of publishing.

Available Tools

30 tools
gitlab_branches_listA
Read-only

List a project's branches. Useful before gitlab_mr_create to confirm the source branch exists and to find the target branch.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo1-based page number; see pagination.nextPage in the result
searchNosubstring search
perPageNoitems per page, max 100 (GitLab default is 20)
projectYesproject id ('42') or full path ('group/subgroup/app'); a path is URL-encoded for you

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsYes
paginationYes

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the safety profile is covered by structured data and the description carries a lighter burden. The description adds workflow framing (a pre-flight check) but says nothing about pagination behavior or result ordering, which would be genuinely useful beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, zero waste, with the core purpose front-loaded ahead of the workflow hint. Nothing is repeated from the schema or annotations.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need no explanation, and the annotations plus a fully documented schema cover the mechanics. The description supplies the one non-obvious thing an agent needs (why to call this before creating an MR); only pagination-as-workflow nuance is left implicit.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with page, perPage, search, and project all documented inline including the path-encoding note. The description adds no parameter meaning of its own, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("List a project's branches"), which is immediately distinguishable from sibling list tools like gitlab_tags_list or gitlab_commit_list. An agent knows exactly what the tool returns without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly names the workflow context (before gitlab_mr_create) and the two concrete reasons to call it: confirming the source branch exists and finding the target branch. It stops short of stating when this tool is the wrong choice versus, say, gitlab_project_get, so it is clear context rather than a full when/when-not rule.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gitlab_commit_listA
Read-only

List repository commits on a ref. Use it to see what a merge request's source branch contains beyond the diff.

ParametersJSON Schema
NameRequiredDescriptionDefault
refNobranch name, tag or commit SHA
pageNo1-based page number; see pagination.nextPage in the result
perPageNoitems per page, max 100 (GitLab default is 20)
projectYesproject id ('42') or full path ('group/subgroup/app'); a path is URL-encoded for you

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsYes
paginationYes

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint annotation already declares the safety profile, so the description's job is lighter. It adds no detail about ordering, default ref behavior, or result size limits; the pagination hint lives only in the schema, not the description. Adequate but thin beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, zero filler, with the core action front-loaded before the usage hint. Every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-value explanation is unnecessary, and the readOnly annotation covers the safety profile. What remains unstated — commit ordering and default-ref behavior — is minor for a simple list tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with each parameter (ref, page, perPage, project) documented including encoding and page-size caps, so the baseline is 3. The description's phrase 'on a ref' adds no syntax or format detail beyond what the schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb ('List') plus resource ('repository commits') and scope ('on a ref') make the purpose unambiguous. It stops short of explicitly distinguishing itself from near siblings such as gitlab_mr_changes, though the 'beyond the diff' phrasing gestures at the boundary.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The second sentence gives a concrete when-to-use scenario: inspecting a merge request's source branch contents beyond the diff, which implicitly positions it against gitlab_mr_changes. No explicit when-not or prerequisite guidance is offered, but the context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gitlab_file_getA
Read-only

Read one file from the repository at a ref. Defaults to the project default branch - pass ref= to read the file as the merge request sees it. Output is capped, and a truncated read says so.

ParametersJSON Schema
NameRequiredDescriptionDefault
refNobranch, tag or commit SHA; defaults to the project default branch
pathYesrepository-relative file path, e.g. 'src/app.ts' (no leading slash)
projectYesproject id ('42') or full path ('group/subgroup/app'); a path is URL-encoded for you
maxCharsNocap on returned characters; the file itself may be longer

Output Schema

ParametersJSON Schema
NameRequiredDescription
refYes
urlNo
pathYes
sizeYescharacters returned, after truncation
dryRunNo
contentNo
truncatedYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds real behavioral context beyond that: the default-branch fallback and the self-disclosing output cap with truncation signal. A rate limit or size ceiling beyond maxChars is not stated, but the core behavior is well disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the core action, then the ref tip, then the output caveat. Nothing repeats the name or wastes space.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need no prose, and the description still flags the truncation behavior. Combined with 100% schema coverage and a read-only annotation, an agent has everything needed to call this correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds meaning beyond the schema by explaining the MR source_branch ref pattern, a workflow the schema's generic 'branch, tag or commit SHA' wording does not convey.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Read one file from the repository at a ref.' This is clearly distinct from sibling tools like gitlab_project_get, gitlab_mr_changes, or gitlab_commit_list, and the ref scoping makes the access model unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete when-to-use guidance: pass ref=<the MR source_branch> to read the file as the merge request sees it. It does not name alternative siblings or state when-not to use this tool, so it stops short of a full routing guide.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gitlab_group_projectsB
Read-only

List the projects of a group (including its subgroups), to find a project path from a group.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo1-based page number; see pagination.nextPage in the result
groupYes
searchNosubstring search
perPageNoitems per page, max 100 (GitLab default is 20)

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsYes
paginationYes

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so safety is covered. The description adds one meaningful behavioral detail, that results include subgroups (recursive scope), but says nothing about ordering, limits, or auth requirements beyond that.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single tight sentence, front-loaded with the action and resource. Slight redundancy between 'of a group' and 'from a group', but nothing wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need not be explained, and pagination is covered by the schema. However, the required 'group' parameter is undocumented and no guidance is given on result size or filtering breadth, leaving minor gaps for a list tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 75%, with page, search, and perPage documented in the schema; only the required 'group' param lacks a description. The description adds no syntax or format detail beyond the schema, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb+resource: 'List the projects of a group' with scope qualifier 'including its subgroups'. An agent can identify this as a group-scoped project lister, though it does not explicitly contrast with the nearby gitlab_project_search sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides a use case ('to find a project path from a group') which implies when the tool is useful, but gives no explicit when-not guidance or named alternatives for finding projects by other means.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gitlab_issue_getA
Read-only

Get one issue by its project-scoped iid.

ParametersJSON Schema
NameRequiredDescriptionDefault
iidYesproject-scoped internal id - the number in !123 for a merge request or #123 for an issue, not the global id
projectYesproject id ('42') or full path ('group/subgroup/app'); a path is URL-encoded for you

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

readOnlyHint=true already establishes the safe read profile, and an output schema covers return values. The description adds the useful 'project-scoped iid' scoping note, but says nothing about error behavior (e.g. missing project or iid) or auth needs. With annotations carrying the safety burden, a 3 fits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with zero filler; every word (verb, resource, scope, key) earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read tool with full schema coverage, an output schema, and readOnlyHint, the description covers what is needed to invoke it correctly. Only minor behavioral context (error cases) is absent, and that is not essential here.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and both parameters are thoroughly documented in the schema (project id/path forms, iid semantics). The description's 'project-scoped iid' phrasing adds no meaning beyond what the schema already states, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Get) and resource (issue) with scope ('one issue', 'project-scoped iid'), which distinguishes it from the list-oriented sibling gitlab_project_issues. It does not explicitly name the sibling, but the singular/plural contrast makes the intent clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: the mention of a project-scoped iid signals 'fetch a single known issue', but there is no explicit when-to-use, no prerequisites, and no pointer to alternatives like gitlab_project_issues for listing. Adequate but leaves routing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gitlab_labels_listA
Read-only

List a project's labels. Check here before setting labels: 11.3 creates an unknown label silently when the account may, and rejects it when the account may not.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo1-based page number; see pagination.nextPage in the result
searchNosubstring search
perPageNoitems per page, max 100 (GitLab default is 20)
projectYesproject id ('42') or full path ('group/subgroup/app'); a path is URL-encoded for you

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsYes
paginationYes

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

readOnlyHint=true already declares the safe-read profile. The description adds a real caveat about unknown-label behavior when setting labels, but it is cryptically worded ('11.3') and describes a neighboring operation rather than this tool's own filtering or pagination behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the purpose before the caveat, with no wasted filler. The second sentence is slightly opaque but earns its place as a warning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and all parameters are documented by the schema. The description covers purpose and a pre-use caveat adequately, though it could tie the caveat more directly to this tool's output.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so page, perPage, search, and project are all self-documented. The description adds no syntax or format detail beyond the schema, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('List') and resource ('a project's labels'), which cleanly separates it from siblings like gitlab_tags_list and gitlab_branches_list. An agent knows exactly what it returns.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says to check this tool before setting labels, giving a clear triggering condition. It does not name the sibling tool that actually sets labels, so routing is implied rather than spelled out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gitlab_mr_changesA
Read-only

The merge request diff, summarised per file: status, added/removed line counts and a capped patch. Read this before commenting on a line, and to learn which paths and lines exist. Use path to pull one file's patch at a larger cap.

ParametersJSON Schema
NameRequiredDescriptionDefault
iidYesproject-scoped internal id - the number in !123 for a merge request or #123 for an issue, not the global id
pathNoreturn only this file
projectYesproject id ('42') or full path ('group/subgroup/app'); a path is URL-encoded for you
maxFilesNofiles to include; the rest are counted in stats.omittedFiles
maxPatchCharsNopatch characters per file; a cut patch sets patchTruncated

Output Schema

ParametersJSON Schema
NameRequiredDescription
iidNo
shaNosource-branch HEAD; pass this to gitlab_mr_merge to pin the merge
filesYesone entry per returned file; capped by maxPatchChars each
statsYes
web_urlNo
merge_statusNo
source_branchNo
target_branchNo
work_in_progressNo

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

readOnlyHint=true already covers the safety profile, so the bar is lower. The description adds real context beyond annotations: output is per-file summarised and patches are 'capped', and it hints at a larger cap when path is supplied. It does not restate truncation flags, which the schema already carries.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with what the tool returns, then the usage trigger, then the parameter hint. No filler; every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present and readOnlyHint covering safety, the description need only convey scope, usage trigger and the path shortcut — all of which it does. Nothing an agent needs to invoke this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description goes beyond the schema by explaining the meaningful effect of 'path': it pulls one file's patch 'at a larger cap', which is behavioural guidance the schema's terse 'return only this file' does not convey.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('the merge request diff') and enumerates what it returns per file (status, added/removed counts, capped patch). This clearly distinguishes it from siblings like gitlab_mr_get and gitlab_mr_versions without needing to name them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use it: 'Read this before commenting on a line, and to learn which paths and lines exist', which routes the agent away from blind commenting. It does not explicitly name gitlab_mr_comment_on_line or gitlab_mr_versions as alternatives, so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gitlab_mr_commentA

Post a comment on the merge request itself. For a comment on a specific line of the diff, use gitlab_mr_comment_on_line so it appears in the changed line's thread.

ParametersJSON Schema
NameRequiredDescriptionDefault
iidYesproject-scoped internal id - the number in !123 for a merge request or #123 for an issue, not the global id
bodyYescomment text (GitLab Flavored Markdown)
projectYesproject id ('42') or full path ('group/subgroup/app'); a path is URL-encoded for you

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
bodyNo
typeNo
authorNouser reference
systemNotrue for GitLab-generated notes (labels, pushes, state changes)
positionNopresent on diff notes; carries new_path/new_line/old_line
resolvedNo
created_atNo
resolvableNotrue when this note can be resolved - only diff notes usually are
updated_atNo
noteable_typeNo

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=false, so the agent knows this is a write. The description adds that the comment attaches to the MR itself rather than a diff thread, which is meaningful behavioral context. However, it says nothing about permissions, editability, or side effects beyond the schema and annotations, so it is adequate rather than rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with zero filler. The primary action is front-loaded and the disambiguation follows immediately, so every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With a full output schema present, the description need not explain return values, and all three parameters are schema-documented. The only minor gap is that it does not mention adjacent comment tools like gitlab_mr_reply, but for a three-parameter comment tool the description is complete enough to invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so iid, body, and project are already documented in the schema (including the project-scoped iid clarification). The description adds no additional parameter meaning beyond what the schema provides, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Post a comment on the merge request itself') and immediately contrasts with the sibling that handles the other case (line-level comments). An agent can distinguish it from gitlab_mr_comment_on_line without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly names the alternative (gitlab_mr_comment_on_line) and the condition that selects it (commenting on a specific line of the diff). It does not address the other comment-adjacent siblings (gitlab_mr_reply, gitlab_mr_discussions), but the routing guidance given is clear and actionable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gitlab_mr_comment_on_lineA

Comment on one line of the merge request diff, as a normal review comment. Give the path exactly as gitlab_mr_changes reports it and the line number in that side of the file. The required base/start/head SHAs and the old-side line number are resolved from the merge request's latest diff version, so a stale SHA or a line that is not in the diff is reported instead of being sent. The result carries discussion_id - pass it to gitlab_mr_reply to continue the thread.

ParametersJSON Schema
NameRequiredDescriptionDefault
iidYesproject-scoped internal id - the number in !123 for a merge request or #123 for an issue, not the global id
bodyYescomment text (GitLab Flavored Markdown)
lineYes1-based line number in the file
pathYesrepository-relative file path, e.g. 'src/app.ts' (no leading slash)
sideNo'new' = the file after the change (added and unchanged lines), 'old' = the file before it (removed and unchanged lines)new
projectYesproject id ('42') or full path ('group/subgroup/app'); a path is URL-encoded for you

Output Schema

ParametersJSON Schema
NameRequiredDescription
note_idNo
web_urlNo
positionNodiff position; a GitLab diff note is only valid with all of these
resolvedNo
discussion_idNo

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With only readOnlyHint=false in the annotations, the description carries real behavioral weight: it discloses that base/start/head SHAs and the old-side line number are auto-resolved from the latest diff version, and that a stale SHA or out-of-diff line is reported rather than silently sent. It also reveals the return linkage (discussion_id) for follow-up calls — context well beyond the annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three dense sentences, front-loaded with the purpose, followed by parameter sourcing guidance and the threading handoff. No filler; every sentence contributes actionable information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 6-parameter write tool with an output schema, the description covers the difficult parts an agent cannot infer: how to source path/line from a sibling tool, how SHAs are resolved, and how validation failures surface. Return values need not be enumerated given the output schema, and the discussion_id note covers the one essential output field.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds cross-parameter meaning the schema does not: `path` must match the format reported by gitlab_mr_changes, and `line` is interpreted relative to the chosen side of the diff. That is genuine added semantics over the structured fields.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource+granularity: 'Comment on one line of the merge request diff, as a normal review comment.' This differentiates it from the sibling gitlab_mr_comment (general MR comment) and gitlab_mr_reply (thread continuation) without the agent needing to open any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete usage context: derive `path` exactly as gitlab_mr_changes reports it, supply the line on the relevant side, and pass the returned discussion_id to gitlab_mr_reply to continue the thread. It names the alternative for threading, but never states explicit exclusions (e.g., when to choose gitlab_mr_comment over this tool for non-line comments).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gitlab_mr_createA

Create a merge request from source_branch into target_branch. On 11.3 there is no reviewers attribute (assign instead) and no draft parameter: pass draft:true and the required "WIP: " title prefix is applied for you. Creating an MR whose branches already have an open one fails with 409 - update that one instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
draftNomark as work in progress ("WIP: " title prefix)
titleYes
labelsNolabel names; a label that does not exist yet is created by GitLab when the caller has permission
squashNosquash commits when this MR merges
projectYesproject id ('42') or full path ('group/subgroup/app'); a path is URL-encoded for you
assignee_idNoassignee numeric user id (find it with gitlab_users_search); 0 unassigns
descriptionNoGitLab Flavored Markdown
milestone_idNoglobal milestone id, not the project-scoped iid
source_branchYesbranch name, e.g. feature/login
target_branchYes
remove_source_branchNoremove the source branch when this MR merges

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
iidNointernal id - the number in !123
shaNoHEAD of the source branch
stateNoopened / closed / locked / merged
titleNo
authorNouser reference
labelsNo
web_urlNo
assigneeNouser reference
milestoneNo
project_idNo
descriptionNo
merge_statusNo'can_be_merged' / 'cannot_be_merged' / 'unchecked'. A merged merge request on 11.3 still reports can_be_merged, so read state first - merge_status alone is not a green light
changes_countNoa string on 11.3, not a number
has_conflictsNonot sent by 11.3; compare merge_status instead
source_branchNo
target_branchNo
merge_commit_shaNo
user_notes_countNo
work_in_progressNo11.3 marks a draft MR this way; the title carries a "WIP: " prefix. Verified present on every one of 100 merge requests on the live instance

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=false (mutation), so the description must carry the rest. It discloses a concrete failure mode (409 on duplicate open MR) and version quirks (11.3 lacks reviewers/draft handling), which is real behavioral value beyond the annotation. Auth requirements and rate limits are not covered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in the first sentence, followed by caveats and the error case. Three sentences, each earning its place, though the version-specific detail is somewhat dense.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values needn't be explained. For an 11-parameter mutation tool the description covers purpose, the key failure mode, and version caveats adequately; only minor gaps (permission/auth context) remain.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 82%, so the schema already documents most parameters. The description's draft note ('pass draft:true and the required WIP: title prefix is applied') largely restates the schema's own draft description rather than adding new syntax or constraints, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Create a merge request') and the exact scope ('from source_branch into target_branch'). The 409 sentence implicitly routes the agent to gitlab_mr_update, distinguishing it from read/update siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a clear when-not ('creating an MR whose branches already have an open one fails with 409') and the alternative action ('update that one instead'), plus version-specific guidance for 11.3. It stops short of naming the sibling tool explicitly or covering general preconditions, so not a full 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gitlab_mr_discussionsA
Read-only

List the discussion threads of a merge request, with each diff comment's file and line. System notes are filtered out by default and resolved is derived from the thread's notes, so the returned page can be shorter than pagination.total (which is GitLab's raw count).

ParametersJSON Schema
NameRequiredDescriptionDefault
iidYesproject-scoped internal id - the number in !123 for a merge request or #123 for an issue, not the global id
pageNo1-based page number; see pagination.nextPage in the result
perPageNoitems per page, max 100 (GitLab default is 20)
projectYesproject id ('42') or full path ('group/subgroup/app'); a path is URL-encoded for you
maxBodyCharsNoper comment; longer text is marked as truncated
includeSystemNokeep GitLab-generated notes (label, push, state changes)
onlyUnresolvedNokeep only threads that have resolvable notes and none of them resolved

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsYes
paginationYes

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=true, yet the description discloses genuinely non-obvious behavior: system notes are filtered by default, `resolved` is derived from thread notes, and the returned page can be shorter than pagination.total. This last caveat about a raw-count vs filtered-page mismatch is exactly the kind of behavioral context that prevents agent confusion.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences: the first front-loads purpose and output shape, the second carries the behavioral caveats. No filler, and the most decision-relevant information is placed first.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With readOnlyHint covering safety, a 100%-covered schema, and an output schema handling return values, the description supplies the remaining needed context (default filtering and the pagination caveat). Nothing essential for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning by explaining the interaction between the default filtering (includeSystem=false) and derived `resolved`/onlyUnresolved semantics and the resulting pagination discrepancy. It enriches parameter understanding beyond the per-field schema text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('List') and resource ('discussion threads of a merge request') and adds the payload detail ('each diff comment's file and line'). This is clearly distinguishable from siblings like gitlab_mr_comment, gitlab_mr_changes, or gitlab_mr_get.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies its use case (inspecting MR discussion threads) but never states when to prefer it over alternatives such as gitlab_mr_changes or the reply/resolve siblings. Usage is inferable from the behavior described, but there are no explicit when/when-not rules or named alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gitlab_mr_getA
Read-only

Get one merge request. Read state before anything else: only an opened merge request can be merged, and a merged one still reports merge_status can_be_merged. work_in_progress says whether it is a draft.

ParametersJSON Schema
NameRequiredDescriptionDefault
iidYesproject-scoped internal id - the number in !123 for a merge request or #123 for an issue, not the global id
projectYesproject id ('42') or full path ('group/subgroup/app'); a path is URL-encoded for you

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
iidNointernal id - the number in !123
shaNoHEAD of the source branch
stateNoopened / closed / locked / merged
titleNo
authorNouser reference
labelsNo
web_urlNo
assigneeNouser reference
milestoneNo
project_idNo
descriptionNo
merge_statusNo'can_be_merged' / 'cannot_be_merged' / 'unchecked'. A merged merge request on 11.3 still reports can_be_merged, so read state first - merge_status alone is not a green light
changes_countNoa string on 11.3, not a number
has_conflictsNonot sent by 11.3; compare merge_status instead
source_branchNo
target_branchNo
merge_commit_shaNo
user_notes_countNo
work_in_progressNo11.3 marks a draft MR this way; the title carries a "WIP: " prefix. Verified present on every one of 100 merge requests on the live instance

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so safety is covered. The description adds real behavioral value beyond that: it warns that a merged MR still reports merge_status can_be_merged and clarifies that work_in_progress signals draft status, which are non-obvious field semantics an agent would otherwise misread.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences, front-loaded with the purpose before the state-reading caveats. No filler, though the second and third sentences pack several distinct caveats together with limited separation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-value detail is unnecessary. The description covers the key gotchas of the returned state fields and is sufficient for an agent to call and interpret the tool. It does not touch on pagination or error cases, but those are minor for a single-resource get.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with both project and iid fully documented in the schema (including the !123 vs global-id distinction). The description adds nothing about parameters, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get one merge request'), making scope clear. It implicitly distinguishes itself from gitlab_mr_list via 'one' but never names the sibling it pairs with or contrasts against, so the differentiation is inferred rather than explicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'Read state before anything else' guidance gives a reason to call this tool and implies the merge workflow context. However, it never names alternatives (gitlab_mr_list, gitlab_mr_merge, gitlab_mr_changes) or states when-not to use this tool, leaving selection to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gitlab_mr_listA
Read-only

List a project's merge requests. Defaults to state=opened because the raw API would return every state at once. This version has no reviewers or draft filter - read work_in_progress on each item instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo1-based page number; see pagination.nextPage in the result
sortNo
scopeNocreated_by_me / assigned_to_me / all; combined with author_id or assignee_id
stateNo'all' for every stateopened
labelsNoall listed labels must match
searchNomatches title and description
perPageNoitems per page, max 100 (GitLab default is 20)
projectYesproject id ('42') or full path ('group/subgroup/app'); a path is URL-encoded for you
order_byNo
author_idNofilter: author numeric user id (find it with gitlab_users_search); 0 unassigns
milestoneNomilestone title
assignee_idNofilter: assignee numeric user id (find it with gitlab_users_search); 0 unassigns
source_branchNobranch name, e.g. feature/login
target_branchNobranch name, e.g. feature/login

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsYes
paginationYes

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds genuinely useful context: the default state=opened exists because the raw API would otherwise return every state, and it discloses missing filter capabilities plus the workaround.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the core purpose, then defaults, then limitations. Every clause earns its place with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation, and the rich schema covers the 14 parameters. The description adequately flags the state default and the missing reviewer/draft filters, though it could say more about pagination behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 86%, so the schema documents the parameters well. The description only echoes the state default and notes absent filters, adding little semantic detail beyond what the schema already provides; baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List a project's merge requests'), clearly distinguishable from write operations like gitlab_mr_create or gitlab_mr_merge. It does not name a sibling alternative directly, but its scope as a listing tool is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explains the state default and warns that reviewers/draft filters are unavailable, directing the agent to read work_in_progress on each item instead. However, it gives no explicit guidance on when to choose this over siblings such as gitlab_mr_get or gitlab_raw_api.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gitlab_mr_mergeA

Merge a merge request. The merge request must be opened - merging a merged or closed one fails. It fails with 405 while it is not mergeable (conflicts, or a required pipeline still running) and with 409 when the source branch moved since you read it, so read the merge request first and pass its sha to pin the merge.

ParametersJSON Schema
NameRequiredDescriptionDefault
iidYesproject-scoped internal id - the number in !123 for a merge request or #123 for an issue, not the global id
shaNosource-branch HEAD as you read it; a mismatch is rejected rather than merging newer commits
projectYesproject id ('42') or full path ('group/subgroup/app'); a path is URL-encoded for you
merge_commit_messageNo
should_remove_source_branchNo
merge_when_pipeline_succeedsNoschedule the merge instead of merging now

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
iidNointernal id - the number in !123
shaNoHEAD of the source branch
stateNoopened / closed / locked / merged
titleNo
authorNouser reference
labelsNo
web_urlNo
assigneeNouser reference
milestoneNo
project_idNo
descriptionNo
merge_statusNo'can_be_merged' / 'cannot_be_merged' / 'unchecked'. A merged merge request on 11.3 still reports can_be_merged, so read state first - merge_status alone is not a green light
changes_countNoa string on 11.3, not a number
has_conflictsNonot sent by 11.3; compare merge_status instead
source_branchNo
target_branchNo
merge_commit_shaNo
user_notes_countNo
work_in_progressNo11.3 marks a draft MR this way; the title carries a "WIP: " prefix. Verified present on every one of 100 merge requests on the live instance

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only supply readOnlyHint=false, so the description carries the behavioral burden and does so richly: precondition (must be opened), failure semantics (405 when not mergeable due to conflicts or a running pipeline; 409 when the source branch moved since read), and the mitigation (read first, pass sha). This is exactly the beyond-annotation context an agent needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the action and then the failure modes and remedy. Dense but every clause earns its place; nothing is redundant with the name or schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with an output schema (so return values need not be explained), it covers preconditions, error modes, and the sha-pinning workflow well. Minor gaps remain around permissions and the purpose of merge_commit_message / should_remove_source_branch.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 67%, above the midpoint baseline. The description adds real meaning to the sha parameter (pinning the merge, mismatch rejected into 409) beyond the schema text. However, merge_commit_message and should_remove_source_branch remain undocumented in both schema and description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource ('Merge a merge request') that is unambiguous and clearly distinct from sibling mutators like gitlab_mr_update, gitlab_mr_create, or gitlab_mr_resolve. An agent can identify the operation without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives strong operational context: the MR must be opened, and it prescribes a workflow ('read the merge request first and pass its sha to pin the merge'). That implicitly points at gitlab_mr_get as a prerequisite, though it never explicitly names an alternative tool or contrasts merging with creating/updating.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gitlab_mr_pipelinesA
Read-only

List the pipelines recorded against this merge request. Read before merging: 11.3 refuses the merge while one is running or failed.

ParametersJSON Schema
NameRequiredDescriptionDefault
iidYesproject-scoped internal id - the number in !123 for a merge request or #123 for an issue, not the global id
pageNo1-based page number; see pagination.nextPage in the result
perPageNoitems per page, max 100 (GitLab default is 20)
projectYesproject id ('42') or full path ('group/subgroup/app'); a path is URL-encoded for you

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsYes
paginationYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

readOnlyHint=true already establishes the safe-read profile, and the description adds genuine extra context: the MR-scoped nature and the merge-blocking behavior of GitLab 11.3 when a pipeline is running or failed. It stops short of describing pagination or result shape, though the schema/output schema cover those.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences: the purpose leads, and the pre-merge rationale follows. No filler, and the most decision-relevant information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need not be explained, and the description covers what the tool returns (MR pipelines) and why it matters. It is complete for calling the tool correctly, missing only minor pagination framing that the schema already supplies.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so iid, project, page, and perPage are all documented in the schema itself. The description adds no parameter-level meaning beyond that, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('List') and resource ('pipelines') scoped to 'this merge request'. This cleanly distinguishes it from siblings like gitlab_project_pipelines (project-wide) and gitlab_pipeline_jobs (job-level detail).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a clear when-to-use signal: 'Read before merging', plus the reason (11.3 refuses the merge while one is running or failed). It does not name an explicit alternative tool, but the pre-merge context is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gitlab_mr_replyA

Reply inside an existing discussion thread. Use it to answer a review comment instead of starting a second thread on the same line.

ParametersJSON Schema
NameRequiredDescriptionDefault
iidYesproject-scoped internal id - the number in !123 for a merge request or #123 for an issue, not the global id
bodyYescomment text (GitLab Flavored Markdown)
projectYesproject id ('42') or full path ('group/subgroup/app'); a path is URL-encoded for you
discussion_idYesfrom gitlab_mr_discussions or a previous comment_on_line result

Output Schema

ParametersJSON Schema
NameRequiredDescription
note_idNo
web_urlNo
positionNodiff position; a GitLab diff note is only valid with all of these
resolvedNo
discussion_idNo

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint=false annotation already tells the agent this mutates state, so the bar is lower. The description usefully clarifies that the comment is nested inside an existing thread rather than creating a new one, but says nothing about permissions required, whether the discussion must still be open, or failure behavior when discussion_id is invalid.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, zero filler, with the action front-loaded and the routing guidance immediately after. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and the four required parameters are fully documented in the schema. For a simple reply tool the description is nearly sufficient, though it omits any note on what happens when the discussion_id is stale or not found.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, including the non-obvious iid vs global id distinction and the origin of discussion_id (gitlab_mr_discussions or comment_on_line). The description adds no parameter meaning beyond the schema, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (reply) and a specific resource (an existing discussion thread), and the second sentence distinguishes the behavior from the alternative of opening a new thread on the same line. An agent can tell it apart from gitlab_mr_comment / gitlab_mr_comment_on_line conceptually without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"Use it to answer a review comment instead of starting a second thread on the same line" gives a clear when-to-use condition and an implicit when-not (don't open a new thread). It does not name the sibling tool that creates a new thread, so the routing is behavioral rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gitlab_mr_resolveA

Resolve or unresolve a discussion thread. This is how review state is recorded on CE 11.3, which has no approve API. Reply to the thread first if the resolution needs an explanation.

ParametersJSON Schema
NameRequiredDescriptionDefault
iidYesproject-scoped internal id - the number in !123 for a merge request or #123 for an issue, not the global id
projectYesproject id ('42') or full path ('group/subgroup/app'); a path is URL-encoded for you
resolvedNo
discussion_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
notesNo
resolvedNoderived by this client: true when every resolvable note in the discussion is resolved
individual_noteNotrue for a plain comment with no thread

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=false, so the description carries most of the behavioral burden. It usefully explains the CE 11.3 no-approve-API context and the reply-first convention, but says nothing about permissions required, idempotency of resolving an already-resolved thread, or what the operation returns.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences, front-loaded with the operation and followed by the rationale and the sequencing caveat. Nothing is padded, though the CE 11.3 version detail is niche context that could be trimmed for some audiences.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need not be described, and the description covers what the tool does, why it exists, and the reply-first workflow. The main remaining gap is behavioral detail (permissions, idempotency) for a mutation tool with thin annotations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 50%: iid and project are well documented in the schema, while resolved and discussion_id have no schema description. The description's 'resolve or unresolve' phrasing hints at the purpose of the `resolved` boolean but never explicitly maps it or explains discussion_id, so it only partially compensates for the gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb pair (resolve/unresolve) and resource (a discussion thread), so the agent knows exactly what operation it performs. It does not explicitly name which sibling it contrasts with (e.g. gitlab_mr_discussions), though the 'reply to the thread first' line implicitly points at the reply tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives a clear when-to-use rationale ('this is how review state is recorded on CE 11.3, which has no approve API') plus an actionable sequencing rule (reply first if an explanation is needed). There is no explicit when-not or named alternative tool, which keeps it short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gitlab_mr_updateA

Update a merge request. Pass draft to set or clear the "WIP: " prefix (when no title is given the current title is read first). labels:[] clears all labels and assignee_id:0 unassigns - omitting a field leaves it alone.

ParametersJSON Schema
NameRequiredDescriptionDefault
iidYesproject-scoped internal id - the number in !123 for a merge request or #123 for an issue, not the global id
draftNoset or clear the "WIP: " title prefix
titleNo
labelsNoreplaces the whole label set; [] clears it
squashNo
projectYesproject id ('42') or full path ('group/subgroup/app'); a path is URL-encoded for you
assignee_idNoassignee numeric user id (find it with gitlab_users_search); 0 unassigns
descriptionNo
state_eventNoclose or reopen the merge request
milestone_idNo0 unassigns
target_branchNobranch name, e.g. feature/login
discussion_lockedNowhen locked, only project members can comment or resolve
remove_source_branchNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
iidNointernal id - the number in !123
shaNoHEAD of the source branch
stateNoopened / closed / locked / merged
titleNo
authorNouser reference
labelsNo
web_urlNo
assigneeNouser reference
milestoneNo
project_idNo
descriptionNo
merge_statusNo'can_be_merged' / 'cannot_be_merged' / 'unchecked'. A merged merge request on 11.3 still reports can_be_merged, so read state first - merge_status alone is not a green light
changes_countNoa string on 11.3, not a number
has_conflictsNonot sent by 11.3; compare merge_status instead
source_branchNo
target_branchNo
merge_commit_shaNo
user_notes_countNo
work_in_progressNo11.3 marks a draft MR this way; the title carries a "WIP: " prefix. Verified present on every one of 100 merge requests on the live instance

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only supply readOnlyHint=false, so the description carries most of the burden and does well: it discloses patch semantics, sentinel values (labels:[] clears, assignee_id:0 unassigns), and the non-obvious draft/title read-then-write interaction. It omits permission requirements and any indication of what the response returns.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two dense sentences with no filler. The core update purpose and the most surprising interaction (draft/title) are front-loaded, and the sentinel rules follow compactly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 13-parameter mutation tool with an output schema, the description covers the risky, non-obvious behavior (patch semantics, sentinel values, draft/title coupling). Return values need no explanation given the output schema; only auth/permission expectations are unaddressed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 69%, and the description adds genuine meaning beyond it: the 'omitting a field leaves it alone' patch contract and the draft-with-no-title read-first behavior are not in the schema. Sentinel semantics for labels/assignee_id largely restate schema descriptions, so it is not a 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Update a merge request'), which distinguishes it cleanly from siblings like gitlab_mr_create, gitlab_mr_merge, and gitlab_mr_get. It does not, however, explicitly name those siblings or delimit scope against them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied rather than stated: the tool is for modifying an existing MR, and the description clarifies patch semantics ('omitting a field leaves it alone'). There is no explicit when-to-use/when-not or routing to gitlab_mr_merge for state transitions versus state_event here.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gitlab_mr_versionsA
Read-only

List the diff versions of a merge request, newest first as GitLab returns them. Only needed to debug comment positions - gitlab_mr_comment_on_line resolves them itself.

ParametersJSON Schema
NameRequiredDescriptionDefault
iidYesproject-scoped internal id - the number in !123 for a merge request or #123 for an issue, not the global id
pageNo1-based page number; see pagination.nextPage in the result
perPageNoitems per page, max 100 (GitLab default is 20)
projectYesproject id ('42') or full path ('group/subgroup/app'); a path is URL-encoded for you

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsYes
paginationYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With readOnlyHint=true already covering the safety profile, the description adds real behavioral context: results are ordered newest-first and reflect GitLab's native ordering. It does not add anything about pagination or auth, but those gaps are minor against the annotation coverage.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no waste, with the purpose stated before the usage caveat. Every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation, and the description covers purpose, ordering, and the routing decision. Nothing an agent needs to call this niche debug tool correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the schema already documents iid, project, page and perPage in detail. The description adds no parameter guidance, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb ('List') plus resource ('diff versions of a merge request') and an ordering guarantee ('newest first as GitLab returns them'). It also distinguishes itself from the sibling gitlab_mr_comment_on_line, which is the tool most likely to be confused with it.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when this is needed ('only needed to debug comment positions') and when it is not, naming the alternative that handles the common case itself. This is a textbook when-to-use/when-not-to-use statement.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gitlab_pipeline_jobsA
Read-only

List the jobs of a pipeline with their status, stage and failure reason. Job logs are text, not JSON, so they are not reachable from this JSON layer.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo1-based page number; see pagination.nextPage in the result
perPageNoitems per page, max 100 (GitLab default is 20)
projectYesproject id ('42') or full path ('group/subgroup/app'); a path is URL-encoded for you
pipelineIdYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsYes
paginationYes

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint annotation already establishes this as a safe read. The description adds genuine value by disclosing a limitation — job logs are text and not reachable from this JSON layer — but it says nothing about pagination behavior or data freshness beyond the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tightly written sentences that front-load the capability and then immediately qualify it. Every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and the description covers both capability and the log-access boundary. It is complete enough for an agent to call correctly, with only minor gaps around pagination intent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 75%, so the schema documents project, page and perPage while pipelineId carries no description. The description adds no parameter-level meaning, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ("List") and resource ("jobs of a pipeline") and even names the returned fields (status, stage, failure reason). It is unambiguous, though it does not point at any sibling since there is no direct job-listing alternative.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the resource description, and the note that job logs are unreachable from this JSON layer is a useful exclusion, but there is no explicit when-to-use framing or comparison against alternatives like the raw API tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gitlab_project_getA
Read-only

Get a project by id or path. Use it to turn a project name into the path the other tools take, and to read default_branch.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectYesproject id ('42') or full path ('group/subgroup/app'); a path is URL-encoded for you

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
nameNo
pathNo
web_urlNo
archivedNo
visibilityNo
default_branchNo
http_url_to_repoNo
path_with_namespaceNofull path, e.g. group/app - the value to pass as 'project'

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint annotation already establishes the safety profile, and the description adds genuine behavioral context: it resolves names to the path form other tools expect and exposes default_branch. It stops short of covering error behavior or auth requirements, but that is beyond the typical bar for a simple getter.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences, with the core action front-loaded and the value proposition following. No filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter read tool with an output schema already describing return values, the description is essentially complete. It could note the search alternative for discovery, but nothing required for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the single 'project' parameter is fully documented as accepting an id or full path with automatic URL-encoding. The description's 'id or path' phrasing merely restates the schema, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get a project by id or path') and adds the practical intent of resolving a name to a path. It does not explicitly name the adjacent sibling (gitlab_project_search), so differentiation is implied rather than stated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear positive usage context ('turn a project name into the path the other tools take, and to read default_branch'), which tells the agent when this tool is the right entry point. No explicit when-not or named alternative is provided, keeping it short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gitlab_project_issuesC
Read-only

List a project's issues. Read-only extra: this file declares the endpoints the merge-request tools do not cover, so they cost no code.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo1-based page number; see pagination.nextPage in the result
stateNo
labelsNo
searchNo
perPageNoitems per page, max 100 (GitLab default is 20)
projectYesproject id ('42') or full path ('group/subgroup/app'); a path is URL-encoded for you

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsYes
paginationYes

TDQS

C2.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description says 'Read-only', but readOnlyHint=true already declares that, so it adds nothing beyond the annotation. No mention of pagination behavior, default result size, filtering semantics, or what happens for missing projects, leaving the behavioral burden entirely on structured fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The first sentence is tight and front-loaded, but the second sentence is internal implementation commentary about endpoint declarations and 'costing no code' that gives an agent no actionable information and dilutes the definition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, but for a list tool with three undocumented filter parameters the description should at minimum cover filtering and pagination semantics. Instead it omits both and spends its second sentence on irrelevant meta-commentary.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 50%: state, labels and search are $ref aliases with no documentation at all. The description does not explain these filters (valid state values, label syntax, search scope), so it fails to compensate for the gap and adds no meaning over the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence gives a specific verb and resource ('List a project's issues'), which is unambiguous on its own. However it does nothing to distinguish this tool from siblings such as gitlab_issue_get or gitlab_project_search, and the second sentence muddies rather than sharpens the purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no statement of when to use this tool versus alternatives. The only hint at context is the cryptic remark about merge-request tools, which does not tell an agent when this listing is the right call versus gitlab_project_search or gitlab_raw_api.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gitlab_project_membersA
Read-only

List a project's members with their access level and numeric user id - the ids gitlab_mr_create/update take as assignee_id.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo1-based page number; see pagination.nextPage in the result
searchNosubstring search
perPageNoitems per page, max 100 (GitLab default is 20)
projectYesproject id ('42') or full path ('group/subgroup/app'); a path is URL-encoded for you

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsYes
paginationYes

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

readOnlyHint=true already tells the agent this is a safe read. The description adds the useful detail that returned ids feed MR assignment, but says nothing about pagination, ordering, or default page size (which is only implied elsewhere). Adequate but not rich against the annotation coverage.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence with the core purpose first and the payoff (assignee_id ids) second. No filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With a 100%-documented schema, an output schema covering the response, and a read-only annotation, the agent has nearly everything it needs. Only minor gaps remain, such as pagination/ordering expectations not being stated in the prose.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and every parameter (page, search, perPage, project) is documented in the schema itself. The description adds no parameter-level detail, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List a project's members') plus the fields returned ('access level and numeric user id'), and clarifies the downstream use of those ids for assignee_id. This distinguishes it from the nearby gitlab_users_search alternative.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Clearly signals the context in which the tool is needed - obtaining numeric user ids to pass as assignee_id in gitlab_mr_create/update. It does not, however, explicitly state when to prefer this over gitlab_users_search or mention exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gitlab_project_pipelinesA
Read-only

List a project's pipelines, optionally filtered by ref or status. On 11.3 a merge request's own pipelines come from gitlab_mr_pipelines.

ParametersJSON Schema
NameRequiredDescriptionDefault
refNobranch name, tag or commit SHA
pageNo1-based page number; see pagination.nextPage in the result
statusNo
perPageNoitems per page, max 100 (GitLab default is 20)
projectYesproject id ('42') or full path ('group/subgroup/app'); a path is URL-encoded for you

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsYes
paginationYes

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint annotation already establishes the safe read-only nature, so the bar is lower. The description adds a useful routing note about MR pipelines and mentions optional filters, but does not disclose anything about pagination, rate limits, or result ordering beyond what the annotations and schema provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tightly written sentences with zero waste. The core list/filter behavior is front-loaded, followed by the sibling-routing note.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only list tool with an output schema and readOnlyHint annotation, the description covers the essential purpose, filters, and MR pipeline alternative. It omits pagination guidance, but the schema and output schema already carry that detail, so it is largely complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 80%, so the schema already documents project, ref, page, and perPage. The description only confirms that ref and status act as filters; it adds no status enum values or format details beyond the schema, fitting the baseline 3 for high-coverage schemas.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('List') and resource ('a project's pipelines') and immediately narrows scope with optional ref/status filters. It also differentiates from the sibling gitlab_mr_pipelines by routing merge-request pipelines there.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It names an explicit alternative for MR pipelines ('a merge request's own pipelines come from gitlab_mr_pipelines'), which is clear routing guidance. However, it does not explain when to use this tool versus gitlab_pipeline_jobs or when to prefer ref vs status filtering, leaving some context to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gitlab_raw_apiA

Call any API v4 endpoint directly - the escape hatch for endpoints with no dedicated tool (issues, labels, pipelines, snippets, members). Prefer a dedicated tool when one exists: this one does no validation, so a wrong path or field is exactly what the instance receives.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyNoJSON request body
pathYesAPI path below /api/v4, e.g. '/projects/42/merge_requests' (leading / optional)
queryNoquery string parameters; values are stringified
methodYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
bodyNo
pathYes
methodYes
statusNo

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations supply only readOnlyHint=false; the description adds the important trait that this tool performs no validation and forwards a wrong path or field verbatim to the instance. It does not mention auth requirements, rate limits, or that non-GET methods mutate state (only implied by the method enum), so it stops short of full disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences with no filler; the escape-hatch purpose comes first and the routing warning is front-loaded immediately after it.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation, and the description covers purpose, alternatives, and the main risk. It leaves unstated who may call it and what permissions each HTTP method requires, a minor gap for an unvalidated write-capable tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 75% and the schema already documents path format, query stringification, and body shape. The description adds the pass-through/no-validation semantics for all parameters but no per-parameter syntax or constraints, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('call any API v4 endpoint directly') and frames it as the escape hatch for endpoints without dedicated tools, naming concrete example domains. An agent can distinguish it from the ~30 dedicated gitlab_* siblings at a glance.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives both sides of the routing decision: use this when no dedicated tool exists, and 'Prefer a dedicated tool when one exists.' That is an explicit when-not plus an alternative-selection rule, which is exactly what usage guidance should do.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gitlab_server_versionA
Read-only

Get the GitLab version answering this token (GET /version). Confirms which version the instance is on, which matters because most public documentation describes newer releases.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

readOnlyHint=true already tells the agent this is a safe, non-mutating read, so the bar is lower. The description adds that the call is scoped to the current token's instance, but says nothing about auth requirements, rate limits, or failure behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, zero waste, with the core action front-loaded and the rationale following. Every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

A parameterless read tool with an output schema and readOnlyHint annotation needs little more than what is given. The description covers what it returns conceptually and why it matters, so an agent has everything required to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is nothing for the description to disambiguate. Baseline 4 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource (get the GitLab version) and scopes it to the instance answering the current token via GET /version. No sibling tool covers instance metadata, so the agent can distinguish it immediately.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a clear reason to call it — confirming the instance version before trusting public docs that describe newer releases — which implies the right context. It stops short of naming an explicit alternative or a when-not-to-use case, but no sibling overlaps.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gitlab_tags_listC
Read-only

List repository tags.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo1-based page number; see pagination.nextPage in the result
perPageNoitems per page, max 100 (GitLab default is 20)
projectYesproject id ('42') or full path ('group/subgroup/app'); a path is URL-encoded for you

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsYes
paginationYes

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds nothing beyond that — no mention of pagination behavior, ordering, or result shape, despite pagination being a real concern for a list endpoint.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three words, front-loaded and free of filler. It is efficient, though the brevity shades into under-specification rather than pure conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and annotations cover the read-only nature. What is missing is any usage context or routing hint among the many sibling list tools, leaving the definition merely adequate for a simple read endpoint.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with project, page, and perPage all documented in the schema itself, so the baseline of 3 applies. The description contributes no additional parameter meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (List) and resource (repository tags), so an agent knows exactly what it does. It does not, however, differentiate itself from near-identical siblings like gitlab_branches_list or gitlab_labels_list, which list other project-scoped resources the same way.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool, what prerequisites exist (e.g., project access), or which sibling to prefer for adjacent data. The agent must infer usage entirely from the name.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gitlab_whoamiA
Read-only

Get the authenticated user. Call this first: it is the cheapest way to prove the token and base URL work before any write.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
nameNo
stateNo
web_urlNo
usernameNo
avatar_urlNo

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations provide readOnlyHint=true, so safety is covered. The description adds valuable behavioral context: that this is the cheapest auth/URL validation and should precede writes. It doesn't describe rate limits or return shape, but the output schema exists and an auth check needs little more.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two compact sentences, zero waste, front-loaded with the core action and then the routing rationale. Every clause carries information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, read-only identity check with an output schema and annotations covering safety, this is fully complete. An agent knows what it does, when to call it, and why.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Zero parameters, so there is nothing to document; baseline is 4. The description correctly implies no inputs are needed to identify the caller from the token.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource: 'Get the authenticated user.' This is unmistakably distinct from every sibling (which are all about projects, MRs, pipelines, etc.), and the response semantics are clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to use it ('Call this first') and why ('cheapest way to prove the token and base URL work before any write'), effectively routing the agent to this tool as a connectivity/auth check rather than to a heavier sibling.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 30 tool updatesv1.0.0
    • First observedgitlab_branches_list
    • First observedgitlab_commit_list
    • First observedgitlab_file_get
    • First observedgitlab_group_projects
    • First observedgitlab_issue_get
    • First observedgitlab_labels_list
    • First observedgitlab_mr_changes
    • First observedgitlab_mr_comment
    • First observedgitlab_mr_comment_on_line
    • First observedgitlab_mr_create
    • First observedgitlab_mr_discussions
    • First observedgitlab_mr_get
    • First observedgitlab_mr_list
    • First observedgitlab_mr_merge
    • First observedgitlab_mr_pipelines
    • First observedgitlab_mr_reply
    • First observedgitlab_mr_resolve
    • First observedgitlab_mr_update
    • First observedgitlab_mr_versions
    • First observedgitlab_pipeline_jobs
    • First observedgitlab_project_get
    • First observedgitlab_project_issues
    • First observedgitlab_project_members
    • First observedgitlab_project_pipelines
    • First observedgitlab_project_search
    • First observedgitlab_raw_api
    • First observedgitlab_server_version
    • First observedgitlab_tags_list
    • First observedgitlab_users_search
    • First observedgitlab_whoami

TDQS

B3.4/5.0

Scored across 30 tools

Disambiguation4/5

Most tools target distinct resources and actions, but the comment-related trio (gitlab_mr_comment, gitlab_mr_comment_on_line, gitlab_mr_reply) and the pipeline listings (gitlab_mr_pipelines, gitlab_project_pipelines, gitlab_pipeline_jobs) require careful reading to avoid misselection. Descriptions do a good job of clarifying boundaries, so confusion is limited but not absent.

Naming Consistency4/5

All names use snake_case with a uniform gitlab_ prefix, and most follow a resource_action pattern. Minor deviations exist: some list tools include an explicit verb (gitlab_labels_list, gitlab_branches_list), while others omit it (gitlab_project_issues, gitlab_project_members, gitlab_mr_discussions), and a few names are phrase-like (gitlab_whoami, gitlab_raw_api).

Tool Count2/5

30 tools is heavy for a server whose primary focus is merge request workflows. Many auxiliary read-only list/get tools (e.g., project issues, members, pipelines, commits, tags, group projects) add bulk that could be consolidated or handled via the provided raw API escape hatch.

Completeness4/5

The core merge request lifecycle — list, get, changes, create, update, comment, line comment, reply, resolve, discussions, versions, pipelines, and merge — is well-covered. Gaps remain for common write operations outside MRs (issue creation/update, branch creation, file/commit writes), though the raw API tool provides a workaround.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    MCP server for interacting with GitLab API, supporting both self-hosted instances and gitlab.com. Provides tools for managing issues, merge requests, code review, pipelines, milestones, releases, search, and file access.
    795 npm
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    MCP server for the GitLab REST API providing tools to manage projects, merge requests, pipelines, CI/CD variables, approvals, issues, and code reviews.
    9,048 PyPI
    6
    MIT