Skip to main content
Glama

GitLab MCP Server

GitHub stars npm downloads npm GitHub License Install in VS Code Ask DeepWiki MCP Toplist mcpindex

English | 한국어 | 简体中文

📖 Documentation → Setup guides, environment variables, and the full tool reference live on the hosted docs site.

Star History Chart

@zereight/mcp-gitlab

Agent-workflow-optimized GitLab MCP — manage projects, merge requests, issues, pipelines, wiki, releases, tags, milestones, and more through stdio, SSE, and Streamable HTTP.

Supports PAT, OAuth, read-only mode, dynamic API URLs, and remote authorization for VS Code, Claude, Cursor, Copilot, and other MCP clients.

Why use this GitLab MCP?

  • 261 tools + discover_tools — start with a small toolset; activate more at runtime without CQRS-style grouping

  • MR 2-step review — list_merge_request_changed_files → batched get_merge_request_file_diff

  • Agent Skill built in — workflow guidance in skills/gitlab-mcp/

  • Flexible auth — Personal Access Token, local OAuth2 browser flow, MCP OAuth proxy, and per-request remote authorization

  • Multiple transports — stdio for local clients, SSE for legacy clients, and Streamable HTTP for modern remote deployments

  • Client-friendly setup — examples for Claude Code, Codex, Antigravity, OpenCode, Copilot, Cline, Roo Code, Cursor, Kilo Code, and Amp Code

  • Self-hosted ready — works with custom GitLab instances, proxy settings, and dynamic API URL routing

  • JMESPath result filtering — optional jmespath on tool calls (see tools/list) shrinks JSON results without changing GitLab API requests; when response masking is enabled, JMESPath runs on masked data.

How we compare

@zereight/mcp-gitlab

GitLab MCP A (community CQRS-style)

Best for

AI agent workflows

Enterprise multi-instance / grouped tools

Tool model

~261 granular tools + discover_tools

~50–60 grouped browse_* / manage_* tools

MR review

2-step batched diff

Varies

Node.js

>=18.17

Often >=24

License

MIT

Varies

Full comparison →

Quick start: choose either Personal Access Token or OAuth2 setup below, install @zereight/mcp-gitlab, and use zereight-mcp-gitlab in your MCP client configuration.

Client Setup Guides

Related MCP server: gitlab-mcp

Usage

Setup Overview

Authentication Methods

The server supports four authentication methods:

For local/desktop use (most common):

  1. Personal Access Token (GITLAB_PERSONAL_ACCESS_TOKEN) — simplest setup

  2. OAuth2 — Local Browser (GITLAB_USE_OAUTH) — recommended for better security

For server/remote deployments:

  1. OAuth2 — MCP Proxy (GITLAB_MCP_OAUTH) — for remote MCP clients such as Claude.ai

  2. Remote Authorization (REMOTE_AUTHORIZATION) — multi-user deployments where each caller provides their own token

Quick setup paths

For the simplest local setup, start with a Personal Access Token. For browser-based local auth, use OAuth2. For remote or multi-user deployments, continue to the MCP OAuth and Remote Authorization sections later in this README.

Install the server once:

brew tap zereight/gitlab-mcp https://github.com/zereight/gitlab-mcp
brew install zereight/gitlab-mcp/zereight-mcp-gitlab

Or with npm:

npm install -g @zereight/mcp-gitlab

Or with Nix, by adding this flake to your own:

# flake.nix
inputs.gitlab-mcp.url = "github:zereight/gitlab-mcp";

# wherever you configure your MCP client:
command = lib.getExe inputs.gitlab-mcp.packages.${system}.default;

The store path is pinned by your lock file; update it with nix flake update gitlab-mcp.

The examples use zereight-mcp-gitlab, a less collision-prone alias for the legacy mcp-gitlab binary. If your MCP client cannot find it, use the absolute path from which zereight-mcp-gitlab.

No global install? Pin npx to the previous stable release (the version these docs recommend), for example npx -y @zereight/mcp-gitlab@2.1.65. If you always want the newest release, use npx -y @zereight/mcp-gitlab@latest instead. The server prints a notice to stderr on startup when a newer version is available (disable with GITLAB_DISABLE_VERSION_CHECK=true).

Using CLI Arguments (for clients with env var issues)

Some MCP clients (like GitHub Copilot CLI) have issues with environment variables. Use CLI arguments instead:

{
  "mcpServers": {
    "gitlab": {
      "command": "zereight-mcp-gitlab",
      "args": ["--token=YOUR_GITLAB_TOKEN", "--api-url=https://gitlab.com/api/v4"],
      "tools": ["*"]
    }
  }
}

Available CLI arguments:

  • --token - GitLab Personal Access Token (replaces GITLAB_PERSONAL_ACCESS_TOKEN)

  • --api-url - GitLab API URL (replaces GITLAB_API_URL)

  • --read-only=true - Enable read-only mode (replaces GITLAB_READ_ONLY_MODE, deprecated — prefer --permission-mode=readonly)

  • --permission-mode - Permission level: readonly, modify (no delete or teardown tools), or full (replaces GITLAB_PERMISSION_MODE, default full)

  • --use-wiki=true - Enable wiki API (replaces USE_GITLAB_WIKI, legacy — prefer GITLAB_TOOLSETS=wiki)

  • --use-milestone=true - Enable milestone API (replaces USE_MILESTONE, legacy — prefer GITLAB_TOOLSETS=milestones)

  • --use-pipeline=true - Enable pipeline API (replaces USE_PIPELINE, legacy — prefer GITLAB_TOOLSETS=pipelines)

  • --disable-version-check=true - Disable the startup new-version notice (replaces GITLAB_DISABLE_VERSION_CHECK)

  • --masking-enabled=true - Enable text-response masking (replaces GITLAB_MASKING_ENABLED)

  • --masking-config - Path to a masking configuration file (replaces GITLAB_MASKING_CONFIG)

  • --masking-policy-file - Path to a protected managed-policy file (replaces GITLAB_MASKING_POLICY_FILE)

  • --masking-workspace-dir - Directory used to resolve masking files (replaces GITLAB_MASKING_WORKSPACE_DIR)

CLI arguments take precedence over environment variables.

zereight-mcp-gitlab auth is a subcommand (not an MCP server flag). It runs GitLab device flow and exits. See CLI Arguments.

Fine-grained tool filtering: use GITLAB_PERMISSION_MODE=modify to allow create/update while blocking every delete tool and the destructive teardown tools (cancel_pipeline, cancel_pipeline_job, stop_environment, stop_stale_environments, unprotect_branch) — including destructive mutations (deletion and teardown verbs) through execute_graphql and push_files delete/move actions — or GITLAB_PERMISSION_MODE=readonly for read-only access. You can also enable toolset groups with GITLAB_TOOLSETS=<group,…>, allow-list individual tools with GITLAB_TOOLS=<tool,…> (e.g. read-only groups plus a few specific write tools), and deny-list by pattern with GITLAB_DENIED_TOOLS_REGEX. The legacy USE_GITLAB_WIKI / USE_MILESTONE / USE_PIPELINE flags are kept for backward compatibility only. See Tools Reference and Environment Variables.

  • sse

docker run -i --rm \
  -e HOST=0.0.0.0 \
  -e GITLAB_PERSONAL_ACCESS_TOKEN=your_gitlab_token \
  -e GITLAB_API_URL="https://gitlab.com/api/v4" \
  -e GITLAB_PERMISSION_MODE=readonly \
  -e GITLAB_TOOLSETS=wiki,milestones,pipelines \
  -e SSE=true \
  -e SSE_AUTH_TOKEN=your_mcp_sse_token \
  -p 3333:3002 \
  zereight050/gitlab-mcp
{
  "mcpServers": {
    "gitlab": {
      "type": "sse",
      "url": "http://localhost:3333/sse",
      "headers": {
        "Authorization": "Bearer your_mcp_sse_token"
      }
    }
  }
}
  • streamable-http

docker run -i --rm \
  -e HOST=0.0.0.0 \
  -e REMOTE_AUTHORIZATION=true \
  -e GITLAB_API_URL="https://gitlab.com/api/v4" \
  -e GITLAB_PERMISSION_MODE=readonly \
  -e GITLAB_TOOLSETS=wiki,milestones,pipelines \
  -e STREAMABLE_HTTP=true \
  -p 3333:3002 \
  zereight050/gitlab-mcp
{
  "mcpServers": {
    "gitlab": {
      "type": "streamable-http",
      "url": "http://localhost:3333/mcp",
      "headers": {
        "Authorization": "Bearer glpat-..."
      }
    }
  }
}

Using MCP OAuth Proxy (GITLAB_MCP_OAUTH)

For server/remote deployments only. This mode requires the MCP server to be deployed with a publicly accessible HTTPS URL. For local/desktop use, see GITLAB_USE_OAUTH above.

For remote MCP clients that support the MCP OAuth specification (e.g. Claude.ai). The server acts as a full OAuth 2.0 authorization server — unauthenticated requests receive a 401 + WWW-Authenticate response, which triggers the OAuth browser flow automatically on the client side.

Remote MCP clients such as OpenCode, MCPJam, and Claude.ai can send their own callback URL during authorization. If you cannot register every client callback URL in GitLab, enable GITLAB_OAUTH_CALLBACK_PROXY=true. With callback proxy mode, GitLab only needs one registered redirect URI: {MCP_SERVER_URL}/callback.

GITLAB_OAUTH_REDIRECT_URI is for local OAuth (GITLAB_USE_OAUTH) only. It does not override remote MCP OAuth client callback URLs and should not be used to fix remote Unregistered redirect_uri errors.

This variable exists because the local OAuth flow starts a browser on the same machine as the MCP server and listens for the callback on a local HTTP server, for example http://127.0.0.1:8888/callback.

Remote MCP OAuth is different. In GITLAB_MCP_OAUTH=true mode, the MCP client provides its own callback URL during /authorize. GITLAB_OAUTH_REDIRECT_URI does not replace that client-provided URL.

Mode

Enable with

Callback variable

GitLab redirect URI

Local OAuth

GITLAB_USE_OAUTH=true

GITLAB_OAUTH_REDIRECT_URI

http://127.0.0.1:8888/callback or your local callback

Remote MCP OAuth

GITLAB_MCP_OAUTH=true

GITLAB_OAUTH_CALLBACK_PROXY=true

{MCP_SERVER_URL}/callback

Use GITLAB_OAUTH_REDIRECT_URI only when the MCP server itself owns the local browser callback. Use GITLAB_OAUTH_CALLBACK_PROXY=true when a remote MCP client owns the callback URL.

How it works: You deploy this MCP server somewhere with a public HTTPS URL. MCP clients connect to {MCP_SERVER_URL}/mcp. The server handles the OAuth 2.0 flow, exchanging credentials with GitLab on behalf of the client.

Prerequisites:

  1. A publicly accessible HTTPS server URL (MCP_SERVER_URL) — use ngrok for local testing

  2. A pre-registered GitLab OAuth application with api (or read_api) scopes — Go to Admin area → Applications, set Redirect URI to {MCP_SERVER_URL}/callback

Environment Variable

Required

Description

GITLAB_MCP_OAUTH

✅

Set to true to enable

GITLAB_API_URL

✅

GitLab API base URL

GITLAB_OAUTH_APP_ID

✅

GitLab OAuth Application ID

MCP_SERVER_URL

✅

Public HTTPS URL of this MCP server

STREAMABLE_HTTP

✅

Must be true

GITLAB_OAUTH_CALLBACK_PROXY

optional

Set to true to use the MCP server's fixed /callback URL

GITLAB_OAUTH_SCOPES

optional

Comma-separated scopes (default: api,read_api,read_user)

GITLAB_OAUTH_ALLOWED_GROUPS

optional

Comma-separated group full paths — only members (and subgroup members) may obtain a token (replaces deprecated GITLAB_ALLOWED_GROUPS)

When STREAMABLE_HTTP=true, server-side GitLab credentials (GITLAB_PERSONAL_ACCESS_TOKEN, GITLAB_JOB_TOKEN, GITLAB_AUTH_COOKIE_PATH, or GITLAB_USE_OAUTH) require REMOTE_AUTHORIZATION=true, GITLAB_MCP_OAUTH=true, or STREAMABLE_HTTP_AUTH_TOKEN.

Troubleshooting Unregistered redirect_uri

Check the redirect_uri in the browser URL. If it points to a client callback such as http://127.0.0.1:xxxxx/.../callback, enable:

GITLAB_OAUTH_CALLBACK_PROXY=true

Do not fix remote MCP OAuth by changing GITLAB_OAUTH_REDIRECT_URI. That variable is for local OAuth (GITLAB_USE_OAUTH) only.

docker run -i --rm \
  -e HOST=0.0.0.0 \
  -e GITLAB_MCP_OAUTH=true \
  -e GITLAB_OAUTH_CALLBACK_PROXY=true \
  -e STREAMABLE_HTTP=true \
  -e MCP_SERVER_URL=https://your-server.example.com \
  -e GITLAB_API_URL="https://gitlab.com/api/v4" \
  -e GITLAB_OAUTH_APP_ID=your_app_id \
  -p 3000:3002 \
  zereight050/gitlab-mcp

MCP client configuration:

{
  "mcpServers": {
    "gitlab": {
      "type": "http",
      "url": "https://your-server.example.com/mcp"
    }
  }
}

Using Remote Authorization (REMOTE_AUTHORIZATION)

For server/remote deployments only. Each HTTP caller provides their own GitLab token directly in request headers — no OAuth flow involved.

For multi-user or multi-tenant deployments where each caller provides their own GitLab token in the HTTP request header. No OAuth flow — the MCP server forwards the token to GitLab on behalf of the caller.

Header priority: Private-Token > JOB-TOKEN > Authorization: Bearer

Environment Variable

Required

Description

REMOTE_AUTHORIZATION

✅

Set to true to enable

STREAMABLE_HTTP

✅

Must be true

ENABLE_DYNAMIC_API_URL

optional

Allow per-request GitLab URL via X-GitLab-API-URL header

GITLAB_ALLOWED_HOSTS

optional

Comma-separated allowed X-GitLab-API-URL hosts; GITLAB_API_URL hosts are always allowed. Also trusted as download redirect targets (release assets, job artifacts, uploaded attachments); list private-network hosts here

GITLAB_ALLOW_UNAUTHENTICATED_TOOL_DISCOVERY

optional

Allow unauthenticated initialize, notifications/initialized, tools/list, and server/discover only (tool calls still require auth)

MCP_SERVER_URL / MCP_ALLOWED_HOSTS / MCP_ALLOWED_ORIGINS

optional

Allowed public /mcp host/origin values for DNS rebinding protection

MCP_TRUST_PROXY

optional

Trust Forwarded / X-Forwarded-* headers behind a reverse proxy (download URLs, Express req.ip, /mcp IP rate limits, OAuth rate limits)

GITLAB_ALLOW_UNAUTHENTICATED_TOOL_DISCOVERY=true is intended for MCP gateways or admin UIs that need to inspect tool metadata before a user provides a GitLab token. Leave it disabled unless the tool list is safe to expose in your deployment.

When MCP_SERVER_URL is not set, remote download URLs fall back to the local server address. Set MCP_TRUST_PROXY=true only if the server is reachable through a trusted reverse proxy and direct client access to the MCP server is blocked. This enables Express trust proxy for Streamable HTTP and SSE, derives public download URLs from Forwarded / X-Forwarded-Proto / X-Forwarded-Host / X-Forwarded-Prefix, and keeps OAuth endpoint rate limiting working when proxies send X-Forwarded-For with a client port (for example 1.2.3.4:5678). Existing OAuth+proxy deployments must set this explicitly after the flag was introduced.

Example request headers:

Private-Token: glpat-xxxxxxxxxxxxxxxxxxxx

or using a Bearer token:

Authorization: Bearer glpat-xxxxxxxxxxxxxxxxxxxx

⚠️ REMOTE_AUTHORIZATION is not compatible with SSE transport. STREAMABLE_HTTP=true is required.

Environment Variables

Use the dedicated reference for the full environment variable list:

Most users only need one of these starting sets:

  • Local PAT: GITLAB_PERSONAL_ACCESS_TOKEN, GITLAB_API_URL

  • Local OAuth: GITLAB_USE_OAUTH=true, GITLAB_OAUTH_CLIENT_ID, GITLAB_OAUTH_REDIRECT_URI, GITLAB_API_URL

  • Remote multi-user HTTP: STREAMABLE_HTTP=true, REMOTE_AUTHORIZATION=true (or GITLAB_MCP_OAUTH=true), MCP_TRUST_PROXY=true (behind a reverse proxy), MAX_REQUESTS_PER_MINUTE=300, MCP_SERVER_URL or MCP_ALLOWED_HOSTS, HOST, PORT

  • Multiple side-by-side deployments: set a distinct MCP_SERVER_NAME per instance (e.g. gitlab-selfhosted-readonly) so clients, logs, and telemetry can tell them apart

  • Multi-pod HPA (stateless): above + OAUTH_STATELESS_MODE=true, OAUTH_STATELESS_SECRET (same across all pods). See Stateless Mode.

Commonly referenced variables:

  • GITLAB_API_URL

  • GITLAB_PERSONAL_ACCESS_TOKEN

  • GITLAB_USE_OAUTH

  • REMOTE_AUTHORIZATION

  • MCP_TRUST_PROXY

  • MAX_REQUESTS_PER_MINUTE

  • MAX_SESSIONS

  • MCP_ALLOWED_HOSTS

  • MCP_ALLOWED_ORIGINS

  • GITLAB_MCP_OAUTH

  • GITLAB_OAUTH_CALLBACK_PROXY

  • OAUTH_REGISTER_RATE_LIMIT_PER_HOUR

  • OAUTH_STATELESS_MODE

  • OAUTH_STATELESS_SECRET

The reference document also covers:

  • auth and OAuth variables

  • MCP OAuth proxy variables

  • project and tool filtering variables

  • dynamic tool discovery via discover_tools (on-demand toolset activation)

  • transport and session variables

  • proxy and TLS variables

For callback proxy mode details, see GitLab MCP OAuth Callback Proxy.

SSE session limits

GET /sse is subject to the same remote-transport controls as Streamable HTTP:

  • Capacity: at most MAX_SESSIONS concurrent SSE sessions (default 1000); further connections get 503.

  • Creation rate limit: new connections are limited to MAX_REQUESTS_PER_MINUTE per client IP (default 60); excess connections get 429.

  • Idle timeout: a session that receives no POST /messages request for SESSION_TIMEOUT_SECONDS (default 1 hour) is closed, so an idle client must reconnect instead of holding a capacity slot. Unlike Streamable HTTP, holding the SSE stream open does not count as activity.

  • /health returns 503 with status: "degraded" while the instance is at capacity.

Tune these with MAX_SESSIONS, MAX_REQUESTS_PER_MINUTE, and SESSION_TIMEOUT_SECONDS.

Remote Authorization Setup (Multi-User Support)

When using REMOTE_AUTHORIZATION=true, the MCP server can support multiple users, each with their own GitLab token passed via HTTP headers. This is useful for:

  • Shared MCP server instances where each user needs their own GitLab access

  • IDE integrations that can inject user-specific tokens into MCP requests

Setup Example:

# Start server with remote authorization
docker run -d \
  -e HOST=0.0.0.0 \
  -e STREAMABLE_HTTP=true \
  -e REMOTE_AUTHORIZATION=true \
  -e GITLAB_API_URL="https://gitlab.com/api/v4" \
  -e GITLAB_PERMISSION_MODE=readonly \
  -e SESSION_TIMEOUT_SECONDS=3600 \
  -p 3333:3002 \
  zereight050/gitlab-mcp

Client Configuration:

Your IDE or MCP client must send one of these headers with each request:

Authorization: Bearer glpat-xxxxxxxxxxxxxxxxxxxx

or

Private-Token: glpat-xxxxxxxxxxxxxxxxxxxx

The token is stored per session (identified by mcp-session-id header) and reused for subsequent requests in the same session.

Remote Authorization Client Configuration Example with Cursor

{
  "mcpServers": {
    "GitLab": {
      "url": "http(s)://<your_mcp_gitlab_server>/mcp",
      "headers": {
        "Authorization": "Bearer glpat-..."
      }
    }
  }
}

Important Notes:

  • Remote authorization only works with Streamable HTTP transport

  • Each session is isolated - tokens from one session cannot access another session's data Tokens are automatically cleaned up when sessions close

  • Session timeout: Auth tokens expire after SESSION_TIMEOUT_SECONDS (default 1 hour) of inactivity. After timeout, the client must send auth headers again. The transport session remains active.

  • Each request resets the timeout timer for that session

  • Rate limiting: /mcp requests are limited to MAX_REQUESTS_PER_MINUTE per client IP, and per MCP session when using OAuth or remote authorization (default 60). See environment-variables.md.

  • Capacity limit: Server accepts up to MAX_SESSIONS concurrent sessions (default 1000)

MCP OAuth Setup (Claude.ai Native OAuth)

When using GITLAB_MCP_OAUTH=true, the server acts as an OAuth proxy to your GitLab instance. Claude.ai (and any MCP-spec-compliant client) handles the entire browser authentication flow automatically — no manual Personal Access Token management needed.

Prerequisites:

A pre-registered GitLab OAuth application is required. GitLab restricts dynamically registered (unverified) applications to the mcp scope, which is insufficient for API calls (need api or read_api).

  1. Go to your GitLab instance → Admin Area > Applications (instance-wide) or User Settings > Applications (personal)

  2. Create a new application with:

    • Confidential: unchecked

    • Scopes: api, read_api, read_user (or whichever scopes you intend to request via GITLAB_OAUTH_SCOPES)

  3. Save and copy the Application ID — this is your GITLAB_OAUTH_APP_ID

How it works:

  1. User adds your MCP server URL in Claude.ai

  2. Claude.ai discovers OAuth endpoints via /.well-known/oauth-authorization-server

  3. Claude.ai registers itself via Dynamic Client Registration (POST /register) — handled locally by the MCP server (each client gets a virtual client ID)

  4. Claude.ai redirects the user's browser to GitLab's login page using the pre-registered OAuth application

  5. User authenticates; GitLab redirects back to https://claude.ai/api/mcp/auth_callback

  6. Claude.ai sends Authorization: Bearer <token> on every MCP request

  7. Server validates the token with GitLab and stores it per session

Server setup:

docker run -d \
  -e STREAMABLE_HTTP=true \
  -e GITLAB_MCP_OAUTH=true \
  -e GITLAB_OAUTH_APP_ID="your-gitlab-oauth-app-client-id" \
  -e GITLAB_API_URL="https://gitlab.example.com/api/v4" \
  -e MCP_SERVER_URL="https://your-mcp-server.example.com" \
  -p 3002:3002 \
  zereight050/gitlab-mcp

For local development (HTTP allowed):

MCP_DANGEROUSLY_ALLOW_INSECURE_ISSUER_URL=true \
STREAMABLE_HTTP=true \
GITLAB_MCP_OAUTH=true \
GITLAB_OAUTH_APP_ID=your-gitlab-oauth-app-client-id \
MCP_SERVER_URL=http://localhost:3002 \
GITLAB_API_URL=https://gitlab.com/api/v4 \
node build/index.js

Claude.ai configuration:

{
  "mcpServers": {
    "GitLab": {
      "url": "https://your-mcp-server.example.com/mcp"
    }
  }
}

No headers field is needed — Claude.ai obtains the token via OAuth automatically.

Environment variables:

Variable

Required

Description

GITLAB_MCP_OAUTH

Yes

Set to true to enable

GITLAB_OAUTH_APP_ID

Yes

Client ID of the pre-registered GitLab OAuth application

MCP_SERVER_URL

Yes

Public HTTPS URL of your MCP server; also allowed for /mcp Host/Origin checks

GITLAB_API_URL

Yes

Your GitLab instance API URL (e.g. https://gitlab.com/api/v4)

STREAMABLE_HTTP

Yes

Must be true (SSE is not supported)

GITLAB_OAUTH_SCOPES

No

Comma-separated GitLab scopes to request (e.g. api,read_user). Defaults to api (or read_api when GITLAB_READ_ONLY_MODE=true). The pre-registered application must be configured with at least these scopes.

OAUTH_REGISTER_RATE_LIMIT_PER_HOUR

No

Per-IP rolling limit for Dynamic Client Registration (POST /register). Default 20/hour; range 1–1000. Raise when clients (e.g. multiple IDE windows) hit registration throttling. Not a GitLab API limit.

MCP_DANGEROUSLY_ALLOW_INSECURE_ISSUER_URL

No

Set true for local HTTP dev only

Important Notes:

  • MCP OAuth only works with Streamable HTTP transport (SSE=true is incompatible)

  • Each user session stores its own OAuth token — sessions are fully isolated

  • Session timeout, rate limiting, and capacity limits apply identically to the REMOTE_AUTHORIZATION mode (SESSION_TIMEOUT_SECONDS, MAX_REQUESTS_PER_MINUTE, MAX_SESSIONS)

  • DCR rate limiting: POST /register is limited to OAUTH_REGISTER_RATE_LIMIT_PER_HOUR per client IP (default 20/hour). Separate from /mcp limits and GitLab API quotas. See environment-variables.md.

  • Header auth fallback: when Private-Token or JOB-TOKEN request headers are present, OAuth validation is skipped and the raw token is used directly for that session. This allows PATs and CI job tokens to be used alongside the OAuth flow on the same server instance. Authorization: Bearer is always treated as an OAuth token — use Private-Token for PAT-based header auth.

Agent Skill Files

Pre-built skill files are available in skills/gitlab-mcp/ for AI agents that support skill/instruction loading (Claude Code, GitHub Copilot, Cursor, etc.).

  • SKILL.md — Core guide (~800 tokens) with toolset overview, key workflows, and parameter hints

  • reference/ — Detailed workflow docs for code review, merge requests, issues, pipelines, and vulnerability triage

Install with the skills CLI:

npx skills add zereight/gitlab-mcp --skill gitlab-mcp-skill

Register the skill directory in your AI client to get optimal tool usage guidance without relying solely on the full ListTools response.

Tools 🛠️

  1. merge_merge_request - Merge a merge request

  2. approve_merge_request - Approve a merge request

  3. unapprove_merge_request - Unapprove a merge request

  4. get_merge_request_approval_state - Get merge request approval details including approvers

  5. get_merge_request_conflicts - Get the conflicts of a merge request

  6. list_merge_request_pipelines - List pipelines for a merge request with pagination

  7. execute_graphql - Execute a GitLab GraphQL query

  8. create_or_update_file - Create or update a file in a GitLab project

  9. search_repositories - Search for GitLab projects

  10. create_repository - Create a new GitLab project

  11. create_group - Create new group or subgroup

  12. get_file_contents - Get contents of a file or directory from a GitLab project

  13. push_files - Push multiple files in a single commit

  14. create_issue - Create a new issue

  15. create_merge_request - Create a new merge request

  16. fork_repository - Fork a project to your account or specified namespace

  17. create_branch - Create a new branch

  18. get_branch - Get branch details (commit, protection status)

  19. list_branches - List branches in project with search filter

  20. delete_branch - Delete branch from project

  21. list_protected_branches - List protected branches in a project, supports search filter

  22. get_protected_branch - Get details of a single protected branch (access levels, force push settings)

  23. protect_branch - Protect a repository branch (set push/merge/unprotect access levels)

  24. unprotect_branch - Remove protection from a previously protected branch

  25. update_default_branch - Change the default branch of a project

  26. get_merge_request - Get details of a merge request (mergeRequestIid or branchName required). Set include_summaries=true for deployment/commit/approval summaries

  27. get_merge_request_diffs - Get the changes/diffs of a merge request (mergeRequestIid or branchName required)

  28. list_merge_request_changed_files - List changed file paths in a merge request without diff content (mergeRequestIid or branchName required)

  29. list_merge_request_diffs - List merge request diffs with pagination (mergeRequestIid or branchName required)

  30. get_merge_request_file_diff - Get diffs for specific files from a merge request (mergeRequestIid or branchName required)

  31. list_merge_request_versions - List all versions of a merge request

  32. get_merge_request_version - Get a specific version of a merge request

  33. get_branch_diffs - Get diffs between two branches or commits

  34. update_merge_request - Update a merge request (mergeRequestIid or branchName required)

  35. create_note - Create a new note (comment) to an issue or merge request

  36. create_merge_request_thread - Create a new thread on a merge request

  37. resolve_merge_request_thread - Resolve a thread on a merge request

  38. mr_discussions - List discussion items for a merge request

  39. delete_merge_request_discussion_note - Delete a discussion note on a merge request

  40. update_merge_request_discussion_note - Update a discussion note on a merge request

  41. create_merge_request_discussion_note - Add a new discussion note to an existing merge request thread

  42. create_merge_request_note - Add a new note to a merge request

  43. delete_merge_request_note - Delete an existing merge request note

  44. get_merge_request_note - Get a specific note for a merge request

  45. get_merge_request_notes - List notes for a merge request

  46. update_merge_request_note - Modify an existing merge request note

  47. get_draft_note - Get a single draft note from a merge request

  48. list_draft_notes - List draft notes for a merge request

  49. create_draft_note - Create a draft note for a merge request

  50. update_draft_note - Update an existing draft note

  51. delete_draft_note - Delete a draft note

  52. publish_draft_note - Publish a single draft note

  53. bulk_publish_draft_notes - Publish all draft notes for a merge request. Optionally sets reviewer_state and posts a summary note (GitLab 19.2+). Can set reviewer_state even with no drafts.

  54. list_merge_request_emoji_reactions - List all emoji reactions on a merge request

  55. list_merge_request_note_emoji_reactions - List all emoji reactions on a merge request note. Pass discussion_id for discussion thread replies.

  56. create_merge_request_emoji_reaction - Add an emoji reaction to a merge request (e.g. thumbsup, rocket, eyes)

  57. delete_merge_request_emoji_reaction - Remove an emoji reaction from a merge request

  58. create_merge_request_note_emoji_reaction - Add an emoji reaction to a merge request note. Pass discussion_id for discussion thread replies.

  59. delete_merge_request_note_emoji_reaction - Remove an emoji reaction from a merge request note. Pass discussion_id for discussion thread replies.

  60. update_issue_note - Modify an existing issue thread note

  61. create_issue_note - Add a note to an issue, optionally replying to a discussion thread

  62. list_issue_emoji_reactions - List all emoji reactions on an issue

  63. list_issue_note_emoji_reactions - List all emoji reactions on an issue note. Pass discussion_id for discussion thread replies.

  64. create_issue_emoji_reaction - Add an emoji reaction to an issue (e.g. thumbsup, rocket, eyes)

  65. delete_issue_emoji_reaction - Remove an emoji reaction from an issue

  66. create_issue_note_emoji_reaction - Add an emoji reaction to an issue note. Pass discussion_id for discussion thread replies.

  67. delete_issue_note_emoji_reaction - Remove an emoji reaction from an issue note. Pass discussion_id for discussion thread replies.

  68. list_issues - List issues (default: created by current user; use scope='all' for all)

  69. my_issues - List issues assigned to the authenticated user

  70. get_issue - Get details of a specific issue. Returns a slim milestone by default; set full_response=true for the complete milestone object

  71. update_issue - Update an issue. Returns a slim confirmation by default; set full_response=true for the complete updated issue object

  72. update_issue_description_patch - Apply a patch (search/replace or unified diff) to an issue description. Reduces token usage by allowing small changes without sending the full description. Supports dry_run to preview changes and create_note to summarize updates.

  73. delete_issue - Delete an issue

  74. list_todos - List GitLab to-do items for the current user

  75. mark_todo_done - Mark a GitLab to-do item as done

  76. mark_all_todos_done - Mark all pending GitLab to-do items as done for the current user

  77. list_issue_links - List all issue links for a specific issue

  78. list_issue_discussions - List discussions for an issue

  79. get_issue_link - Get a specific issue link

  80. create_issue_link - Create an issue link between two issues

  81. delete_issue_link - Delete an issue link

  82. list_namespaces - List all namespaces (users and groups) available to the current user. Filter by kind='group' for groups only.

  83. get_namespace - Get details of a namespace (user or group) by ID or path. Groups are namespaces with kind='group'.

  84. verify_namespace - Verify if a namespace path exists. Use parent_id to scope the check to a specific parent namespace — required for nested namespaces where the same path may exist under different parents.

  85. get_project - Get details of a specific project

  86. list_projects - List projects accessible by the current user

  87. update_project - Update project settings such as description, visibility, default branch, and feature access levels

  88. list_project_members - List members of a GitLab project

  89. list_group_members - List members of a GitLab group with optional name or username search

  90. list_labels - List labels for a project

  91. get_label - Get a single label from a project

  92. create_label - Create a new label in a project

  93. update_label - Update an existing label in a project

  94. delete_label - Delete a label from a project

  95. list_group_projects - List projects in a group

  96. list_wiki_pages - List wiki pages in a project

  97. get_wiki_page - Get details of a specific wiki page

  98. create_wiki_page - Create a wiki page in a project

  99. update_wiki_page - Update a wiki page in a project

  100. delete_wiki_page - Delete a wiki page from a project

  101. list_group_wiki_pages - List wiki pages in a group

  102. get_group_wiki_page - Get details of a specific group wiki page

  103. create_group_wiki_page - Create a wiki page in a group

  104. update_group_wiki_page - Update a wiki page in a group

  105. delete_group_wiki_page - Delete a wiki page from a group

  106. get_repository_tree - List files and directories in a repository

  107. list_pipelines - List pipelines with filtering options

  108. get_pipeline - Get details of a specific pipeline

  109. get_pipeline_variables - Get variables configured for a pipeline

  110. get_pipeline_test_report - Get pipeline test report

  111. get_pipeline_test_report_summary - Get pipeline test report summary

  112. delete_pipeline - Delete a pipeline. Requires the project Owner role, cannot be undone, and does not automatically delete child pipelines.

  113. update_pipeline_metadata - Update pipeline metadata

  114. list_deployments - List deployments with filtering options

  115. get_deployment - Get deployment details, including approval_summary, approvals, and pending_approval_count when GitLab provides them

  116. create_deployment - Create a deployment

  117. update_deployment - Update a deployment status

  118. delete_deployment - Delete a deployment

  119. list_deployment_merge_requests - List merge requests shipped with a deployment

  120. approve_deployment - Approve or reject a protected-environment deployment

  121. list_environments - List environments in a project

  122. get_environment - Get details of a specific environment

  123. update_environment - Update an environment

  124. delete_environment - Delete a stopped environment

  125. stop_environment - Stop an environment

  126. stop_stale_environments - Stop eligible stale environments; protected environments are excluded and environments are stopped, not deleted

  127. delete_review_app_environments - Schedule deletion of stopped review-app environments one week later; dry_run defaults to true and actual scheduling requires dry_run=false

  128. list_pipeline_triggers - List project pipeline trigger tokens

  129. get_pipeline_trigger - Get a project pipeline trigger

  130. create_pipeline_trigger - Create a project pipeline trigger

  131. update_pipeline_trigger - Update a project pipeline trigger

  132. delete_pipeline_trigger - Delete a project pipeline trigger

  133. trigger_pipeline - Trigger a pipeline with a pipeline trigger token

  134. list_pipeline_jobs - List all jobs in a specific pipeline

  135. list_pipeline_trigger_jobs - List trigger jobs (bridges) in a pipeline

  136. get_pipeline_job - Get details of a GitLab pipeline job number

  137. get_pipeline_job_output - Get the output/trace of a pipeline job with optional pagination

  138. validate_ci_lint - Validate provided GitLab CI/CD YAML content for a project

  139. validate_project_ci_lint - Validate an existing .gitlab-ci.yml configuration for a project

  140. list_ci_catalog_resources - List GitLab CI/CD Catalog resources/components visible to the user

  141. get_ci_catalog_resource - Get details for a GitLab CI/CD Catalog resource, including versions and components

  142. create_pipeline - Create a new pipeline for a branch or tag

  143. retry_pipeline - Retry a failed or canceled pipeline

  144. cancel_pipeline - Cancel a running pipeline

  145. list_pipeline_schedules - List pipeline schedules in a project, optionally filtered to active or inactive

  146. get_pipeline_schedule - Get details of a specific pipeline schedule, including its variables and last pipeline

  147. list_pipeline_schedule_pipelines - List the pipelines that a pipeline schedule has triggered

  148. create_pipeline_schedule - Create a new pipeline schedule for a branch or tag

  149. update_pipeline_schedule - Update an existing pipeline schedule

  150. delete_pipeline_schedule - Delete a pipeline schedule

  151. play_pipeline_schedule - Run a pipeline schedule immediately

  152. take_ownership_pipeline_schedule - Take ownership of a pipeline schedule

  153. get_pipeline_schedule_variable - Get a single variable of a pipeline schedule

  154. create_pipeline_schedule_variable - Create a variable for a pipeline schedule

  155. update_pipeline_schedule_variable - Update a variable of a pipeline schedule

  156. delete_pipeline_schedule_variable - Delete a variable from a pipeline schedule

  157. play_pipeline_job - Run a manual pipeline job

  158. play_pipeline_jobs - Play multiple manual pipeline jobs sequentially

  159. retry_pipeline_job - Retry a failed or canceled pipeline job

  160. cancel_pipeline_job - Cancel a running pipeline job

  161. erase_pipeline_job - Erase a pipeline job log and artifacts

  162. wait_for_pipeline - Wait for a pipeline to reach a terminal status

  163. wait_for_job - Wait for a job to reach a terminal status

  164. list_job_artifacts - List artifact files in a job's archive

  165. download_job_artifacts - Download job artifact archive (zip) and save to a local path

  166. get_job_artifact_file - Get content of a single file from a job's artifacts

  167. list_merge_requests - List merge requests (without project_id: user's MRs; with project_id: project MRs)

  168. list_group_merge_requests - List merge requests across all projects of a group and its subgroups

  169. list_milestones - List milestones with filtering options

  170. get_milestone - Get details of a specific milestone

  171. create_milestone - Create a new milestone

  172. edit_milestone - Edit an existing milestone

  173. delete_milestone - Delete a milestone

  174. get_milestone_issue - Get issues associated with a specific milestone

  175. get_milestone_merge_requests - Get merge requests associated with a specific milestone

  176. promote_milestone - Promote a milestone to the next stage

  177. get_milestone_burndown_events - Get burndown events for a specific milestone

  178. list_group_milestones - List group milestones with filtering options

  179. get_group_milestone - Get details of a specific group milestone

  180. create_group_milestone - Create a new group milestone

  181. edit_group_milestone - Edit an existing group milestone

  182. delete_group_milestone - Delete a group milestone

  183. get_group_milestone_issue - Get issues associated with a specific group milestone

  184. get_group_milestone_merge_requests - Get merge requests associated with a specific group milestone

  185. get_group_milestone_burndown_events - Get burndown events for a specific group milestone

  186. get_users - Get GitLab user details by usernames

  187. get_user - Get user details by ID

  188. whoami - Get current authenticated user details

  189. list_commits - List repository commits with filtering options

  190. get_commit - Get details of a specific commit

  191. get_commit_diff - Get changes/diffs of a specific commit

  192. get_file_blame - Get git blame for a file at a given ref. Each entry maps a contiguous range of source lines to the commit that last changed them (id, author, authored_date, message). Use range_start/range_end to limit blame to specific lines.

  193. list_commit_statuses - List statuses for a commit

  194. create_commit_status - Create or update the status of a commit

  195. list_group_iterations - List group iterations with filtering options

  196. upload_markdown - Upload a file for use in markdown content

  197. download_attachment - Download an uploaded file from a project (images returned as base64; use local_path to save to disk)

  198. health_check - Verify server status and authentication. Always reports the MCP server version (mcp_server_version). When authenticated, also reports the GitLab instance version from GET /api/v4/version (version, revision, enterprise). Version lookup failures do not fail the health check — those fields are omitted.

  199. list_events - List events for the authenticated user (before/after: YYYY-MM-DD)

  200. get_project_events - List events for a project (before/after: YYYY-MM-DD)

  201. list_releases - List all releases for a project

  202. get_release - Get a release by tag name

  203. create_release - Create a new release

  204. update_release - Update an existing release

  205. delete_release - Delete a release (does not delete the tag)

  206. create_release_evidence - Create release evidence (Premium/Ultimate)

  207. download_release_asset - Download a release asset file by direct asset path

  208. list_tags - List repository tags for a project

  209. get_tag - Get a repository tag by name

  210. create_tag - Create a new repository tag

  211. delete_tag - Delete a repository tag

  212. get_tag_signature - Get the X.509 signature of a signed tag (404 if unsigned)

  213. get_work_item - Get a work item with full details including status, hierarchy, type, and widgets

  214. list_work_items - List work items with filters (type, state, search, assignees, labels)

  215. create_work_item - Create a work item (issue, task, incident, epic, etc.) with full field support

  216. update_work_item - Update a work item (title, description, labels, assignees, state, parent, custom fields, etc.)

  217. convert_work_item_type - Convert a work item to a different type

  218. list_work_item_statuses - List available statuses for a work item type (Premium/Ultimate)

  219. list_custom_field_definitions - List custom field definitions for a work item type

  220. move_work_item - Move a work item to a different project

  221. list_work_item_notes - List notes and discussions on a work item

  222. create_work_item_note - Add a note to a work item (supports Markdown, internal notes, threads)

  223. list_work_item_emoji_reactions - List all emoji reactions on a work item

  224. list_work_item_note_emoji_reactions - List all emoji reactions on a work item note (comment, thread, or thread reply)

  225. create_work_item_emoji_reaction - Add an emoji reaction to a work item (e.g. thumbsup, rocket, eyes)

  226. delete_work_item_emoji_reaction - Remove an emoji reaction from a work item

  227. create_work_item_note_emoji_reaction - Add an emoji reaction to a work item note (comment, thread, or thread reply)

  228. delete_work_item_note_emoji_reaction - Remove an emoji reaction from a work item note (comment, thread, or thread reply)

  229. get_timeline_events - List timeline events for an incident

  230. create_timeline_event - Create a timeline event on an incident

  231. list_webhooks - List webhooks for a project or group

  232. create_webhook - Create a webhook on a project or group

  233. update_webhook - Update an existing project or group webhook

  234. delete_webhook - Delete a project or group webhook

  235. list_webhook_events - List recent webhook events (past 7 days)

  236. get_webhook_event - Get full details of a specific webhook event

  237. search_code - Search for code across all projects (requires advanced search or Zoekt)

  238. search_project_code - Search for code within a specific project (requires advanced search or Zoekt)

  239. search_group_code - Search for code within a specific group (requires advanced search or Zoekt)

  240. list_project_variables - List CI/CD variables for a project

  241. get_project_variable - Get a single CI/CD variable from a project

  242. create_project_variable - Create a CI/CD variable for a project

  243. update_project_variable - Update an existing CI/CD variable in a project

  244. delete_project_variable - Delete a CI/CD variable from a project

  245. list_group_variables - List CI/CD variables for a group

  246. get_group_variable - Get a single CI/CD variable from a group

  247. create_group_variable - Create a CI/CD variable for a group

  248. update_group_variable - Update an existing CI/CD variable in a group

  249. delete_group_variable - Delete a CI/CD variable from a group

  250. get_dependency_proxy_settings - Get dependency proxy settings for a group

  251. update_dependency_proxy_settings - Update dependency proxy settings for a group (enable/disable, credentials for authenticated Docker Hub pulls)

  252. list_dependency_proxy_blobs - List cached dependency proxy blobs for a group

  253. purge_dependency_proxy_cache - Schedule purge of all cached dependency proxy blobs for a group

  254. list_project_vulnerabilities - List vulnerabilities for a project with optional state, severity, and report type filters (GraphQL-backed, cursor pagination)

  255. get_vulnerability - Get full details of a specific vulnerability

  256. dismiss_vulnerability - Dismiss a vulnerability with a reason (acceptable_risk, false_positive, used_in_tests, mitigating_control, not_applicable) and optional comment

  257. confirm_vulnerability - Confirm a vulnerability as a real finding requiring remediation

  258. orbit_query - Execute a GitLab Orbit graph query over the indexed SDLC knowledge graph

  259. orbit_get_schema - Fetch the current GitLab Orbit graph schema (node and edge types)

  260. orbit_get_status - Check GitLab Orbit indexing status for the enabled scope

  261. orbit_list_tools - List the MCP tool definitions exposed by GitLab Orbit

  262. discover_tools - Discover and activate additional tool categories for this session. Available categories: merge_requests, issues, repositories, branches, projects, labels, ci, groups, pipelines, milestones, wiki, releases, tags, users, workitems, webhooks, search, variables, dependency_proxy, vulnerabilities, orbit. Already-active categories are listed in the response.

Wiki page titles vs. slugs

GitLab derives a wiki page's slug (its URL, /-/wikis/<slug>) from the page title. Passing title to update_wiki_page / update_group_wiki_page therefore renames the page and changes its URL — for nested pages it can also move the page to a different path — which breaks existing links.

To change only the displayed title while keeping the URL stable, do not pass title. Instead, store the display title in the page content's YAML front matter and update the content:

---
title: My Custom Display Title
---

Page body…

GitLab keeps the slug/URL untouched and shows the front-matter title in the UI. Read it back with get_wiki_page using render_html: true, which populates the front_matter field — the plain title field always reflects the slug-derived value.

Testing 🧪

The project includes comprehensive test coverage including remote authorization:

# Run all tests (API validation + remote auth)
npm test

# Run only remote authorization tests
npm run test:remote-auth

# Run all tests including readonly MCP tests
npm run test:all

# Run only API validation
npm run test:integration

All remote authorization tests use a mock GitLab server and do not require actual GitLab credentials.

Available Tools

118 tools
approve_merge_requestA

Approve a merge request. Use this to record an approval on an existing merge request; it does not merge the request or change its source branch. The operation changes review state, may require re-authentication or approval permission, and returns the updated approval result or a permission/state error.

ParametersJSON Schema
NameRequiredDescriptionDefault
shaNoThe HEAD of the merge request. Optional, but used to ensure the merge request hasn't changed since you last reviewed it
jmespathNoOptional JMESPath expression filtering the JSON result before return.
project_idYesProject ID or complete URL-encoded path to project
approval_passwordNoCurrent user's password. Required if 'Require user re-authentication to approve' is enabled in the project settings
merge_request_iidYesThe IID of the merge request to approve

TDQS

A4.2/5.0
Behavior4/5

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

Annotations only provide openWorldHint: true, so the description carries the burden of behavioral disclosure. It states that the operation changes review state, may require re-authentication or approval permission, and returns an updated approval result or an error. This adds meaningful context beyond the annotation and aligns with the openWorldHint without contradiction.

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?

The description is two sentences with no redundancy. The first sentence states the core purpose and the key exclusion (does not merge), and the second covers side effects, authentication, and return type. Information is front-loaded and 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?

Given the tool has 5 parameters and no output schema, the description adequately covers the return value ('updated approval result or a permission/state error') and the key side effect (review state change). It doesn't elaborate on parameter usage, but the schema covers that. The only minor gap is not mentioning the `sha` concurrency check, but that is documented in the schema.

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%, so all five parameters are already documented in the input schema. The description does not add extra parameter-level detail, which is acceptable given the schema's thoroughness. Baseline 3 is appropriate because the schema handles the parameter explanations.

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 clearly states the verb (approve), the resource (merge request), and the exact scope: it records an approval and explicitly clarifies it does not merge or change the source branch. This distinguishes it from sibling tools like merge_merge_request and unapprove_merge_request.

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 description says 'Use this to record an approval on an existing merge request' and contrasts with merging, so the agent knows when to call it. It also mentions potential re-authentication and permission requirements, giving practical usage context. It doesn't explicitly name alternatives like unapprove, but the core distinction from merge is sufficient.

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

bulk_publish_draft_notesA

Publish all draft notes for a merge request. Optionally sets reviewer_state and posts a summary note (GitLab 19.2+). Can set reviewer_state even with no drafts. Use this for the specific operation described; choose a sibling tool when you need a different resource or lifecycle action. It changes remote GitLab state and requires the necessary project or group permission; GitLab returns validation, conflict, permission, or rate-limit errors instead of silently applying an invalid request. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
noteNoSummary note body to post on the merge request (GitLab 19.2+)
internalNoIf true, the summary note is internal (GitLab 19.2+, default false)
jmespathNoOptional JMESPath expression filtering the JSON result before return.
project_idYesProject ID or complete URL-encoded path to project
reviewer_stateNoSet reviewer review state after publishing (GitLab 19.2+). Does not record a formal approval. Works even with no draft notes.
merge_request_iidYesThe IID of a merge request

TDQS

A3.9/5.0
Behavior4/5

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

The annotations only provide openWorldHint=true, which is a weak signal. The description adds valuable context: it changes remote GitLab state, requires permissions, and returns validation/conflict/permission/rate-limit errors instead of silently failing. It also discloses the non-obvious behavior of setting reviewer_state without drafts. This goes beyond the annotation and helps agents anticipate side effects.

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?

The description is front-loaded with the primary action, followed by optional features, then guidance and behavioral notes. It is not excessively long, but the sentence 'Use this for the specific operation described; choose a sibling tool when you need a different resource or lifecycle action' is somewhat redundant and adds little information. Overall, it is reasonably tight and structured.

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 no output schema, the description covers the essential aspects: what it does, optional parameters, permission requirements, and error behavior. It does not describe the success response, but this is not critical given the clear operation and the presence of many sibling tools with similar patterns. The description is sufficient for correct invocation.

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 the schema already documents each parameter. The description's only parameter guidance is a generic instruction to provide project_id as numeric ID or URL-encoded path and to follow schema exactly. This adds minimal value beyond the schema and does not give per-parameter insights, so it meets the baseline but not more.

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 opens with 'Publish all draft notes for a merge request', clearly stating the verb, resource, and scope. The use of 'all' and the tool name 'bulk_publish' distinguish it from the sibling 'publish_draft_note' (singular). It also mentions optional actions (reviewer_state, summary note) without obscuring the core purpose.

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 guidance to 'choose a sibling tool when you need a different resource or lifecycle action' is too generic and does not name any specific alternative (e.g., publish_draft_note for a single note). It does mention the specific condition 'Can set reviewer_state even with no drafts', which is a useful behavior but not a tool-selection guideline. Overall, it lacks explicit when-to-use versus sibling distinctions.

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

create_branchA

Create a new branch. Use this to create a branch from a branch, tag, or commit; use get_branch or list_branches to inspect branches and protect_branch to configure protection afterward. The operation changes remote repository state, requires branch-creation permission, and returns the new branch or a validation, missing-ref, protected-project, or already-exists error. project_id accepts a numeric ID or URL-encoded path, branch is the new name, and ref selects its starting revision.

ParametersJSON Schema
NameRequiredDescriptionDefault
refNoSource branch/commit for new branch
branchYesName for the new branch
jmespathNoOptional JMESPath expression filtering the JSON result before return.
project_idYesProject ID or complete URL-encoded path to project

TDQS

A4.4/5.0
Behavior4/5

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

With only openWorldHint in annotations, the description carries the behavioral disclosure burden. It states the operation changes remote repository state, requires branch-creation permission, and returns the new branch or specific error types (validation, missing-ref, protected-project, already-exists). It does not cover default ref behavior or idempotency, but it is substantially transparent.

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 core action, followed by usage routing, behavioral disclosure, and parameter clarifications. No filler or repeated schema text; 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?

Covers what the tool does, when to use it, what can go wrong, and key parameter semantics. Since there is no output schema, explicitly naming the returned new branch or errors is valuable. Minor omissions such as default ref behavior keep it just short of fully 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 coverage is 100% for all four parameters, so the baseline is 3. The description adds modest value by clarifying ref can select from a branch, tag, or commit, and that project_id accepts a numeric ID or URL-encoded path, but the jmespath parameter is not mentioned and the schema already documents the properties well.

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 'Create a new branch' with a specific verb and resource, and distinguishes itself from branch-related siblings by naming get_branch/list_branches for inspection and protect_branch for later protection. The scope is clear and an agent can differentiate it 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 Guidelines5/5

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

Explicitly says 'Use this to create a branch from a branch, tag, or commit' and points to get_branch/list_branches for inspection and protect_branch for configuring protection. This gives concrete routing guidance and clarifies when to choose this tool over relevant alternatives.

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

create_commit_statusA

Create or update the status of a commit. Use this for a new resource or action; choose the corresponding update or edit tool when the resource already exists. It changes remote GitLab state and requires the necessary project or group permission; GitLab returns validation, conflict, permission, or rate-limit errors instead of silently applying an invalid request. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
refNoThe branch or tag ref
shaYesThe commit hash to set the status on
nameNoStatus name. GitLab defaults to 'default' when omitted.
stateYesCommit status state
contextNoAlias for name. Provide either name or context, not both.
coverageNoTotal code coverage for this status
jmespathNoOptional JMESPath expression filtering the JSON result before return.
project_idYesProject ID or complete URL-encoded path to project
target_urlNoTarget URL associated with this status
descriptionNoShort status description
pipeline_idNoPipeline ID to attach the status to

TDQS

A3.6/5.0
Behavior4/5

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

The description explicitly says the tool changes remote GitLab state, requires project or group permission, and surfaces GitLab's error behavior (validation, conflict, permission, rate-limit) instead of silently applying invalid requests. This adds real behavioral context well beyond the minimal readOnly/destructive annotations, which here are absent; it covers mutation, auth needs, and error mode without contradicting the openWorldHint annotation.

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

Conciseness3/5

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

The description is front-loaded with purpose and contains a good behavioral sentence about state change and errors. However, the final sentence drifts into boilerplate about 'required identifiers and pagination fields' and mentions group_id where the schema does not accept one, making the structure less disciplined than it could be.

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?

Given 11 parameters, no output schema, and minimal annotations, the description still covers what the tool does, when to use it, that it mutates remote state, what permissions are needed, and how errors surface. It is incomplete only in that it does not resolve the discrepancy between the described update behavior and the absence of a dedicated update alternative in the sibling tool list.

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%, so the schema already documents all parameters and parameter semantics, which sets a baseline of 3. The description adds a useful note about numeric IDs or URL-encoded paths, but it also references group_id and pagination fields in a way that is generic and not represented in the schema, so its added value over the schema is only partial.

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 first sentence names a specific resource ('status of a commit') and an explicit action ('Create or update'), so the agent can tell what the tool acts on. It also tries to position this against an update/edit alternative, distinguishing it from list-only commit status tools. It loses a point because 'create or update' is immediately undercut by the instruction to prefer an update/edit tool for existing resources, and no corresponding update_commit_status sibling exists in the tool list.

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 states a clear new-vs-existing rule: use this for a new resource or action, and choose the update or edit tool when the resource already exists. However, the alternative is referenced generically rather than by name, and the sibling set has no update_commit_status tool, making the guidance less actionable and slightly inconsistent with the claim that this tool can already update.

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

create_draft_noteA

Create a draft note for a merge request. Use this for a new resource or action; choose the corresponding update or edit tool when the resource already exists. It changes remote GitLab state and requires the necessary project or group permission; GitLab returns validation, conflict, permission, or rate-limit errors instead of silently applying an invalid request. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyYesThe content of the draft note
jmespathNoOptional JMESPath expression filtering the JSON result before return.
positionNoPosition when creating a diff note
project_idYesProject ID or complete URL-encoded path to project
merge_request_iidYesThe IID of a merge request
resolve_discussionNoWhether to resolve the discussion when publishing
in_reply_to_discussion_idNoThe ID of a discussion the draft note replies to

TDQS

A4.1/5.0
Behavior4/5

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

With minimal annotations (only openWorldHint), the description carries the behavioral disclosure burden and does so well: it states that the tool 'changes remote GitLab state,' requires necessary project/group permission, and reports validation, conflict, permission, or rate-limit errors instead of silently applying invalid requests. This gives agents a clear picture of side effects and failure behavior, though it does not explicitly mention that draft notes remain unpublished until a separate publish action.

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?

The description is compact and front-loaded with the core purpose, followed by usage, side-effect, and identifier guidance. It is not bloated, though the final sentence contains somewhat boilerplate wording about pagination fields that does not apply to this tool.

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?

Given a complex nested schema with 7 parameters and no output schema, the description adequately covers the essential context: what the tool does, when to use it, that it mutates remote state, that permissions are required, and how errors surface. It does not explain the draft-note lifecycle or how position/discussion parameters relate to GitLab semantics, but the schema itself provides detailed documentation for those fields.

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 the schema already documents all parameters thoroughly and the baseline is 3. The description adds only generic guidance about providing numeric IDs or URL-encoded paths and using required identifiers; this mostly restates the schema's project_id description. The mention of 'group_id' and 'pagination fields' is not directly relevant to this tool's schema, so it adds little semantic value.

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 opens with a specific verb and resource: 'Create a draft note for a merge request.' It also distinguishes this creation tool from update/edit tools by stating to use it for new resources and to choose the corresponding update/edit tool when the resource already exists. This clearly separates it from siblings like update_draft_note and publish_draft_note.

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 description provides explicit guidance: use it for a new resource or action, and choose the corresponding update or edit tool when the resource already exists. However, it does not name the specific sibling tools or explain when to prefer this over related create tools like create_note or create_merge_request_note, so the exclusion guidance is generic rather than concrete.

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

create_groupA

Create new group or subgroup. Use this for a new resource or action; choose the corresponding update or edit tool when the resource already exists. It changes remote GitLab state and requires the necessary project or group permission; GitLab returns validation, conflict, permission, or rate-limit errors instead of silently applying an invalid request. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesThe name of the group
pathYesThe path of the group
jmespathNoOptional JMESPath expression filtering the JSON result before return.
parent_idNoThe parent group ID for creating a subgroup
visibilityNoThe group's visibility level
descriptionNoThe group's description

TDQS

A3.8/5.0
Behavior4/5

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

Annotations only provide openWorldHint, so the description carries the burden of behavioral disclosure. It does this well by stating that the tool 'changes remote GitLab state,' requires permission, and that GitLab returns validation, conflict, permission, and rate-limit errors rather than silently accepting invalid requests. It does not cover idempotency or duplicate handling, but the major behavioral traits are disclosed.

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

Conciseness3/5

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

The description is reasonably brief and front-loads the core purpose, but the final sentence about identifiers and pagination is boilerplate that does not apply to this schema. It adds noise without earning its place.

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?

The description covers purpose, when to use, mutation side effects, permissions, and error behavior. However, with no output schema, it never states what a successful create returns, and the irrelevant parameter guidance leaves a gap. It is sufficient for a competent call, but not fully complete.

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 coverage is 100%, so the baseline is 3, but the description adds a confusing and partially misleading sentence referencing 'project_id' or 'group_id' and 'pagination fields' that do not appear anywhere in the input schema. It also adds no real semantic value to important parameters like parent_id beyond what the schema already states.

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 opens with a specific verb and resource: 'Create new group or subgroup.' This unambiguously distinguishes it from sibling creation tools like create_repository, create_issue, or create_merge_request, and clarifies that it covers both top-level groups and subgroups.

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 explicitly says to use this tool for new resources and to choose the corresponding update or edit tool when the resource already exists. The guidance is clear, though it does not name the exact sibling update tool, which keeps it from being a full 5.

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

create_issueA

Create a new issue. Use this to open a new issue; use update_issue for an existing issue and create_issue_note to add discussion without changing issue fields. The operation creates remote project data, requires issue creation permission, and returns the new issue or a validation, permission, or duplicate-related error.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYesIssue title
labelsNoArray of label names
weightNoWeight of the issue (numeric, typically hours of work)
jmespathNoOptional JMESPath expression filtering the JSON result before return.
issue_typeNoThe type of issue. One of issue, incident, test_case or task.issue
project_idYesProject ID or complete URL-encoded path to project
descriptionNoIssue description
assignee_idsNoArray of user IDs to assign
milestone_idNoMilestone ID to assign

TDQS

A4.3/5.0
Behavior4/5

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

Annotations only provide openWorldHint, so the description carries most of the behavioral disclosure burden. It clearly states the operation creates remote project data, requires issue creation permission, and returns the new issue or validation/permission/duplicate errors. This gives an agent meaningful expectations about side effects and failure modes.

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?

The description is short and front-loaded, with the primary action first and the usage alternatives following. The only minor redundancy is 'Create a new issue' followed by 'Use this to open a new issue,' but overall it is tightly written and information-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?

Despite having 9 parameters and no output schema, the description covers the core behavioral contract: creation, permission requirement, expected return value, and likely error categories. Optional parameters are fully covered by the schema, so nothing essential is missing for agent decision-making.

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 parameters are already well-documented in the input schema. The description adds no parameter-specific semantics beyond the high-level mention of the result and error cases, which is consistent with the baseline 3 for full schema coverage.

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 uses a specific verb and resource ('Create a new issue') and immediately differentiates itself from sibling tools: update_issue for existing issues and create_issue_note for discussion-only additions. An agent can confidently select this tool without inspecting sibling schemas.

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?

Explicit guidance is provided: use this tool to open a new issue, update_issue for an existing issue, and create_issue_note for adding discussion without changing issue fields. This directly answers when-to-use and when-not-to-use, with named alternatives.

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

create_issue_emoji_reactionA

Add an emoji reaction to an issue (e.g. thumbsup, rocket, eyes). Use this for a new resource or action; choose the corresponding update or edit tool when the resource already exists. It changes remote GitLab state and requires the necessary project or group permission; GitLab returns validation, conflict, permission, or rate-limit errors instead of silently applying an invalid request. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesName of the emoji without colons (e.g. 'thumbsup', 'rocket', 'eyes')
jmespathNoOptional JMESPath expression filtering the JSON result before return.
issue_iidYesThe IID of an issue
project_idYesProject ID or complete URL-encoded path to project

TDQS

A4/5.0
Behavior4/5

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

Annotations only provide openWorldHint, so the description carries the behavioral burden. It explicitly discloses that the tool changes remote GitLab state, requires permissions, and surfaces validation, conflict, permission, or rate-limit errors rather than silently succeeding. This is useful beyond the annotations and matches the annotation semantics.

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

Conciseness3/5

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

The core action and examples are front-loaded and readable, but the description includes boilerplate such as 'use required identifiers and pagination fields exactly as documented' and a generic new-vs-update rule that is not specifically tailored to emoji reactions. Some sentences add noise rather than tool-specific value.

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 create operation with no output schema, the description covers the essential facts: mutation, permission needs, error behavior, and identifier format. It does not describe the response or duplicate-reaction behavior, but this is not required given the tool's simplicity and the schema coverage.

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 all parameters including the emoji name examples. The description restates the project_id format mentioned in the schema and adds no new parameter-level semantics. Baseline 3 applies because the schema already carries the documentation weight.

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 action and resource: 'Add an emoji reaction to an issue', with concrete examples ('thumbsup', 'rocket'). The issue scope distinguishes it from sibling reaction tools for merge requests and notes, so an agent can identify the correct target 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?

Gives a clear creation context: use this for a new resource/action and prefer update/edit tools for existing resources. It also notes permission requirements and error behavior. It does not explicitly name alternate siblings like create_issue_note_emoji_reaction, so it stops short of full alternative routing.

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

create_issue_noteA

Add a note to an issue, optionally replying to a discussion thread. Use this to add a note to an existing issue, optionally as a reply to a discussion; use update_issue for issue fields and create_note only when the generic endpoint is required. The operation creates remote discussion content, requires note permission, and returns the note or a missing-issue/thread/permission error.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyYesThe content of the note or reply
jmespathNoOptional JMESPath expression filtering the JSON result before return.
issue_iidYesThe IID of an issue
created_atNoDate the note was created at (ISO 8601 format)
project_idYesProject ID or complete URL-encoded path to project
discussion_idNoThe ID of a thread. If provided, replies to that thread; otherwise creates a top-level note

TDQS

A4.3/5.0
Behavior4/5

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

Annotations only include openWorldHint, which is a minimal hint about side effects. The description carries the burden and discloses that the operation 'creates remote discussion content', requires note permission, and returns the note or a missing-issue/thread/permission error. This goes beyond the sparse annotation and gives the agent a clear behavioral model, including side effects, authorization, and error cases.

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?

The description is three sentences, but the second sentence partially repeats the first ('add a note to an existing issue, optionally as a reply to a discussion') before adding the guidance. It is still concise and front-loaded with the primary action, though the redundancy prevents a perfect score.

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?

Given the tool's moderate complexity (6 parameters, no output schema, minimal annotations), the description covers the core purpose, usage guidance, permission requirement, and error outcomes. It doesn't explain the jmespath or created_at parameters, but the schema already defines them, and the description is otherwise sufficient for an agent to call it 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?

The input schema already documents all 6 parameters with descriptions (100% coverage). The description adds no parameter-specific detail beyond what the schema provides; the only related phrase, 'optionally replying to a discussion thread', merely restates what discussion_id already says in the schema. With full schema coverage, a baseline of 3 is appropriate.

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 clearly states 'Add a note to an issue, optionally replying to a discussion thread', which is a specific verb+resource action. It explicitly differentiates from siblings by naming update_issue for issue fields and create_note for the generic endpoint, so an agent can immediately distinguish this tool from related ones without inspecting schemas.

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?

It provides explicit when-to-use guidance: 'Use this to add a note to an existing issue, optionally as a reply to a discussion; use update_issue for issue fields and create_note only when the generic endpoint is required.' This also covers when not to use it and names the alternatives, leaving no ambiguity.

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

create_issue_note_emoji_reactionA

Add an emoji reaction to an issue note. Pass discussion_id for discussion thread replies. Use this for a new resource or action; choose the corresponding update or edit tool when the resource already exists. It changes remote GitLab state and requires the necessary project or group permission; GitLab returns validation, conflict, permission, or rate-limit errors instead of silently applying an invalid request. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesName of the emoji without colons (e.g. 'thumbsup', 'rocket', 'eyes')
note_idYesThe ID of a note (comment or thread reply)
jmespathNoOptional JMESPath expression filtering the JSON result before return.
issue_iidYesThe IID of an issue
project_idYesProject ID or complete URL-encoded path to project
discussion_idNoThe ID of a discussion thread. Required for notes that are discussion replies; omit for top-level notes.

TDQS

A3.6/5.0
Behavior4/5

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

The description explicitly discloses that the call mutates remote GitLab state, requires project/group permission, and surfaces validation, conflict, permission, or rate-limit errors rather than failing silently. The openWorldHint annotation is weak, so this behavioral and error-mode context is meaningful and goes 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.

Conciseness3/5

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

The first two sentences are sharp, but the third and fifth are generic boilerplate that could apply to any create tool, and the final sentence references group_id and pagination not present in the schema. The core information is front-loaded, but the extra sentences dilute the description.

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 mutating tool with no output schema and only an openWorldHint annotation, the description provides the key operational facts: what resource is targeted, when discussion_id is required, what permissions are needed, and what error classes to expect. It does not describe the success return value, but that is a minor gap for a create action whose schema already documents required identifiers.

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?

All six parameters are already described in the schema, so the baseline is 3. The description adds a useful clarification for discussion_id ('required for notes that are discussion replies') but repeats project_id schema text and introduces irrelevant references to group_id and pagination fields that do not exist in this schema.

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 opening sentence names the exact action and resource: adding an emoji reaction to an issue note, which distinguishes it from issue-level reaction and MR note reaction siblings. The discussion_id mention further clarifies the target as a note in a discussion thread.

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?

The only tool-selection guidance is a generic 'use this for a new resource... choose update/edit tool when it already exists' line, which is not tailored to this resource and is misleading because no update-emoji-reaction sibling exists. It does not explicitly route agents away from create_issue_emoji_reaction or create_merge_request_note_emoji_reaction, and the discussion_id guidance is about a parameter rather than tool choice.

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

create_labelA

Create a new label in a project. Use this for a new resource or action; choose the corresponding update or edit tool when the resource already exists. It changes remote GitLab state and requires the necessary project or group permission; GitLab returns validation, conflict, permission, or rate-limit errors instead of silently applying an invalid request. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesThe name of the label
colorYesThe color of the label given in 6-digit hex notation with leading '#' sign
jmespathNoOptional JMESPath expression filtering the JSON result before return.
priorityNoThe priority of the label
project_idYesProject ID or URL-encoded path
descriptionNoThe description of the label

TDQS

A4.5/5.0
Behavior5/5

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

With only openWorldHint in annotations, the description carries the disclosure burden and meets it well: it states that the tool 'changes remote GitLab state,' requires 'the necessary project or group permission,' and that GitLab returns 'validation, conflict, permission, or rate-limit errors instead of silently applying an invalid request.' This gives concrete behavioral expectations.

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?

The description is front-loaded with the core purpose and is reasonably compact. However, the final sentence contains boilerplate about identifiers and pagination fields that adds little specific value and could be trimmed.

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?

The description covers purpose, usage timing, side effects, permissions, error behavior, and identifier format, which is strong for a create operation. Since there is no output schema, it could have explicitly stated that the created label is returned, but the absence is a minor gap given the otherwise thorough context.

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 the schema already documents every parameter. The description adds only general guidance about numeric IDs or URL-encoded paths, which mostly repeats the schema's project_id description; the mention of 'pagination fields' is generic and not represented in this schema, so it does not meaningfully improve parameter understanding.

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 opens with a specific verb and resource: 'Create a new label in a project.' It also distinguishes itself from update/edit tools by saying to 'choose the corresponding update or edit tool when the resource already exists,' which separates it from siblings like update_label and delete_label.

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?

The description explicitly states when to use this tool ('for a new resource or action') and when not to ('choose the corresponding update or edit tool when the resource already exists'). It also adds operational context about required permissions and remote state changes, giving an agent clear selection criteria.

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

create_merge_requestA

Create a new merge request. Use this to open a new merge request from an existing source branch to a target branch; use update_merge_request after it exists. The operation creates remote review state, requires project access, and returns the new merge request or a validation, permission, branch, or duplicate-related error.

ParametersJSON Schema
NameRequiredDescriptionDefault
draftNoCreate as draft merge request
titleYesMerge request title
labelsNoLabels for the MR
squashNoIf true, squash all commits into a single commit on merge.
jmespathNoOptional JMESPath expression filtering the JSON result before return.
project_idYesProject ID or complete URL-encoded path to project
descriptionNoMerge request description
assignee_idsNoThe ID of the users to assign the MR to
reviewer_idsNoThe ID of the users to assign as reviewers of the MR
source_branchYesBranch containing changes
target_branchYesBranch to merge into
target_project_idNoNumeric ID of the target project.
allow_collaborationNoAllow commits from upstream members
remove_source_branchNoFlag indicating if a merge request should remove the source branch when merging.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations only include openWorldHint, so the description carries the behavioral burden. It discloses that the operation 'creates remote review state' (side effect), 'requires project access' (permission prerequisite), and describes return behavior including error categories. These are meaningful, non-obvious behavioral traits not in 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?

Three sentences with no fluff. The purpose is front-loaded, followed by usage guidance, then behavioral context. 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?

For a 14-parameter creation tool with no output schema, the description adequately covers purpose, lifecycle sequencing, side effects, permission requirements, and error outcomes. It provides enough for an agent to invoke the tool and interpret the response correctly without needing the schema for high-level semantics.

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 the baseline is 3. The description only reuses terms like 'source branch' and 'target branch' that are already explained in the schema; it adds no additional parameter-level meaning, but does not need to given full schema coverage.

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 the specific action ('Create a new merge request'), the resource ('merge request'), and the context (from existing source branch to target branch). Explicitly differentiates from the sibling `update_merge_request` by stating the lifecycle order, so an agent can clearly distinguish when to create vs. update.

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?

Provides explicit guidance: 'Use this to open a new merge request from an existing source branch to a target branch; use `update_merge_request` after it exists.' This gives a clear when-to-use condition and names the alternative, making tool selection unambiguous.

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

create_merge_request_discussion_noteA

Add a new discussion note to an existing merge request thread. Use this to reply inside an existing merge request discussion; use create_merge_request_thread to start a new thread and create_merge_request_note for a top-level note. The operation creates remote review content, requires note permission, and returns the new note or a missing-discussion/position/permission error.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyYesThe content of the note or reply
jmespathNoOptional JMESPath expression filtering the JSON result before return.
created_atNoDate the note was created at (ISO 8601 format)
project_idYesProject ID or complete URL-encoded path to project
discussion_idYesThe ID of a thread
merge_request_iidYesThe IID of a merge request

TDQS

A4.7/5.0
Behavior5/5

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

Annotations provide only openWorldHint, leaving behavioral disclosure to the description. The description clearly states that the operation creates remote review content, requires note permission, and returns either the new note or specific error types. This meaningfully exceeds what the annotation alone communicates.

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, each earning its place: purpose, sibling differentiation, and behavioral/auth/error disclosure. The most important usage constraint is front-loaded and there is no unnecessary repetition of schema or annotation content.

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 no output schema, the description still covers the return value and error cases. Combined with full schema descriptions for all six parameters, the tool definition gives an agent everything needed to select and invoke it 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 the baseline is 3. The description adds contextual framing like 'existing' and 'reply', but it does not add substantive parameter-level semantics beyond what the schema already documents.

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 uses a specific verb ('Add') and a clear resource ('a new discussion note to an existing merge request thread'). It also explicitly contrasts the tool with create_merge_request_thread and create_merge_request_note, so an agent can distinguish it from its nearest siblings without inspecting schemas.

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?

The description states exactly when to use this tool: to reply inside an existing merge request discussion. It names the alternatives for starting a new thread and for creating a top-level note, giving clear routing guidance with no ambiguity.

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

create_merge_request_emoji_reactionA

Add an emoji reaction to a merge request (e.g. thumbsup, rocket, eyes). Use this for a new resource or action; choose the corresponding update or edit tool when the resource already exists. It changes remote GitLab state and requires the necessary project or group permission; GitLab returns validation, conflict, permission, or rate-limit errors instead of silently applying an invalid request. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesName of the emoji without colons (e.g. 'thumbsup', 'rocket', 'eyes')
jmespathNoOptional JMESPath expression filtering the JSON result before return.
project_idYesProject ID or complete URL-encoded path to project
merge_request_iidYesThe IID of a merge request

TDQS

A4/5.0
Behavior4/5

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

Beyond the openWorldHint annotation, the description explicitly states it 'changes remote GitLab state' and requires permission, and discloses that GitLab returns validation, conflict, permission, or rate-limit errors rather than silently applying invalid requests. This provides meaningful behavioral context 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.

Conciseness3/5

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

The description is structured and front-loads purpose, but contains some fluff and inaccuracies, such as referencing 'group_id' when the schema only includes project_id, and mentioning 'pagination fields' which are irrelevant. It could be tightened without losing value.

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 tool with no output schema, the description covers purpose, usage guidance, side effects, permission requirements, and error behavior. Minor confusion from the group_id/pagination references doesn't hinder overall completeness, but the omission of return value specifics is acceptable given no output schema.

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%, so the description adds limited value. It does clarify the project_id format ('numeric ID or complete URL-encoded path'), which is already in the schema, and mentions 'pagination fields' that don't apply to this tool (no pagination). No significant extra meaning is added.

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 action ('Add an emoji reaction to a merge request') with examples (thumbsup, rocket, eyes), and explicitly differentiates from update/edit tools for existing resources. This clearly distinguishes it from siblings like delete_merge_request_emoji_reaction and list_merge_request_emoji_reactions.

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 provides clear guidance: use for new resources/actions, and use an update/edit tool when the resource already exists. This tells the agent when to use it vs alternatives, though it doesn't name specific alternative tools. It also notes permission requirements and error behavior, which helps in deciding applicability.

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

create_merge_request_noteA

Add a new note to a merge request. Use this for a new resource or action; choose the corresponding update or edit tool when the resource already exists. It changes remote GitLab state and requires the necessary project or group permission; GitLab returns validation, conflict, permission, or rate-limit errors instead of silently applying an invalid request. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyYesThe content of the note or reply
jmespathNoOptional JMESPath expression filtering the JSON result before return.
project_idYesProject ID or complete URL-encoded path to project
merge_request_iidYesThe IID of a merge request

TDQS

A4.3/5.0
Behavior4/5

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

The description discloses that the tool changes remote GitLab state, requires permissions, and returns validation/conflict/permission/rate-limit errors. This goes beyond the openWorldHint annotation, which only indicates the world is open. It doesn't contradict annotations.

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?

The description is concise and front-loaded with the primary action. It includes necessary usage guidance and error behavior without excessive detail. Slightly dense but each sentence adds value.

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?

Given the tool's complexity (4 params, no output schema), the description covers the key aspects: action, usage, permissions, errors, and identifier format. It doesn't explain return values, but with no output schema and a simple note-creation operation, this is acceptable.

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 the schema already documents all parameters. The description adds guidance on providing numeric ID or URL-encoded path for project_id/group_id, which is useful but not extensive. Baseline 3 is appropriate.

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 clearly states the action ('Add a new note to a merge request') and distinguishes it from update/edit tools for existing resources. It also differentiates from sibling tools like create_merge_request_discussion_note and create_issue_note by specifying the merge request context.

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 to use this for a new resource/action and to choose the corresponding update or edit tool when the resource already exists. It also mentions required permissions and error behavior, giving clear context for when to use this tool.

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

create_merge_request_note_emoji_reactionA

Add an emoji reaction to a merge request note. Pass discussion_id for discussion thread replies. Use this for a new resource or action; choose the corresponding update or edit tool when the resource already exists. It changes remote GitLab state and requires the necessary project or group permission; GitLab returns validation, conflict, permission, or rate-limit errors instead of silently applying an invalid request. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesName of the emoji without colons (e.g. 'thumbsup', 'rocket', 'eyes')
note_idYesThe ID of a note (comment or thread reply)
jmespathNoOptional JMESPath expression filtering the JSON result before return.
project_idYesProject ID or complete URL-encoded path to project
discussion_idNoThe ID of a discussion thread. Required for notes that are discussion replies; omit for top-level notes.
merge_request_iidYesThe IID of a merge request

TDQS

A4/5.0
Behavior4/5

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

With only openWorldHint in annotations, the description carries the burden of behavioral disclosure. It clearly states that the call changes remote GitLab state, requires project/group permission, and returns validation, conflict, permission, or rate-limit errors instead of silently succeeding. It also notes the discussion-thread behavior. Idempotency and response format are not covered, but the main operational risks are disclosed.

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

Conciseness3/5

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

The first sentences are tight and front-loaded with the core purpose and the discussion_id tip. The later sentences, especially 'When project_id or group_id is accepted...', read as generic boilerplate not specific to this tool and add unnecessary length. Reasonably organized but not lean.

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?

Given six parameters, no output schema, and minimal annotations, the description covers a lot: purpose, mutation safety, permissions, error behavior, discussion replies, and new-vs-update selection. It does not name exact sibling tools or describe the returned object, but those are minor gaps for a create-reaction 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 100%, so the baseline is 3. The description reiterates the discussion_id behavior that the schema already explains and adds generic project_id/group_id identifier guidance, though group_id is not actually a parameter of this tool. This adds only marginal value beyond the schema.

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 opening sentence states a specific verb and resource: 'Add an emoji reaction to a merge request note.' This immediately distinguishes it from siblings like create_merge_request_note or create_merge_request_emoji_reaction. The description also contrasts it with update/edit tools for existing resources.

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 description explicitly says to use this tool for a new resource or action and to choose the corresponding update/edit tool when the resource already exists, which provides clear when/when-not guidance. It also explains when discussion_id is needed. However, it does not name the specific sibling tools or mention when deletion would be the right alternative.

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

create_merge_request_threadA

Create a new thread on a merge request. Use this to start a review thread on a merge request; use create_merge_request_note for an unthreaded note and create_merge_request_discussion_note to reply to an existing thread. The operation creates remote review content, requires note permission, and returns the discussion or a position/permission/validation error.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyYesThe content of the thread
jmespathNoOptional JMESPath expression filtering the JSON result before return.
positionNoPosition when creating a diff note
created_atNoDate the thread was created at (ISO 8601 format)
project_idYesProject ID or complete URL-encoded path to project
merge_request_iidYesThe IID of a merge request

TDQS

A4.4/5.0
Behavior4/5

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

Annotations provide only openWorldHint=true, so the description carries most of the behavioral burden. It states that the operation 'creates remote review content,' requires note permission, and returns a discussion or error. This adds useful transparency about side effects and failure modes, beyond what openWorldHint implies.

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, each earning its place: the first states the core action, the second distinguishes siblings, and the third covers behavior and errors. No filler or redundancy; the structure front-loads the purpose.

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?

Given the complex nested schema and openWorldHint annotation, the description covers purpose, alternatives, permissions, and expected return/error behavior. It does not explain how to construct a position object, but the schema covers that in depth, so the description is complete enough for correct invocation.

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 rich descriptions on position, line_range, and required fields. The description itself adds no parameter-level meaning beyond the schema, so the baseline of 3 is appropriate.

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 uses a specific verb and resource: 'Create a new thread on a merge request.' It explicitly differentiates from siblings by naming create_merge_request_note for unthreaded notes and create_merge_request_discussion_note for replies, so an agent can immediately tell them apart.

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?

The description gives explicit when-to-use guidance: 'Use this to start a review thread' and names the exact alternatives for other cases. It also mentions the permission requirement ('requires note permission'), which is essential context for deciding whether this is the right tool.

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

create_noteA

Create a new note (comment) to an issue or merge request. Use this for a top-level comment on an issue or merge request when no typed discussion operation is needed; use create_merge_request_thread or create_issue_note for threaded replies. The operation creates remote discussion content, requires note permission, and returns the created note or a target/permission/validation error.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyYesNote content
jmespathNoOptional JMESPath expression filtering the JSON result before return.
project_idYesProject ID or namespace/project_path
noteable_iidYesIID of the issue or merge request
noteable_typeYesType of noteable (issue or merge_request)

TDQS

A4.5/5.0
Behavior4/5

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

Annotations only provide openWorldHint, so the description carries the burden of behavioral disclosure. It adds useful context: the operation creates remote discussion content, requires note permission, and returns the created note or a target/permission/validation error. This goes beyond the minimal 'creates a note' statement.

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 with no waste. The opening states the operation and resource, the second sentence routes to alternatives, and the third covers remote effect, permissions, and return value. 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?

For a creation tool with full schema coverage and no output schema, the description gives the key operational details: top-level scope, alternatives, remote side effect, permission requirement, and possible return/error outcomes. Nothing essential is missing for correct invocation.

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 the schema already documents all five parameters including the enum for noteable_type. The description adds no per-parameter syntax or format detail but reinforces the overall purpose; 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 ('Create') and resource ('a new note (comment) to an issue or merge request'), and distinguishes itself from sibling tools by explicitly framing itself as the top-level comment operation. The description clarifies it is not for threaded replies, so an agent can tell it apart from create_merge_request_thread and create_issue_note.

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?

Provides explicit when-to-use guidance: 'Use this for a top-level comment on an issue or merge request when no typed discussion operation is needed'. It also names alternatives for threaded replies, giving clear routing and exclusions.

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

create_or_update_fileA

Create or update a file in a GitLab project. Use this for a single repository file when you know whether the target path is new or already exists; use push_files for a multi-file commit. Optional encoding (text or base64) defaults to GITLAB_REPO_FILE_ENCODING so existing callers stay unchanged. The operation creates or updates remote content in a commit, requires repository write permission, and returns the commit result or a conflict/validation error.

ParametersJSON Schema
NameRequiredDescriptionDefault
branchYesBranch to create/update the file in
contentYesContent of the file
encodingNoContent encoding. Use 'base64' for binary files (content must already be base64-encoded). When omitted, GITLAB_REPO_FILE_ENCODING applies.
jmespathNoOptional JMESPath expression filtering the JSON result before return.
commit_idNoCurrent file commit ID (for update operations)
file_pathYesPath where to create/update the file
project_idYesProject ID or complete URL-encoded path to project
previous_pathNoPath of the file to move/rename
commit_messageYesCommit message
last_commit_idNoLast known file commit ID

TDQS

A4.7/5.0
Behavior5/5

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

With no readOnly/destructive annotations to rely on, the description discloses that the operation mutates remote content in a commit, requires repository write permission, and returns a commit result or conflict/validation error. This gives the agent the key safety and outcome information it 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?

Three sentences, all functional: purpose/routing, encoding behavior, and permission/return summary. No filler or repeated 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?

Despite having 10 parameters and no output schema, the description covers what an agent needs: when to use it, what it does, required permissions, and the kind of result or error to expect. Optional parameters are fully covered by the schema.

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 the schema already documents all parameters. The description adds the encoding default and permission context but does not meaningfully enrich the other parameters beyond the schema baseline.

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 opens with a clear verb-resource pair ('Create or update a file in a GitLab project') and explicitly positions itself as the single-file counterpart to `push_files`. An agent can distinguish this from its siblings immediately.

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?

It states the intended use case (single repository file) and names the alternative (`push_files` for a multi-file commit), which is explicit routing guidance. It also adds the encoding default behavior for backward compatibility, giving practical context for existing callers.

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

create_repositoryA

Create a new GitLab project. Use this for a new resource or action; choose the corresponding update or edit tool when the resource already exists. It changes remote GitLab state and requires the necessary project or group permission; GitLab returns validation, conflict, permission, or rate-limit errors instead of silently applying an invalid request. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesRepository name
jmespathNoOptional JMESPath expression filtering the JSON result before return.
visibilityNoRepository visibility level
descriptionNoRepository description
namespace_idNoGroup namespace ID to create the project in. Omit to use the current user's namespace.
initialize_with_readmeNoInitialize with README.md

TDQS

A4.3/5.0
Behavior5/5

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

Beyond the sparse openWorldHint annotation, the description discloses that the call changes remote GitLab state, requires project/group permission, and reports validation, conflict, permission, or rate-limit errors rather than silently succeeding. This is substantial behavioral context.

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?

The core purpose and usage are front-loaded and each sentence serves a distinct function. The final sentence is somewhat generic boilerplate, but the overall description remains compact.

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 moderate-complexity create tool with no output schema, the description covers lifecycle state, permissions, error behavior, and alternative-tool usage. The schema handles parameter details, though the description could have named update_project or clarified namespace_id instead of mentioning absent project_id/group_id.

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 the baseline is 3. The description adds only generic advice about project_id/group_id and pagination fields, which are not present in this input schema, so it does not meaningfully enrich the parameter semantics.

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 opens with 'Create a new GitLab project', which names a specific verb, resource, and lifecycle stage. It also explicitly distinguishes this create action from update/edit tools, so it is unambiguous against siblings like update_project.

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 says to use this for a new resource and to choose the corresponding update/edit tool when the resource already exists, providing an explicit when-not condition. It does not name update_project directly, but the alternative is clear from context.

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

delete_branchA
Destructive

Delete branch from project. Use this only after confirming the branch name and intended data loss; use get_branch or list_branches before deletion and never use it to remove branch protection. The operation permanently removes a remote branch, requires branch-delete permission, and returns the deletion result or a protected-branch, missing-resource, or permission error.

ParametersJSON Schema
NameRequiredDescriptionDefault
jmespathNoOptional JMESPath expression filtering the JSON result before return.
project_idYesProject ID or complete URL-encoded path to project
branch_nameYesName of the branch to delete

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already flag destructive behavior, and the description adds operationally important context: deletion is permanent, it applies to a remote branch, it requires branch-delete permission, and it can return protected-branch, missing-resource, or permission errors. No contradiction with 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?

Three sentences deliver the core action, safety caveats, permission requirement, and expected results with no filler. The most important warning is front-loaded.

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 three-parameter, side-effectful deletion tool, the description covers prerequisites, irreversibility, permissions, and the possible result/error classes without requiring an output schema. 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.

Parameters3/5

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

Schema description coverage is 100%, so the description does not need to repeat parameter details. It adds only contextual reassurance about branch confirmation rather than new parameter-level semantics, which matches the baseline for fully covered 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 opens with a clear action and target ('Delete branch from project') and later specifies the effect ('permanently removes a remote branch'). It distinguishes delete_branch from get_branch/list_branches/protect_branch rather than merely restating the name.

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?

It gives explicit prerequisites ('use get_branch or list_branches before deletion'), a required confirmation step, and a clear exclusion ('never use it to remove branch protection'). The when-to-use guidance is unambiguous.

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

delete_draft_noteA
Destructive

Delete a draft note. Use this only after verifying the target; choose a get or list tool first when you need to inspect state without changing it. It changes or removes remote GitLab data and may be irreversible; it requires the necessary project or group permission and returns validation, conflict, permission, or rate-limit errors. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
jmespathNoOptional JMESPath expression filtering the JSON result before return.
project_idYesProject ID or complete URL-encoded path to project
draft_note_idYesThe ID of the draft note
merge_request_iidYesThe IID of a merge request

TDQS

A4.5/5.0
Behavior5/5

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

Annotations only indicate destructiveHint and openWorldHint. The description adds crucial behavioral context: 'may be irreversible,' 'requires the necessary project or group permission,' and 'returns validation, conflict, permission, or rate-limit errors.' This goes beyond what annotations convey, directly informing the agent of risks and error handling.

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?

The description is multi-sentence but every sentence carries weight: purpose, safety, usage, and parameter guidance. It's front-loaded with the core action and includes relevant caveats. Slightly verbose due to the combined guidance, but no filler.

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 destructive tool with no output schema, the description covers safety, permissions, error types, and parameter usage. It doesn't specify the success response format (e.g., 204 No Content), but that's a minor gap given the other rich context. The description is complete enough for an agent to call it safely and 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 covers all 4 parameters at 100% coverage, so the schema already documents each field. The description adds a general note to 'provide the numeric ID or complete URL-encoded path described by the schema' and 'use required identifiers and pagination fields exactly as documented,' which is helpful but doesn't elaborate beyond the schema. Baseline 3 is appropriate.

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 opens with a clear verb+resource ('Delete a draft note') and explicitly contrasts it with get/list tools for inspection. It distinguishes from siblings like update_draft_note and publish_draft_note without needing to name them, making the purpose unmistakable.

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?

Provides explicit guidance: 'Use this only after verifying the target' and 'choose a get or list tool first when you need to inspect state without changing it.' It also mentions prerequisites (project/group permission) and the irreversible nature, covering both when-to-use and when-not-to-use.

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

delete_issueA
Destructive

Delete an issue. Use this only after confirming the issue and intended permanent removal; use update_issue to close or edit an issue without deleting it. The operation permanently removes issue data, requires delete permission, and returns the deletion result or a missing-resource, permission, or policy error.

ParametersJSON Schema
NameRequiredDescriptionDefault
jmespathNoOptional JMESPath expression filtering the JSON result before return.
issue_iidYesThe internal ID of the project issue
project_idYesProject ID or URL-encoded path

TDQS

A4.6/5.0
Behavior5/5

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

Beyond the annotations, the description specifies permanent data removal, the need for delete permission, and the categories of errors that may be returned (missing-resource, permission, policy). This is exactly the kind of behavioral context that annotations alone do not convey, and it does not contradict 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 sentences, no filler. The first sentence states the action and the key qualifier; the second provides usage routing and behavioral warnings. Every clause earns its place and the most critical scoping 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?

For a destructive operation with full schema coverage and the key annotation already present, the description covers purpose, when to use, permanence, permission requirement, and possible errors. It does not detail the exact shape of the deletion result, but with no output schema that is not strictly required. Slightly more could be said about the result payload, hence 4 rather than 5.

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 the parameters and their descriptions already carry the full semantic load. The tool description adds no extra parameter-specific explanation, so a baseline of 3 is appropriate.

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 opens with the specific verb-resource pair 'Delete an issue,' and goes further to contrast with `update_issue`, making the tool's scope unmistakable. This clearly distinguishes it from the many issue-related siblings such as `get_issue`, `create_issue`, and `update_issue`.

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?

The description gives explicit when-to-use guidance: only after confirming the issue and intended permanent removal. It explicitly names the alternative, `update_issue`, for closing or editing without deletion. This leaves no room for an agent to guess when this tool is appropriate.

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

delete_issue_emoji_reactionA
Destructive

Remove an emoji reaction from an issue. Use this only after verifying the target; choose a get or list tool first when you need to inspect state without changing it. It changes or removes remote GitLab data and may be irreversible; it requires the necessary project or group permission and returns validation, conflict, permission, or rate-limit errors. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
award_idYesThe ID of the emoji reaction to delete
jmespathNoOptional JMESPath expression filtering the JSON result before return.
issue_iidYesThe IID of an issue
project_idYesProject ID or complete URL-encoded path to project

TDQS

A4.1/5.0
Behavior5/5

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

The description adds meaningful behavioral context beyond the destructiveHint annotation: it clarifies the operation may be irreversible, requires the necessary project or group permission, and returns validation, conflict, permission, or rate-limit errors. This is consistent with 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.

Conciseness4/5

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

The description is organized and front-loaded with the purpose, followed by usage guidance and behavior. The final sentence is somewhat boilerplate and repeats schema wording, but the description remains appropriately sized and readable.

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 delete operation, it covers purpose, when to use, side effects, permission requirements, and error classes. It does not describe the success return value, but the absence of an output schema makes that a minor gap rather than a serious omission.

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 the schema already documents all parameters. The description mostly echoes the schema's project_id guidance and adds a general 'pagination fields' clause that is not actually schema-specific, adding little extra 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?

The opening sentence states a specific verb and resource: 'Remove an emoji reaction from an issue.' It is clearly distinguished from MR reaction tools, though it does not explicitly call out the closely related note-reaction sibling, so a fully explicit sibling differentiation is missing.

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 usage condition: 'Use this only after verifying the target' and directs agents to get/list tools when inspection is needed. This is helpful but does not name the specific sibling (e.g., list_issue_emoji_reactions) that would provide the needed award_id.

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

delete_issue_note_emoji_reactionA
Destructive

Remove an emoji reaction from an issue note. Pass discussion_id for discussion thread replies. Use this only after verifying the target; choose a get or list tool first when you need to inspect state without changing it. It changes or removes remote GitLab data and may be irreversible; it requires the necessary project or group permission and returns validation, conflict, permission, or rate-limit errors. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
note_idYesThe ID of a note (comment or thread reply)
award_idYesThe ID of the emoji reaction to delete
jmespathNoOptional JMESPath expression filtering the JSON result before return.
issue_iidYesThe IID of an issue
project_idYesProject ID or complete URL-encoded path to project
discussion_idNoThe ID of a discussion thread. Required for notes that are discussion replies; omit for top-level notes.

TDQS

A4.3/5.0
Behavior5/5

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

Annotations already mark destructiveHint, but the description adds irreversibility, permission requirements, and specific error types (validation, conflict, permission, rate-limit), going well beyond the structured data. No contradiction with annotations.

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?

The description is front-loaded with the core action, then provides conditions and warnings in a logical order. It is appropriately sized without redundancy, though slightly longer than strictly necessary.

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?

Covers purpose, usage guidance, destructive nature, permissions, errors, and parameter guidance. Lacks return-value details, but that is acceptable for a delete operation without an output schema.

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 provides full descriptions for all 6 parameters (100% coverage). The description adds a minor clarification about project_id/group_id formats and pagination, but does not add significant new semantics beyond the schema.

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 the specific action: removing an emoji reaction from an issue note, and clarifies the discussion_id case. It clearly distinguishes from sibling tools that target merge request notes or issue-level emoji.

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?

Provides explicit guidance to verify the target first and use get/list tools for inspection before mutation. Also explains when to pass discussion_id. However, it does not name specific alternative tools for note-level vs issue-level emoji removal, leaving some inference to the agent.

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

delete_labelA
Destructive

Delete a label from a project. Use this only after verifying the target; choose a get or list tool first when you need to inspect state without changing it. It changes or removes remote GitLab data and may be irreversible; it requires the necessary project or group permission and returns validation, conflict, permission, or rate-limit errors. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
jmespathNoOptional JMESPath expression filtering the JSON result before return.
label_idYesThe ID or title of a project's label
project_idYesProject ID or URL-encoded path

TDQS

A4.4/5.0
Behavior5/5

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

Annotations already mark destructiveHint=true and openWorldHint=true, but the description adds meaningful behavioral context: it changes or removes remote GitLab data, may be irreversible, requires permissions, and may return validation, conflict, permission, or rate-limit errors. This is valuable beyond the annotations and does not contradict them.

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

Conciseness3/5

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

The first sentence is strong and front-loaded, and the safety and error information is useful. However, the final sentence contains redundant boilerplate ('described by the schema', 'exactly as documented') and references pagination fields irrelevant to this tool, making the definition less tight than it should be for a simple delete operation.

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?

The definition covers purpose, when to use it, destructive scope, irreversibility, permissions, and likely error types. The main gaps are the absence of a success return description (no output schema is present) and the misleading mention of group_id/pagination, which slightly undermines completeness for such a simple 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%, so the baseline is 3. The description mostly restates the schema's project_id guidance ('numeric ID or complete URL-encoded path'), and it mentions group_id and pagination fields that do not exist in this tool's schema, adding confusion rather than concrete parameter value.

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 opening sentence uses a specific verb and resource: 'Delete a label from a project.' It clearly distinguishes this from read-only siblings and from update_label/create_label by naming the destructive action and stating it operates on a project label.

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?

The description explicitly instructs when to avoid using the tool ('only after verifying the target') and directs the agent to get or list tools when inspection is needed. It also frames destructive usage with permission requirements, giving the agent a clear decision boundary.

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

delete_merge_request_discussion_noteA
Destructive

Delete a discussion note on a merge request. Use this only after verifying the target; choose a get or list tool first when you need to inspect state without changing it. It changes or removes remote GitLab data and may be irreversible; it requires the necessary project or group permission and returns validation, conflict, permission, or rate-limit errors. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
note_idYesThe ID of a thread note
jmespathNoOptional JMESPath expression filtering the JSON result before return.
project_idYesProject ID or complete URL-encoded path to project
discussion_idYesThe ID of a thread
merge_request_iidYesThe IID of a merge request

TDQS

A4.5/5.0
Behavior5/5

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

Beyond the destructiveHint annotation, the description states that the operation 'changes or removes remote GitLab data and may be irreversible,' requiring permissions and returning specific error classes. This adds meaningful context about side effects and failure modes that annotations alone do not convey.

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?

The description is compact and front-loaded, with the purpose in the first sentence and usage guidance in the second. The final sentence contains some generic boilerplate about 'pagination fields' that is not fully relevant to the schema, slightly reducing efficiency.

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?

Given the destructive nature and the absence of an output schema, the description covers purpose, usage verification, permissions, irreversibility, and error types. It does not describe success return values, but for a delete operation this is a minor omission amid strong contextual coverage.

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%, so the schema already documents all parameters. The description adds guidance on project_id format but mentions group_id and pagination fields that do not appear in the schema, introducing a slight mismatch. Overall, the description contributes little beyond the schema's existing parameter documentation.

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 opens with 'Delete a discussion note on a merge request,' stating a specific verb and resource. This clearly distinguishes the operation from sibling tools like delete_merge_request_note or update_merge_request_discussion_note by narrowing to the discussion-note context.

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?

The description explicitly instructs to verify the target first and to choose a get or list tool when inspection is needed without changing state. It also names the permission requirement and outlines the error types, giving clear when-to-use and when-not-to-use guidance.

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

delete_merge_request_emoji_reactionA
Destructive

Remove an emoji reaction from a merge request. Use this only after verifying the target; choose a get or list tool first when you need to inspect state without changing it. It changes or removes remote GitLab data and may be irreversible; it requires the necessary project or group permission and returns validation, conflict, permission, or rate-limit errors. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
award_idYesThe ID of the emoji reaction to delete
jmespathNoOptional JMESPath expression filtering the JSON result before return.
project_idYesProject ID or complete URL-encoded path to project
merge_request_iidYesThe IID of a merge request

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and openWorldHint=true, and the description reinforces that it changes or removes remote GitLab data and may be irreversible. It adds context about permission requirements and possible error responses (validation, conflict, permission, rate-limit), which goes 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.

Conciseness4/5

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

The description is reasonably concise and front-loaded with the core action, then adds usage guidance and parameter notes. It is slightly dense but every sentence adds value; no filler.

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 destructive mutation tool with no output schema, the description covers the key context: when to use it, safety caveats, permissions, error types, and identifier handling. It does not detail the return value, but that is less critical for a delete operation and the annotations cover the destructive nature.

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 the schema already documents all parameters. The description adds guidance on providing numeric IDs or URL-encoded paths and using required identifiers exactly as documented, but it does not add significant new meaning beyond the schema.

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 clearly states the action ('Remove an emoji reaction from a merge request') with a specific verb and resource, and it is distinguishable from sibling tools like create_merge_request_emoji_reaction and delete_merge_request_note_emoji_reaction. The target resource (merge request emoji reaction) 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 Guidelines5/5

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

The description explicitly instructs to verify the target first and suggests using a get or list tool when inspection is needed without changing state. It also notes the required permissions and error types, giving clear context for when to use this tool versus alternatives.

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

delete_merge_request_noteA
Destructive

Delete an existing merge request note. Use this only after verifying the target; choose a get or list tool first when you need to inspect state without changing it. It changes or removes remote GitLab data and may be irreversible; it requires the necessary project or group permission and returns validation, conflict, permission, or rate-limit errors. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
note_idYesThe ID of a thread note
jmespathNoOptional JMESPath expression filtering the JSON result before return.
project_idYesProject ID or complete URL-encoded path to project
merge_request_iidYesThe IID of a merge request

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already mark this as destructive, and the description adds useful details: it changes or removes remote GitLab data, may be irreversible, requires permissions, and may return validation/conflict/permission/rate-limit errors. No contradiction with annotations.

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?

The description is appropriately sized and front-loaded with the core action, followed by relevant safety and permission guidance. Each sentence adds value, though the project_id/group_id sentence is slightly more verbose than necessary.

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 destructive tool with four well-documented parameters and no output schema, this description covers the essential operational context: safety, reversibility, permissions, error behavior, and identifier format. A response-format note would be a minor addition but is not required.

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%, so the schema carries the parameter documentation burden. The description adds minor guidance about project_id/URL-encoded paths and required identifiers, but mostly repeats or references schema content rather than enriching 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?

The description states a specific verb and resource: 'Delete an existing merge request note.' It is clearly distinct from create/update note tools, though it does not explicitly name or differentiate itself from the closely related delete_merge_request_discussion_note sibling.

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 description gives concrete usage context: verify the target first, and use a get/list tool instead when inspection is needed without mutation. It does not explicitly enumerate all alternative delete/update tools, but the condition for choosing a read-only tool is clear.

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

delete_merge_request_note_emoji_reactionA
Destructive

Remove an emoji reaction from a merge request note. Pass discussion_id for discussion thread replies. Use this only after verifying the target; choose a get or list tool first when you need to inspect state without changing it. It changes or removes remote GitLab data and may be irreversible; it requires the necessary project or group permission and returns validation, conflict, permission, or rate-limit errors. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
note_idYesThe ID of a note (comment or thread reply)
award_idYesThe ID of the emoji reaction to delete
jmespathNoOptional JMESPath expression filtering the JSON result before return.
project_idYesProject ID or complete URL-encoded path to project
discussion_idNoThe ID of a discussion thread. Required for notes that are discussion replies; omit for top-level notes.
merge_request_iidYesThe IID of a merge request

TDQS

A4.1/5.0
Behavior4/5

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

Annotations include destructiveHint=true and openWorldHint=true. The description adds context beyond these: it states the operation 'changes or removes remote GitLab data and may be irreversible,' mentions required permissions, and enumerates possible error types (validation, conflict, permission, rate-limit). This is valuable behavioral information that goes beyond the annotation flags and helps the agent understand consequences and error handling.

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?

The description is reasonably concise and front-loaded with the core action, followed by usage guidance, risks, and parameter notes. Each sentence adds value, though it is slightly verbose. The structure is logical: action, special case, when-to-use, risk/permission, and parameter format. It is not as tight as the best examples but is not bloated either.

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?

The description covers the essential aspects for a destructive tool: what it does, when to use it, risks, permissions, and error handling. It does not explicitly describe the success response, but that is often not critical for a delete operation, and the annotations cover safety. The mention of pagination fields is slightly ambiguous for a delete tool, but overall the description is adequate given the schema richness and annotation context.

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%, so the schema already documents each parameter. The description does not add significant meaning beyond the schema. It repeats the discussion_id guidance ('Pass discussion_id for discussion thread replies') which the schema already states, and it mentions URL-encoded paths for project_id which is already in the schema. No new parameter semantics are provided beyond what the structured schema offers.

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 clearly states the action: 'Remove an emoji reaction from a merge request note.' It uses a specific verb and resource, and distinguishes from sibling tools like delete_merge_request_emoji_reaction by scoping to notes and mentioning discussion_id for thread replies. An agent can immediately understand what this tool does and how it differs from similar delete operations.

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 description provides explicit usage guidance: 'Use this only after verifying the target; choose a get or list tool first when you need to inspect state without changing it.' This tells the agent when to avoid this tool and what alternative category to use. It also explains when to pass discussion_id. However, it does not name specific sibling tools (e.g., list_merge_request_note_emoji_reactions) as alternatives, which would be more actionable.

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

discover_toolsA
Read-only

Discover and activate additional tool categories for this session. Available categories: merge_requests, issues, repositories, branches, projects, labels, ci, groups, pipelines, milestones, wiki, releases, tags, users, workitems, webhooks, search, variables, dependency_proxy, vulnerabilities, orbit. Already-active categories are listed in the response. Use this when a needed opt-in category is not currently exposed; omit category to inspect available categories, then call it with a category to activate that group for the current session. It changes only the session's tool registry, returns the active-tool summary, and does not change GitLab data.

ParametersJSON Schema
NameRequiredDescriptionDefault
categoryNoToolset category to activate (e.g. 'pipelines', 'wiki'). Omit to list available categories.
jmespathNoOptional JMESPath expression filtering the JSON result before return.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already provide readOnlyHint and openWorldHint, but the description adds critical context: it only changes the session's tool registry, returns an active-tool summary, and does not modify GitLab data. This goes beyond the annotations and fully discloses side effects, so the agent can safely invoke it without concern for persistence.

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?

The description is front-loaded with the core purpose and includes a necessary list of categories. While the category list is long, it is directly relevant for the agent to know valid values. The phrasing is efficient, with no fluff, though it could be slightly tightened by moving the category list to the end.

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 meta-tool with no output schema, the description explains the return (active-tool summary), the session-scoped mutation, and the two-phase usage pattern. All information needed to decide and call the tool correctly is present, including the exact categories and the no-data-change guarantee.

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% and both parameters are well-documented. The description adds value by enumerating all valid category names and explaining the omission behavior for `category`, which is not in the schema. It also clarifies the optional JMESPath filtering role implicitly by context, though the schema already covers it.

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 clearly states the tool discovers and activates tool categories, lists the exact available categories, and explains its meta-purpose of managing the session's tool registry. It distinguishes itself from sibling tools by being the only one that modifies the available toolset, not operating on GitLab data.

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 to use: when a needed opt-in category is not exposed, and gives a two-step workflow: omit `category` to inspect, then call with a category to activate. It also clarifies session-scoped behavior and that it does not alter GitLab data, leaving no ambiguity about alternatives.

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

download_attachmentA
Read-only

Download an uploaded file from a project (images returned as base64; use local_path to save to disk). Use this to retrieve a previously uploaded project attachment; remote mode returns inline base64 for images or a download URL, while local mode can save to a path. It is read-only with respect to GitLab, requires project access, and returns the file content or an attachment/permission error.

ParametersJSON Schema
NameRequiredDescriptionDefault
secretYesThe 32-character secret of the upload
filenameYesThe filename of the upload
jmespathNoOptional JMESPath expression filtering the JSON result before return.
local_pathNoLocal path to save the file (optional, defaults to current directory)
project_idYesProject ID or URL-encoded path of the project

TDQS

A4.4/5.0
Behavior5/5

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

It discloses behavior beyond the readOnlyHint annotation: read-only with respect to GitLab, remote mode returning base64 for images or a download URL, local mode saving to a path, and possible attachment/permission errors. This gives the agent a clear model of side effects and output. No contradiction with 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 tightly written sentences front-load the core purpose and key mode hint, then add behavioral and error context. No redundant filler; every clause contributes useful information.

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 5-parameter tool with no output schema, the description covers return format, modes, save behavior, read-only guarantee, and error cases. The main minor gap is that the mapping from 'remote mode' vs 'local mode' to specific parameters is implicit rather than explicit, though local_path makes this reasonably clear.

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 the schema already explains all parameters. The description adds value by clarifying local_path's role and the mode-based behavior, but it does not add meaningful detail about secret, filename, project_id, or jmespath beyond what the schema provides.

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 uses a specific verb and resource: 'Download an uploaded file from a project' and 'retrieve a previously uploaded project attachment'. It clearly identifies the tool's function and differentiates it from file/content-related siblings like get_file_contents or push_files.

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 description explicitly states when to use it ('Use this to retrieve a previously uploaded project attachment'), describes the two modes, and notes the access prerequisite ('requires project access'). It does not name exclusions or alternatives, but there is no obvious sibling for attachment retrieval, so the guidance is sufficient.

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

fork_repositoryA

Fork a project to your account or specified namespace. Use this to create a copy of an existing project in the current user's namespace or a permitted namespace; use search_repositories or get_project to inspect projects without copying them. The operation creates a new project, requires fork permission, and returns the forked project or a namespace/permission error.

ParametersJSON Schema
NameRequiredDescriptionDefault
jmespathNoOptional JMESPath expression filtering the JSON result before return.
namespaceNoNamespace to fork to (full path)
project_idYesProject ID or complete URL-encoded path to project

TDQS

A4.6/5.0
Behavior4/5

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

Annotations only include `openWorldHint`, so the description carries most behavioral disclosure. It discloses the side effect (creates a new project), a permission prerequisite (fork permission), and the possible return/error outcomes (forked project or namespace/permission error). It does not explicitly say the original project is untouched, but 'copy' implies this and the key behavioral facts are present.

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, no filler; the core action and destination are front-loaded, followed by alternatives and behavioral notes. Every sentence contributes useful information.

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 tool with only one required parameter and no output schema, the description covers the operation, destination, permission requirement, and likely error cases. It could add more on idempotency or output details, but it is sufficient for correct invocation in most cases.

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 semantic value by clarifying that `namespace` defaults to the current user's namespace and must be permitted, and that `project_id` refers to an existing project to be copied. This goes beyond the raw schema entries.

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 action ('fork a project'), the resource ('existing project'), and the destination ('your account or specified namespace'). It also names the siblings it is not (`search_repositories`, `get_project`) for inspection without copying, so an agent can disambiguate.

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?

It gives an explicit when-to-use ('Use this to create a copy...') and names alternative tools for inspection (`search_repositories` or `get_project`). This directly tells an agent how to choose this tool over related siblings.

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

get_branchA
Read-only

Get branch details (commit, protection status). Use this for a known resource or result; choose the corresponding list or search tool when you need to discover multiple resources. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
jmespathNoOptional JMESPath expression filtering the JSON result before return.
project_idYesProject ID or complete URL-encoded path to project
branch_nameYesName of the branch

TDQS

A4.3/5.0
Behavior4/5

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

Annotations declare readOnlyHint=true, and the description reinforces this with 'read-only and does not mutate GitLab data'. It adds useful behavioral context beyond annotations by listing error conditions: 'missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors.'

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?

The description is front-loaded with the purpose and usage guidance, and each sentence contributes. The final sentence is somewhat generic boilerplate about identifiers and pagination that could be trimmed, but overall it is concise.

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?

The description covers when to use, safety, errors, and identifier format. With no output schema, it gives a hint of return content ('commit, protection status') but doesn't enumerate all fields. Still, for a simple get-one-resource tool, this is sufficiently 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 100%; the description adds no new meaning for branch_name or jmespath. It repeats the project_id format ('numeric ID or complete URL-encoded path') that the schema already documents, so it stays at the baseline of 3.

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 opens with a specific verb and resource: 'Get branch details (commit, protection status)'. It also distinguishes from discovery tools by stating this is for a known resource or result, making it clear which sibling tools (list_branches, search) are alternatives.

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 to use the tool versus alternatives: 'Use this for a known resource or result; choose the corresponding list or search tool when you need to discover multiple resources.' This removes ambiguity and routes the agent to the appropriate sibling.

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

get_branch_diffsA
Read-only

Get diffs between two branches or commits. Use this for a known resource or result; choose the corresponding list or search tool when you need to discover multiple resources. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
toYesThe target branch or commit SHA to compare to
fromYesThe base branch or commit SHA to compare from
jmespathNoOptional JMESPath expression filtering the JSON result before return.
straightNoComparison method: false for '...' (default), true for '--'
project_idYesProject ID or complete URL-encoded path to project
excluded_file_patternsNoArray of regex patterns to exclude files from the diff results. Each pattern is a JavaScript-compatible regular expression that matches file paths to ignore. Examples: ["^vendor/", "^test/mocks/", "\.spec\.ts$", "package-lock\.json"]

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already mark readOnlyHint=true, but the description adds concrete detail: 'It is read-only and does not mutate GitLab data' and enumerates error conditions like missing resources, invalid identifiers, insufficient permission, and rate limits. This goes beyond the annotations and gives the agent actionable expectations.

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?

The description is compact and front-loaded with the core purpose, then adds usage guidance, safety, and parameter notes in a logical order. Every sentence contributes useful information, though the final sentence about path encoding and pagination is slightly generic and could be trimmed without losing much.

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?

Given the simple read-only nature, the annotations, and the fully documented schema, the description covers the main use case, alternatives, error behavior, and parameter handling. It doesn't describe the output format, but no output schema exists and the diff structure is likely evident from the tool name. Overall it is sufficient for an agent to invoke 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?

Schema coverage is 100%, so the schema already explains each parameter. The description adds value by specifying that project_id should be a numeric ID or complete URL-encoded path and by reminding the agent to use required identifiers and pagination fields exactly as documented. It doesn't deeply elaborate each parameter, but it supplements the schema meaningfully.

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 opens with a specific verb and resource: 'Get diffs between two branches or commits.' It also distinguishes itself from discovery tools by stating it is for a known resource or result, which separates it from siblings like list_merge_request_diffs and list_commits.

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 to use the tool ('for a known resource or result') and when not to ('choose the corresponding list or search tool when you need to discover multiple resources'). This gives clear routing guidance without needing to infer context.

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

get_ci_catalog_resourceA
Read-only

Get details for a GitLab CI/CD Catalog resource, including versions and components. Use this for a known resource or result; choose the corresponding list or search tool when you need to discover multiple resources. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoCI/CD Catalog resource global ID. Required when full_path is omitted.
jmespathNoOptional JMESPath expression filtering the JSON result before return.
full_pathNoCI/CD Catalog resource full project path. Required when id is omitted.
version_limitNoNumber of versions to include (default: 5, max: 20)
component_nameNoFilter returned components by component name
include_readmeNoInclude version README content
component_limitNoNumber of components per version to include (default: 20, max: 50)

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so the read-only claim is redundant, but the description adds valuable behavioral context: missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. This goes beyond the annotations and is useful for an agent deciding whether to call the tool or handle failures.

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

Conciseness3/5

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

The first two sentences are concise and high-value, but the final sentence is generic boilerplate that references nonexistent parameters and does not earn its place. The description would be stronger if it ended after the error-handling sentence or corrected the parameter guidance.

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 single-resource retrieval tool with 100% schema coverage, the description is largely complete: it explains scope, alternatives, error behavior, and safety. The main gap is the stale parameter note, which slightly undermines the otherwise solid context. An output schema is absent, but the description at least names the returned content (versions and components).

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 coverage is 100%, so the baseline is 3, but the description adds misleading guidance: it references `project_id` or `group_id`, which do not exist in the schema (the schema uses `id` and `full_path`). The instruction to 'use required identifiers and pagination fields' is also vague and not backed by the schema, which has no required parameters. The description does not clarify the actual id/full_path trade-off beyond what the schema already states.

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 and resource: 'Get details for a GitLab CI/CD Catalog resource, including versions and components.' It also explicitly distinguishes itself from list/search discovery tools by saying to use those when discovering multiple resources. This clearly differentiates it from the sibling list_ci_catalog_resources.

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?

It gives explicit when-to-use guidance: 'Use this for a known resource or result; choose the corresponding list or search tool when you need to discover multiple resources.' This names the condition and points to an alternative, leaving little inference for the agent.

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

get_commitA
Read-only

Get details of a specific commit. Use this for a known resource or result; choose the corresponding list or search tool when you need to discover multiple resources. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
shaYesThe commit hash or name of a repository branch or tag
statsNoInclude commit stats
jmespathNoOptional JMESPath expression filtering the JSON result before return.
project_idYesProject ID or complete URL-encoded path to project

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, and the description reinforces non-mutating behavior while adding useful error conditions: missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. This goes beyond the annotation baseline without contradicting it.

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

Conciseness3/5

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

The first sentence is concise and front-loaded, and the second provides useful routing. However, the final sentence includes generic boilerplate about group_id and pagination fields that do not apply to this tool's schema, adding noise. The description is adequate but not tightly scoped to this specific tool.

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-only lookup with no output schema, the description covers the core need: what it does, when to use it, important error behaviors, and identifier requirements. The only minor gap is lack of any hint about the return value shape, but this is not necessary for such a straightforward get-by-id 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%, so the schema already documents each parameter. The description adds only a slight reinforcement of the project_id identifier format and a generic instruction to use identifiers/pagination as documented. It does not meaningfully explain sha, stats, or jmespath beyond what the schema provides, so the baseline of 3 is appropriate.

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 begins with a precise verb and object: 'Get details of a specific commit.' It also explicitly scopes the tool to known resources/individual results and contrasts it with list or search tools for discovery, clearly distinguishing it from siblings like list_commits.

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?

The description explicitly states when to use the tool ('for a known resource or result') and when not to ('choose the corresponding list or search tool when you need to discover multiple resources'). It also provides concrete guidance on identifier formats, which helps the agent choose and populate the correct call.

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

get_commit_diffA
Read-only

Get changes/diffs of a specific commit. Use this for a known resource or result; choose the corresponding list or search tool when you need to discover multiple resources. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
shaYesThe commit hash or name of a repository branch or tag
jmespathNoOptional JMESPath expression filtering the JSON result before return.
full_diffNoWhether to return the full diff or only first page (default: false)
project_idYesProject ID or complete URL-encoded path to project

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, but the description adds non-redundant behavioral details: missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. This clarifies the error contract beyond what annotations provide. It does not describe return formatting, but that is covered by schema fields like full_diff.

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?

The description is a few sentences long but each sentence earns its place: purpose, usage delineation, read-only/error note, parameter guidance. It is front-loaded with the primary action and then adds necessary context. Slightly verbose but not bloated; it avoids redundancy with annotations by noting error behavior instead of repeating read-only (though it does repeat read-only). Overall, well-structured and efficient.

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 specific-commit diff tool with no output schema, the description covers purpose, usage boundaries, error behavior, and parameter guidance. It lacks explicit mention of the response format, but the full_diff parameter implies pagination and the diff itself is a standard git structure. Given the schema covers all parameters and annotations cover safety, this description is sufficiently complete for an agent 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?

Schema coverage is 100%, so baseline is 3. The description adds extra guidance on parameter usage: 'provide the numeric ID or complete URL-encoded path described by the schema' and 'use required identifiers and pagination fields exactly as documented'. This goes beyond the schema's basic field descriptions, clarifying the expected format and constraint that parameters must be used exactly as documented.

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 specific verb 'Get changes/diffs' and resource 'a specific commit'. Clearly differentiates from list/search tools by explicitly saying 'Use this for a known resource or result' and directing to 'the corresponding list or search tool' for discovery. Distinguishes from siblings like get_commit or list_merge_request_diffs without ambiguity.

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?

Provides explicit when-to-use (known resource) and when-not-to (discover multiple resources) guidance, and mentions error conditions. Does not name specific sibling tools but the 'corresponding list or search tool' is contextually clear. Overall, strong usage direction with only minor lack of exact sibling names.

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

get_draft_noteA
Read-only

Get a single draft note from a merge request. Use this for a known resource or result; choose the corresponding list or search tool when you need to discover multiple resources. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
jmespathNoOptional JMESPath expression filtering the JSON result before return.
project_idYesProject ID or complete URL-encoded path to project
draft_note_idYesThe ID of the draft note
merge_request_iidYesThe IID of a merge request

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already mark readOnlyHint=true and openWorldHint=true. The description adds useful behavioral context beyond that: it is read-only, does not mutate GitLab data, and documents that missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors.

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?

The purpose and usage guidance are front-loaded, and the description is compact. The third sentence is somewhat generic and contains a slight mismatch (group_id/pagination), which keeps it from being perfectly concise, but the overall structure is clear and efficient.

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-resource read operation with three required identifiers, the description covers purpose, selection guidance, read-only safety, error behavior, and identifier formatting. It does not describe the return value, but the tool name and schema make this reasonably inferable, and no output schema exists to elaborate.

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 the schema already documents all parameters. The description adds guidance about supplying numeric IDs or URL-encoded paths and using identifiers as documented, but it also includes a generic "group_id or pagination" reference that does not match this tool's actual schema, so it cannot earn higher credit.

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 and resource: "Get a single draft note from a merge request." It also distinguishes itself from list/search tools by scoping use to "a known resource or result," so an agent can tell it apart from sibling tools like list_draft_notes.

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 instructs when to use this tool versus alternatives: use it for a known resource or result, and choose the corresponding list or search tool when discovering multiple resources. This is direct when-to-use guidance with a clear exclusion.

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

get_file_blameA
Read-only

Get git blame for a file at a given ref. Each entry maps a contiguous range of source lines to the commit that last changed them (id, author, authored_date, message). Use range_start/range_end to limit blame to specific lines.

ParametersJSON Schema
NameRequiredDescriptionDefault
refYesThe name of branch, tag or commit (required by GitLab blame API)
jmespathNoOptional JMESPath expression filtering the JSON result before return.
file_pathYesThe full path of the file to blame, relative to repo root
range_endNoLast line of the blame range (inclusive, 1-based). Both range[start] and range[end] must be set together.
project_idYesProject ID or complete URL-encoded path to project
range_startNoFirst line of the blame range (inclusive, 1-based). Both range[start] and range[end] must be set together.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so the description does not need to repeat safety semantics. It adds behavior beyond the annotations by explaining the entry structure: contiguous source-line ranges map to the commit with id, author, authored_date, and message. It does not cover pagination or edge cases, but the read-only hint plus output-shape context is meaningful.

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?

The description is two well-structured sentences. The first front-loads the action and resource; the second communicates the return shape and the optional range limitation. Every phrase contributes information, and there is no filler or duplication of schema text.

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?

Given there is no output schema, the description supplies the essential return semantics by naming the fields a caller can expect in each entry. The schema covers all parameters, and the read-only annotation covers the safety profile. Missing details such as pagination or behavior on nonexistent refs are minor for a straightforward blame call.

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 the schema itself documents all six parameters including range_start, range_end, ref, and file_path. The description adds only a light hint that range_start/range_end limit the blame to specific lines, which is useful but does not materially go beyond the schema. 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?

The description opens with a specific verb and resource: 'Get git blame for a file at a given ref.' This clearly separates it from read-content tools like get_file_contents and commit-history tools like get_commit-repository. It also states the central output concept (line ranges mapped to commits), removing ambiguity about what GitLab blame 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?

The description gives a clear operational context: run blame at a specific ref dat and optionally constrain the result to a range of lines with range_start/range_end. It does not explicitly name sibling alternatives or say when not to use this tool, but 'git blame' is a distinct enough operation that the usage context is clear.

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

get_file_contentsA
Read-only

Get contents of a file or directory from a GitLab project. Use this for a known resource or result; choose the corresponding list or search tool when you need to discover multiple resources. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
refNoBranch/tag/commit to get contents from
pathNoAlias of file_path
jmespathNoOptional JMESPath expression filtering the JSON result before return.
file_pathNoPath to the file or directory. Takes precedence over 'path' when both are provided
project_idNoProject ID or URL-encoded path (optional; falls back to env)

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, and the description reinforces this while adding useful behavior: missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. This is valuable context beyond the structured annotations, though it partially duplicates the read-only hint.

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 sentences with the core purpose and usage guidance front-loaded. The description is efficient, but some boilerplate like 'exactly as documented' and the duplication of the readOnlyHint annotation keep it just short of perfect conciseness.

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 fetch tool with no required parameters and no output schema, the description covers selection criteria, error behavior, and identifier formatting. It leaves the exact shape of file versus directory output somewhat implicit, but the name and first sentence convey the core return type adequately.

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 the schema already documents all parameters and the baseline is 3. The description adds little beyond that, mostly reiterating identifier-format guidance already present in the schema and mentioning group_id even though it is not a schema parameter.

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 action ('Get contents of a file or directory') with a clear resource scope ('from a GitLab project'). It also distinguishes itself from list/search siblings by positioning itself as the tool for a known resource or result rather than discovery.

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 instructs to use this tool for a known resource/result and to choose the corresponding list or search tool when discovering multiple resources. This gives a usable decision rule for tool selection without leaving the agent to infer when this tool applies.

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

get_issueA
Read-only

Get details of a specific issue. Returns a slim milestone by default; set full_response=true for the complete milestone object. Use this for issue management: inspect one issue's fields; use list_issues or my_issues to discover issues first. It is read-only, requires issue read permission, and returns the issue or an error when the identifier is invalid, the issue is missing, or access is denied.

ParametersJSON Schema
NameRequiredDescriptionDefault
jmespathNoOptional JMESPath expression filtering the JSON result before return.
issue_iidYesThe internal ID of the project issue
project_idYesProject ID or URL-encoded path
full_responseNoIf true, return the complete issue object including the full milestone description. Default returns a slim milestone (id, iid, title, state, web_url) to reduce token usage.

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, the description discloses that the operation requires issue read permission, that it returns a slim milestone by default unless full_response=true, and that it returns an error for invalid identifiers, missing issues, or denied access. These are concrete behavioral details that help an agent predict outcomes without calling the tool.

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?

The description is three sentences with no filler. The core purpose is front-loaded, the alternative tools are mentioned exactly once, and every sentence contributes either scoping, usage guidance, or behavioral context.

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 4-parameter read-only tool with no output schema, the description covers what the tool does, when to use it, what the default response looks like, how to get a fuller response, permissions, and error conditions. Nothing essential for correct invocation is missing; remaining details live in the fully-covered parameter schema.

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 itself thoroughly documents full_response (including the slim milestone fields) and jmespath. The description restates the full_response behavior but does not materially add to what the schema already provides, so the baseline of 3 is appropriate.

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 opens with a specific verb and resource: 'Get details of a specific issue.' It immediately differentiates from siblings by framing the scope as a single issue and later explicitly names `list_issues` and `my_issues` as discovery alternatives. This leaves no ambiguity about what the tool does.

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?

The description provides explicit routing guidance: use this tool to inspect one issue's fields, and use `list_issues` or `my_issues` to discover issues first. This tells the agent exactly when to invoke this tool versus the alternative list tools, covering the primary decision point.

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

get_labelA
Read-only

Get a single label from a project. Use this for a known resource or result; choose the corresponding list or search tool when you need to discover multiple resources. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
jmespathNoOptional JMESPath expression filtering the JSON result before return.
label_idYesThe ID or title of a project's label
project_idYesProject ID or URL-encoded path
include_ancestor_groupsNoInclude ancestor groups

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already provide readOnlyHint=true and openWorldHint=true. The description adds that missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors, which is useful behavioral context. It doesn't describe response format or other side-effects, but for a read-only tool with annotations, this is acceptable.

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?

The description is a few sentences long and front-loads the primary purpose. It includes necessary clarifications without being verbose. The additional guidance on identifiers and pagination fields is a bit generic but not overly long. Good structure.

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?

Given the tool is a simple get-by-id operation with 4 parameters (all documented in schema) and read-only annotations, the description covers the core usage. It doesn't explain return structure, but no output schema exists. The error behavior is mentioned. It could be more specific about the 'include_ancestor_groups' parameter behavior, but that is in the schema. Overall adequate.

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 each parameter is documented in the schema. The description adds a note about providing numeric ID or URL-encoded path for project_id/group_id, which adds value. However, this is only a minor addition; most parameter meaning comes from 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 description clearly states it gets a single label from a project, a specific verb and resource. It distinguishes itself from list/search tools by explicitly mentioning known resource vs discovery. However, it doesn't name a specific sibling like list_labels, so it's not fully differentiating.

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 clear direction: use this for a known resource or result, and choose the corresponding list or search tool for discovery. This is a clear when-to-use statement. It doesn't explicitly exclude alternatives by name, but the guidance is sufficient.

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

get_merge_requestA
Read-only

Get details of a merge request (mergeRequestIid or branchName required). Set include_summaries=true for deployment/commit/approval summaries. Use this for a known resource or result; choose the corresponding list or search tool when you need to discover multiple resources. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
jmespathNoOptional JMESPath expression filtering the JSON result before return.
project_idYesProject ID or complete URL-encoded path to project
source_branchNoSource branch name
include_summariesNoIf true, include deployment_summary, commit_addition_summary and approval_summary (extra API calls, larger response). Default false to reduce token usage.
merge_request_iidNoThe IID of a merge request

TDQS

A4/5.0
Behavior4/5

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

Annotations already provide readOnlyHint=true, so the statement 'does not mutate GitLab data' is redundant. However, the description adds valuable behavioral details about error conditions (missing resources, invalid identifiers, insufficient permission, rate limits) and notes that include_summaries triggers extra API calls and a larger response. These go 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.

Conciseness3/5

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

The description is front-loaded with purpose but includes extraneous details like the 'When project_id or group_id is accepted' sentence, which is not applicable to this tool since only project_id exists. It is somewhat rambling and could be trimmed, but the core information is present.

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?

The description covers read-only behavior, error handling, and include_summaries effects, but the parameter inaccuracies (branchName vs source_branch, group_id) create gaps and potential confusion. Without an output schema, the description could also mention the general return shape, but overall it is adequate for a single-resource get tool.

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 coverage is 100%, so baseline is 3, but the description introduces inaccuracies: it says 'mergeRequestIid or branchName required' while the schema has merge_request_iid and source_branch, and neither is required (only project_id is). It also references 'group_id' which is not in this tool's schema. This misleads the agent about parameter semantics.

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 clearly states the tool fetches details of a single merge request and distinguishes it from list/search tools by saying 'Use this for a known resource or result; choose the corresponding list or search tool when you need to discover multiple resources.' The verb and resource are specific, and the mention of include_summaries adds functional clarity.

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?

The description explicitly tells when to use this tool (known resource/result) versus list/search alternatives. It also clarifies when include_summaries is beneficial, and notes that identifiers must be provided exactly as documented. This is strong, actionable guidance.

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

get_merge_request_approval_stateA
Read-only

Get merge request approval details including approvers. Use this to inspect approval rules and approvers before deciding whether a merge request can be merged; use approve_merge_request to change approval state. It is read-only and returns the approval-state response, while missing requests, unsupported GitLab versions, and permission failures are reported as errors.

ParametersJSON Schema
NameRequiredDescriptionDefault
jmespathNoOptional JMESPath expression filtering the JSON result before return.
project_idYesProject ID or complete URL-encoded path to project
merge_request_iidYesThe IID of the merge request

TDQS

A4.4/5.0
Behavior4/5

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

Annotations provide readOnlyHint=true, and the description reinforces this by saying 'It is read-only.' It adds useful behavioral detail by listing error conditions: missing requests, unsupported GitLab versions, and permission failures are reported as errors. It does not describe the full shape of the approval-state response, but the error disclosure is meaningful 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?

The description is two sentences with no filler. It front-loads the core purpose, then provides usage guidance, safety confirmation, and error behavior in a compact, well-ordered way. 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?

For a read-only retrieval tool with rich annotations and complete schema coverage, the description covers purpose, usage, safety, and error conditions. The only minor gap is that it does not describe the specific fields contained in the 'approval-state response,' which would be more important if no output schema existed. Still, the essential context for correct selection and invocation is present.

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 the schema already documents all three parameters. The description adds no additional parameter-specific meaning, such as how project_id is resolved or how jmespath interacts with the result. Baseline 3 is appropriate because the schema carries the parameter documentation burden.

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 clearly states the verb-resource relationship: 'Get merge request approval details including approvers.' It also names the inspection purpose ('inspect approval rules and approvers before deciding whether a merge request can be merged'), which distinguishes it from sibling tools like approve_merge_request and unapprove_merge_request.

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 tells the agent when to use this tool ('before deciding whether a merge request can be merged') and points to the alternative for changing state ('use `approve_merge_request` to change approval state'). This is direct, actionable guidance with no ambiguity.

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

get_merge_request_conflictsA
Read-only

Get the conflicts of a merge request. Use this to inspect merge conflicts before attempting merge_merge_request; it reports conflicts and does not resolve them. It is read-only, requires access to the project and merge request, and returns GitLab's conflict data or an error when the request cannot be evaluated.

ParametersJSON Schema
NameRequiredDescriptionDefault
jmespathNoOptional JMESPath expression filtering the JSON result before return.
project_idYesProject ID or complete URL-encoded path to project
merge_request_iidYesThe IID of the merge request

TDQS

A4.5/5.0
Behavior4/5

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

The annotations already declare readOnlyHint=true, and the description reinforces this while adding useful behavior: it reports conflicts without resolving them, requires access to the project and merge request, and returns GitLab conflict data or an error when evaluation fails. No contradiction with 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?

Three front-loaded sentences each carry distinct information: what the tool does, when to use it, and what to expect. There is no filler or restatement of the tool name.

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 simple read-only conflict inspection tool, the description covers purpose, usage timing, access requirements, read-only behavior, and error outcomes. The schema covers parameters, so nothing essential is missing for an agent to invoke this tool 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 all parameters including the optional jmespath filter are already documented in the schema. The description does not add parameter-level detail, which is acceptable given the schema's full coverage.

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 opens with a specific verb and resource: 'Get the conflicts of a merge request.' It clearly distinguishes the tool from the sibling merge_merge_request by explicitly noting it reports conflicts and does not resolve them.

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?

It gives a concrete trigger ('before attempting merge_merge_request') and clarifies that the tool is for inspection only. This tells an agent when to use it and implicitly when not to use the merge tool.

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

get_merge_request_diffsA
Read-only

Get the changes/diffs of a merge request (mergeRequestIid or branchName required). Use this for a known resource or result; choose the corresponding list or search tool when you need to discover multiple resources. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
viewNoDiff view type
jmespathNoOptional JMESPath expression filtering the JSON result before return.
project_idYesProject ID or complete URL-encoded path to project
source_branchNoSource branch name
merge_request_iidNoThe IID of a merge request
excluded_file_patternsNoArray of regex patterns to exclude files from the diff results. Each pattern is a JavaScript-compatible regular expression that matches file paths to ignore. Examples: ["^vendor/", "^test/mocks/", "\.spec\.ts$", "package-lock\.json"]

TDQS

A3.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, and the description reinforces read-only behavior. It also adds useful behavioral context by listing error cases such as missing resources, invalid identifiers, insufficient permissions, and rate limits, which goes 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.

Conciseness4/5

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

The description is compact and front-loaded with the core purpose and usage. The final sentence is somewhat generic, but overall the structure is efficient and readable.

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?

The description covers read-only behavior, error cases, and high-level selection guidance, which is reasonably complete given the annotations. However, the parameter inconsistencies and lack of information about the diff output shape leave some gaps for an agent invoking this tool correctly.

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 100%, but the description introduces confusion: it says 'mergeRequestIid or branchName required' while the schema uses merge_request_iid and source_branch and only marks project_id as required. It also mentions group_id, which does not appear in the schema, and references pagination fields that are not present in 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 description clearly states the tool retrieves changes/diffs of a merge request and frames it for a known resource rather than discovery. It distinguishes from list/search siblings by saying to use those when discovering multiple resources, though it doesn't name them explicitly.

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 direct usage guidance: use this for a known resource/result combo and use list/search tools for discovery. It lacks explicit named alternatives or negative conditions, but the provided context is still actionable.

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

get_merge_request_discussionA
Read-only

Get a single discussion item for a merge request. Use this to fetch one known merge request discussion by discussion identifier; use mr_discussions for a collection and get_merge_request_note for a flat note. It is read-only and returns the discussion item or an error for an invalid identifier, missing discussion, or insufficient permission.

ParametersJSON Schema
NameRequiredDescriptionDefault
jmespathNoOptional JMESPath expression filtering the JSON result before return.
project_idYesProject ID or complete URL-encoded path to project
discussion_idYesThe ID of a thread
merge_request_iidYesThe IID of a merge request

TDQS

A4.5/5.0
Behavior4/5

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

The readOnlyHint annotation already covers safety, and the description reinforces it with 'It is read-only.' It also adds behavioral context beyond annotations by describing the outcome: returns the discussion item or an error for invalid identifier, missing discussion, or insufficient permission.

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?

The description is compact and front-loaded with the core purpose, then adds targeted usage and behavior information. Every sentence earns its place with no filler or redundancy.

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 single-discussion read tool with three required identifiers and a fully documented schema, the description covers selection, alternatives, return behavior, and error conditions. 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.

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all four parameters. The description adds little beyond restating that a discussion is fetched by identifier, so it provides no meaningful extra parameter meaning.

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 and resource: 'Get a single discussion item for a merge request.' It also explicitly distinguishes itself from siblings by naming `mr_discussions` for collections and `get_merge_request_note` for flat notes, so an agent can clearly tell this tool apart.

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?

The description gives explicit when-to-use guidance: fetch one known discussion by discussion identifier. It names the exact alternatives for collection and flat note use cases, leaving no ambiguity about which sibling tool to choose.

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

get_merge_request_file_diffA
Read-only

Get diffs for specific files from a merge request (mergeRequestIid or branchName required). Use this for a known resource or result; choose the corresponding list or search tool when you need to discover multiple resources. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
unidiffNoPresent diff in the unified diff format. Default is false.
jmespathNoOptional JMESPath expression filtering the JSON result before return.
file_pathsYesList of file paths to retrieve diffs for (e.g. ['src/api/users.ts', 'src/repo/user.go']). Call list_merge_request_changed_files first to get the full list of changed paths.
project_idYesProject ID or complete URL-encoded path to project
source_branchNoSource branch name
merge_request_iidNoThe IID of a merge request

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 and openWorldHint=true. The description adds value by detailing error behavior: 'missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors.' This goes beyond the annotations and helps the agent anticipate failure modes. No contradiction with annotations.

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

Conciseness3/5

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

The description is relatively compact with the purpose front-loaded. However, it includes generic boilerplate about group_id and pagination fields that are not in the schema, and the parenthetical about required parameters is redundant and potentially misleading. This reduces efficiency and clarity.

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?

The schema and annotations cover much of the necessary context, and the description adds usage and error information. However, the misleading statement about required parameters undermines completeness; an agent might try to supply merge_request_iid or source_branch instead of the actually required project_id and file_paths. This is a significant gap.

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 100%, so the baseline would be 3. However, the description actively misleads by stating 'mergeRequestIid or branchName required' while the schema requires project_id and file_paths. It also references 'group_id' and 'pagination fields' which do not exist in this schema. This introduces confusion rather than adding semantic value, so a 2 is warranted.

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 clearly states 'Get diffs for specific files from a merge request', identifying the exact verb, resource, and scope. It distinguishes itself from siblings by explicitly noting to use list/search tools when discovering multiple resources, making its purpose 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?

Provides explicit guidance: 'Use this for a known resource or result; choose the corresponding list or search tool when you need to discover multiple resources.' This clearly indicates when to use this tool versus alternatives. It also instructs to use required identifiers exactly as documented. However, it does not name specific sibling tools like get_merge_request_diffs, so it lacks some specificity.

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

get_merge_request_noteA
Read-only

Get a specific note for a merge request. Use this to fetch one known merge request note by note identifier; use get_merge_request_notes for a collection and mr_discussions for threaded context. It is read-only and returns the note object or an error for an invalid identifier, missing note, or insufficient permission.

ParametersJSON Schema
NameRequiredDescriptionDefault
note_idYesThe ID of a thread note
jmespathNoOptional JMESPath expression filtering the JSON result before return.
project_idYesProject ID or complete URL-encoded path to project
merge_request_iidYesThe IID of a merge request

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, and the description reinforces this by saying 'It is read-only.' It adds useful behavior beyond the annotation: it returns the note object or an error for invalid identifier, missing note, or insufficient permission. This helps set expectations without contradicting 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 sentences with no filler. The primary action is front-loaded, and the usage guidance and behavioral expectations are packed efficiently into the second sentence.

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 single-object read tool with no output schema, the description is complete: it states the resource, the lookup key, the read-only nature, the return value, likely error conditions, and relevant alternatives. No additional context is needed for correct invocation.

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 the parameters are already documented in the input schema. The description adds little beyond identifying note_id as the identifier to use, but it does not provide additional semantics or format details beyond what the schema already contains.

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 uses a specific verb and resource: 'Get a specific note for a merge request.' It clearly differentiates this tool from get_merge_request_notes and mr_discussions by scope (single known note vs collection vs threaded context).

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 to use this tool ('fetch one known merge request note by note identifier') and directly names the alternatives ('use get_merge_request_notes for a collection and mr_discussions for threaded context'). This gives an agent clear routing guidance.

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

get_merge_request_notesA
Read-only

List notes for a merge request. Use this to list flat notes on a merge request; use mr_discussions when thread structure and resolution state are required. It is read-only and returns note records, while invalid identifiers, missing resources, and pagination or permission errors are reported by GitLab.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number for pagination
sortNoThe sort order of the notes
jmespathNoOptional JMESPath expression filtering the JSON result before return.
order_byNoThe field to sort the notes by
per_pageNoNumber of items per page
project_idYesProject ID or complete URL-encoded path to project
merge_request_iidYesThe IID of a merge request

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, and the description reinforces this with 'It is read-only.' It adds useful behavioral context beyond annotations by specifying that the tool returns note records and that GitLab reports invalid identifiers, missing resources, pagination, and permission errors. This helps set error-handling expectations, though it does not detail response shapes 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.

Conciseness5/5

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

Three sentences with no filler. The core action is front-loaded, the sibling distinction follows immediately, and the behavioral/error note is concise. 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?

The description is complete for tool selection and invocation: it states behavior, scope, the key sibling alternative, and error reporting. With no output schema, saying it 'returns note records' is a minimal but sufficient return-value hint. It could mention that results are flat and how pagination manifests, but this is a minor gap.

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 the parameters are already documented in the schema. The description adds no parameter-specific meaning (e.g., how `sort` or `order_by` interact, or what `jmespath` filters). Baseline 3 is appropriate because the schema carries the full parameter-semantics burden.

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 and resource ('List notes for a merge request') and immediately differentiates from the sibling tool `mr_discussions` by characterizing itself as returning flat notes. This makes the tool's scope unmistakable and distinct from discussion-thread operations.

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 to use this tool vs. an alternative: 'use mr_discussions when thread structure and resolution state are required.' This gives the agent a clear decision rule and excludes the overlapping sibling, leaving no ambiguity about selection.

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

get_merge_request_versionA
Read-only

Get a specific version of a merge request. Use this for a known resource or result; choose the corresponding list or search tool when you need to discover multiple resources. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
unidiffNoPresent diffs in the unified diff format. Default is false. Introduced in GitLab 16.5.
jmespathNoOptional JMESPath expression filtering the JSON result before return.
project_idYesProject ID or complete URL-encoded path to project
version_idYesThe ID of the merge request diff version
merge_request_iidYesThe internal ID of the merge request

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, and the description reinforces this by stating it does not mutate GitLab data. It also adds useful error-behavior context for missing resources, invalid identifiers, insufficient permissions, and rate limits, which goes 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.

Conciseness3/5

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

The description is short and front-loaded with purpose, which is good. However, the final sentence contains generic boilerplate about group_id and pagination fields that are not present in this schema, reducing precision and making the description slightly less disciplined than it could be.

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-resource read-only getter, the description covers purpose, usage boundaries, safety, and error behavior. It does not describe the response contents, but given the simple resource model and the absence of an output schema, the description is still sufficient for an agent to invoke the tool 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 the parameters are already documented in the schema. The description adds little beyond restating the path-encoding rule for project_id and includes boilerplate mentions of group_id and pagination fields that do not actually apply to this tool's schema.

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 starts with a specific verb and resource: 'Get a specific version of a merge request.' It also clarifies the intended scope by contrasting with list/search tools for discovery, which helps distinguish this tool from siblings like list_merge_request_versions.

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 description explicitly says to use this tool for a known resource/result and directs the agent to a list/search tool when discovery is needed. It gives clear when-to-use guidance, though it does not name the exact sibling tool like list_merge_request_versions.

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

get_namespaceA
Read-only

Get details of a namespace (user or group) by ID or path. Groups are namespaces with kind='group'. Use this for a known resource or result; choose the corresponding list or search tool when you need to discover multiple resources. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
jmespathNoOptional JMESPath expression filtering the JSON result before return.
namespace_idYesNamespace ID or full path

TDQS

A4.3/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true, and the description reinforces this while adding concrete failure modes: missing resources, invalid identifiers, insufficient permission, and rate limits returned as errors. This is useful context beyond what annotations provide.

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

Conciseness3/5

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

The first three sentences are tight and front-loaded, but the final sentence about project_id/group_id and pagination fields is boilerplate that does not apply to this schema. Not every sentence earns its place, so it falls below the higher conciseness bar.

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 two-parameter read-only tool, the description covers known-resource usage, error behavior, and non-mutation clearly. It is mostly complete, but the inapplicable parameter/pagination sentence introduces confusion and prevents a perfect score.

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 coverage is 100%, so the schema already documents namespace_id and jmespath, giving a baseline of 3. However, the description's reference to 'project_id or group_id' and 'pagination fields' is misleading because neither exists in this tool's schema, and it does not add accurate parameter-level meaning.

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 ('Get'), resource ('namespace'), and addressing mechanism ('by ID or path'), and explicitly differentiates from list/search tools for discovery. The clarification that groups are namespaces with kind='group' adds scope precision.

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 instructs to use this tool for a known resource or result and to choose the corresponding list or search tool when discovery of multiple resources is needed. This directly tells an agent when to select this tool over alternatives.

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

get_projectA
Read-only

Get details of a specific project. Use this for a known resource or result; choose the corresponding list or search tool when you need to discover multiple resources. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
jmespathNoOptional JMESPath expression filtering the JSON result before return.
project_idYesProject ID or URL-encoded path

TDQS

A4.2/5.0
Behavior4/5

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

The annotations already declare readOnlyHint=true, and the description reinforces this by stating the operation does not mutate GitLab data. It adds useful behavioral context by enumerating error conditions: missing resources, invalid identifiers, insufficient permission, and rate limits. This is meaningful added value beyond the structured annotations.

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?

The description is appropriately sized and front-loaded with the core purpose. The final sentence about identifiers and pagination fields is somewhat boilerplate and adds limited value, but overall the structure is clear and readable.

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 single-resource retrieval tool with read-only annotations, the description covers the core behavior, the intended invocation context, error outcomes, and identifier requirements. Nothing critical is missing for an agent to select and invoke this tool 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 the schema already documents both project_id and jmespath. The description mostly restates the project identifier guidance ('numeric ID or complete URL-encoded path') that the schema already provides, offering little additional semantic value.

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 clearly identifies a specific verb ('Get details') and resource ('a specific project'), and explicitly contrasts itself with list/search tools for discovering multiple resources. This makes it easy to distinguish from siblings like list_projects or search_repositories.

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 explicitly says to use this tool for a known resource or result and to choose a list or search tool when discovering multiple resources. The guidance is clear, though it refers to 'the corresponding list or search tool' generically rather than naming exact sibling alternatives.

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

get_project_eventsA
Read-only

List events for a project (before/after: YYYY-MM-DD). Use this for a known resource or result; choose the corresponding list or search tool when you need to discover multiple resources. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoReturns the specified results page. Default: 1
sortNoDirection to sort the results by creation date. Default: desc
afterNoIf defined, Returns events created after the specified date (YYYY-MM-DD format). To include events on 2025-08-29, use after=2025-08-28
actionNoIf defined, returns events with the specified action type
beforeNoIf defined, Returns events created before the specified date (YYYY-MM-DD format). To include events on 2025-08-29, use before=2025-08-30
jmespathNoOptional JMESPath expression filtering the JSON result before return.
per_pageNoNumber of results per page. Default: 20
project_idYesProject ID or URL-encoded path
target_typeNoIf defined, returns events with the specified target type

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, and the description reinforces this with 'does not mutate GitLab data.' It goes beyond annotations by disclosing error behavior: 'missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors.' This adds useful context that an agent cannot infer from the schema or annotations.

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?

The description is front-loaded with the core purpose in the first sentence, then provides usage boundaries and behavioral details. It is dense but efficient; the third sentence packs both error behavior and parameter conventions into one long sentence, but every clause carries meaningful information. Minor structural improvement could split that sentence, but it remains readable.

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, single-project listing tool with 100% schema coverage, the description covers purpose, usage boundaries, error behavior, and identifier formatting. There is no output schema, but the description does not describe the shape of returned events; however, 'List events' implies a standard event list and the tool's safety profile is already covered by annotations. The missing return-shape detail is a minor gap rather than a blocker.

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 schema already has 100% description coverage for all 9 parameters, so the baseline is 3. The description adds extra value by explaining how to provide project_id or group_id ('numeric ID or complete URL-encoded path described by the schema') and by emphasizing that pagination fields should be used exactly as documented. This goes beyond the schema's individual parameter descriptions.

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 and resource ('List events for a project') and immediately disambiguates from discovery tools: 'Use this for a known resource or result; choose the corresponding list or search tool when you need to discover multiple resources.' This clearly distinguishes it from siblings like list_events and list_issues.

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?

It explicitly defines when to use this tool ('for a known resource or result') and when not to ('choose the corresponding list or search tool when you need to discover multiple resources'). It also provides concrete guidance on providing identifiers and using pagination fields, leaving no ambiguity about invocation.

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

get_protected_branchA
Read-only

Get details of a single protected branch (access levels, force push settings). Use this for a known resource or result; choose the corresponding list or search tool when you need to discover multiple resources. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
jmespathNoOptional JMESPath expression filtering the JSON result before return.
project_idYesProject ID or complete URL-encoded path to project
branch_nameYesName of the protected branch

TDQS

A4.1/5.0
Behavior4/5

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

Beyond the annotations (readOnlyHint=true, openWorldHint=true), the description discloses concrete error semantics: missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. This adds genuine behavioral context an agent cannot infer from the annotations alone; nothing contradicts them.

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 sentences, front-loaded with the core purpose and followed by usage and error guidance. Minor template residue ('When project_id or group_id is accepted' mentions group_id, which is not a parameter here; 'pagination fields' is irrelevant) keeps it from being perfectly lean, but overall it is compact and well ordered.

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 3-parameter read tool with strong annotations and full schema coverage, the description covers purpose, when to use it, error behavior, and identifier formatting. The main gap is the absence of any return-shape guidance given there is no output schema, but the purpose sentence names the key result fields (access levels, force push settings).

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 the baseline is 3. The description largely restates what the schema already says about project_id (numeric ID or URL-encoded path) rather than adding new meaning; the generic instruction about 'pagination fields' doesn't apply since this tool has no pagination parameters.

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: 'Get details of a single protected branch (access levels, force push settings).' It also distinguishes itself from siblings by scoping to a single known resource versus discovery-oriented list/search tools, so an agent can tell it apart from list_protected_branches 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 explicit when-to-use ('known resource or result') and when-not-to-use ('need to discover multiple resources') guidance, which is clear and actionable. The alternative is pointed to generically as 'the corresponding list or search tool' rather than named (e.g., list_protected_branches), so it stops just 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.

get_repository_treeA
Read-only

List files and directories in a repository. Use this for a known resource or result; choose the corresponding list or search tool when you need to discover multiple resources. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
refNoThe name of a repository branch or tag. Defaults to the default branch.
pathNoThe path inside the repository
jmespathNoOptional JMESPath expression filtering the JSON result before return.
per_pageNoNumber of results to show per page
recursiveNoBoolean value to get a recursive tree
page_tokenNoToken for keyset pagination. Use the next_page_token value returned in the previous response to retrieve the next page.
paginationNoPagination method. Use 'keyset' for keyset-based pagination (required for repositories with many files). Non-keyset calls keep the legacy array response for backward compatibility; that legacy response shape is deprecated and may be removed in a future major release. Keyset calls return a structured response with items and next_page_token when more pages are available.
project_idYesThe ID or URL-encoded path of the project

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already provide readOnlyHint and openWorldHint, lowering the bar. The description adds valuable context by confirming no mutation and enumerating error conditions (missing resources, invalid identifiers, insufficient permission, rate limits), which goes 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?

The description is four sentences, each serving a distinct purpose: action, usage guidance, behavioral transparency, and parameter handling. It is front-loaded with the primary purpose and contains no filler.

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 tool with 8 parameters, 100% schema coverage, annotations, and no output schema, the description adequately covers purpose, usage, safety, and error behavior. Minor gaps: the unsupported reference to group_id could confuse, and it does not explicitly describe the return structure, but the schema and clear purpose compensate.

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 the schema already documents all parameters; the description only reinforces how to provide project_id/path and pagination. The mention of 'group_id' is extraneous since it is not in this schema, but it does not materially harm parameter understanding.

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 action and resource: 'List files and directories in a repository.' It also differentiates from discovery-focused siblings by advising to use other list or search tools when discovering multiple resources, making the tool's niche 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?

It explicitly says to use this tool for a known resource or result and to choose 'the corresponding list or search tool' when discovery is needed. It also instructs to use required identifiers and pagination fields exactly as documented, giving actionable usage direction.

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

get_userA
Read-only

Get user details by ID. Use this for a known resource or result; choose the corresponding list or search tool when you need to discover multiple resources. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
user_idYesThe ID of the user
jmespathNoOptional JMESPath expression filtering the JSON result before return.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already mark readOnlyHint=true, so the read-only claim is redundant, but the description adds useful behavioral context: it does not mutate GitLab data, and missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. This supplements what annotations convey.

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 sentences, with the purpose front-loaded and usage guidance following. It is mostly efficient, though the final sentence about pagination fields is slightly boilerplate and does not fully apply to this simple lookup tool.

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 simple single-resource lookup with one required parameter, the description covers purpose, when to use it, read-only behavior, error cases, and identifier handling. Nothing essential is missing for an agent to call it 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 the baseline is 3. The description adds little beyond the schema: the guidance about project_id or group_id paths does not apply to this tool's actual parameters, and jmespath is only described in the schema.

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: 'Get user details by ID.' It clearly distinguishes itself from list/search tools that discover multiple resources, and the sibling list contains get_users and search-like tools, so an agent can route correctly.

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 to use this tool for a known resource or result and to choose the corresponding list or search tool when discovering multiple resources. This gives the agent actionable selection criteria.

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

get_usersA
Read-only

Get GitLab user details by usernames. Use this for a known resource or result; choose the corresponding list or search tool when you need to discover multiple resources. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
jmespathNoOptional JMESPath expression filtering the JSON result before return.
usernamesYesArray of usernames to search for

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already mark this as readOnly and openWorld, so the description's read-only/no-mutation statement is redundant. However, it adds useful behavioral detail by disclosing that missing resources, invalid identifiers, insufficient permissions, and rate limits surface as errors. This goes beyond the annotations and helps an agent anticipate failure modes.

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?

The description is front-loaded with the core purpose and remains reasonably compact. The final sentence about identifiers and pagination is somewhat generic and not fully applicable to this schema, but it does not significantly bloat the text.

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 two-parameter read-only tool, the description covers purpose, usage context, error behavior, and read-only status. The lack of an output schema is offset by the clear statement that user details are returned. The irrelevant project_id/pagination guidance is a minor blemish but does not make the description incomplete.

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?

The schema covers both parameters (usernames and jmespath) at 100%, so the baseline is 3. The description adds little parameter-specific meaning; its mention of project_id/group_id and pagination fields does not match this tool's actual schema and is mostly generic boilerplate.

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 and resource: 'Get GitLab user details by usernames.' It also clarifies the intended scope by saying to use it for a 'known resource or result' rather than for discovery. However, it does not explicitly differentiate itself from the sibling get_user, so it is clear but not fully distinguished.

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 description gives explicit direction: use this tool for a known resource or result, and use a 'corresponding list or search tool' when discovery is needed. This provides clear context for when to use the tool, though it does not name specific sibling tools or explain when get_user would be preferred.

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

health_checkA
Read-only

Verify server status and authentication. Always reports the MCP server version (mcp_server_version). When authenticated, also reports the GitLab instance version from GET /api/v4/version (version, revision, enterprise). Version lookup failures do not fail the health check — those fields are omitted. Use this to verify server connectivity and authentication before making GitLab requests; use whoami when the authenticated user's identity is the goal. It does not mutate GitLab state and returns server/authentication status plus GitLab version details when available.

ParametersJSON Schema
NameRequiredDescriptionDefault
jmespathNoOptional JMESPath expression filtering the JSON result before return.

TDQS

A4.7/5.0
Behavior5/5

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

The description adds meaningful behavioral context beyond the readOnlyHint annotation: it does not mutate GitLab state, version lookup failures do not fail the health check, and the returned fields differ based on authentication status. It also specifies the source endpoint and the exact fields reported. This is strong transparency for an agent.

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?

The description is front-loaded with the core purpose, immediately followed by return-value details, failure behavior, usage guidance, and an explicit alternative. Every sentence carries useful information; there is no filler or vague boilerplate.

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 simple health-check tool with one optional parameter and no output schema, the description explains what is always returned, what is returned only when authenticated, and how failures are handled. It also covers non-mutation and when to use whoami, making the tool complete from an agent's perspective.

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?

The schema already documents the single jmespath parameter with 100% coverage, so the description does not need to explain it in depth. The description adds no new semantic detail about jmespath itself, but the baseline schema coverage is sufficient. A score of 3 is appropriate.

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 and resource: verifying server status and authentication, plus reporting GitLab version details when authenticated. It clearly distinguishes itself from whoami, noting that whoami is the tool to use when the authenticated user's identity is the goal. The purpose is unambiguous and easy for an agent to act on.

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?

It explicitly says to use this tool to verify server connectivity and authentication before making GitLab requests, and names whoami as the alternative when user identity is the goal. This gives the agent clear selection criteria and exclusions, which is exactly what usage guidance should provide.

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

list_branchesA
Read-only

List branches in project with search filter. Use this for a collection of resources; choose the corresponding get tool when you already know the single resource to inspect. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number for pagination (default: 1)
searchNoSearch term to filter branches by name
jmespathNoOptional JMESPath expression filtering the JSON result before return.
per_pageNoNumber of items per page (max: 100, default: 20)
project_idYesProject ID or complete URL-encoded path to project

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, so the description's read-only claim adds limited value. However, it goes beyond annotations by disclosing that missing resources, invalid identifiers, insufficient permission, and rate limits surface as errors, which helps an agent anticipate failure modes.

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?

The purpose is front-loaded in the first sentence, and the usage guidance follows immediately. The final sentence about 'project_id or group_id' is a bit generic and slightly redundant with the schema, keeping it from a perfect score.

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?

The description covers what the tool does, when to use it, error behavior, and parameter identification guidance, which is sufficient for a simple list operation. There is no output schema, but for a branch-listing tool this is not a serious gap.

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 the schema carries the parameter documentation burden. The description adds some guidance about project_id being a numeric ID or URL-encoded path and reminds about pagination, but this is largely restating or slightly genericizing the schema content.

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 action ('List branches in project') and a distinguishing detail ('with search filter'), and explicitly contrasts with the corresponding get tool for single resources. This makes it easy to tell apart from sibling tools like get_branch and list_protected_branches.

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 explicit when-to-use guidance: use for a collection of resources, and choose the get tool when the single resource is already known. It also clarifies read-only behavior and error conditions, leaving little room for agent misselection.

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

list_ci_catalog_resourcesA
Read-only

List GitLab CI/CD Catalog resources/components visible to the user. Use this for a collection of resources; choose the corresponding get tool when you already know the single resource to inspect. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNoSort order
afterNoGraphQL cursor for the next page
firstNoNumber of resources to return (default: 20, max: 100)
scopeNoCatalog resource scope
searchNoSearch catalog resources by name or description
topicsNoFilter by project topic names
jmespathNoOptional JMESPath expression filtering the JSON result before return.
group_idsNoFilter to catalog resources in these group IDs
verification_levelNoFilter by verification level

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true. The description reinforces the read-only nature and adds valuable behavioral context about error conditions: missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. This goes beyond the annotations without contradicting them.

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 with no filler. The purpose is front-loaded, the alternative is named, and the error behavior is stated compactly. 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?

The description covers purpose, usage boundaries, read-only behavior, and error handling, which is strong for a list tool. The slight mismatch in the identifier parameter name prevents a perfect score, and there is no return-shape description, though no output schema exists to clarify that.

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%, so the baseline is 3. The description adds only generic advice about pagination and identifiers, and its mention of 'project_id' or 'group_id' does not match the actual schema parameters (e.g., group_ids, not group_id). Thus it adds little parameter-level meaning beyond the schema.

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 and resource: 'List GitLab CI/CD Catalog resources/components visible to the user.' It also explicitly distinguishes itself from the single-resource get tool, so an agent can tell this list operation apart from get_ci_catalog_resource.

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?

It gives clear when-to-use guidance: 'Use this for a collection of resources; choose the corresponding get tool when you already know the single resource to inspect.' It also mentions pagination and identifier handling, giving the agent actionable context for invocation.

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

list_commitsA
Read-only

List repository commits with filtering options. Use this for a collection of resources; choose the corresponding get tool when you already know the single resource to inspect. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
allNoRetrieve every commit from the repository
pageNoPage number for pagination (default: 1)
pathNoThe file path
orderNoList commits in order
sinceNoOnly commits after or on this date are returned in ISO 8601 format YYYY-MM-DDTHH:MM:SSZ
untilNoOnly commits before or on this date are returned in ISO 8601 format YYYY-MM-DDTHH:MM:SSZ
authorNoSearch commits by commit author
jmespathNoOptional JMESPath expression filtering the JSON result before return.
per_pageNoNumber of items per page (max: 100, default: 20)
ref_nameNoThe name of a repository branch, tag or revision range, or if not given the default branch
trailersNoParse and include Git trailers for every commit
project_idYesProject ID or complete URL-encoded path to project
with_statsNoStats about each commit are added to the response
first_parentNoFollow only the first parent commit upon seeing a merge commit

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, and the description goes beyond that by enumerating failure modes (missing resources, invalid identifiers, insufficient permission, and rate limits returned as errors). It does not describe response shape or pagination internals, but the added error behavior is meaningful.

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 sentences are front-loaded with the core action and usage rule, then safety and error details. The last sentence is slightly redundant ('described by the schema' and 'exactly as documented') but the overall length is tight and focused.

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?

Covers purpose, usage boundary, read-only safety, error behavior, and identifier/pagination care, which is enough for a list operation without an output schema. The group_id reference is a flaw, and the description does not explain filter interactions, leaving minor gaps for a 14-parameter tool.

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?

The schema already covers all 14 parameters, so the bar for added meaning is modest. However, the description's identifier guidance mostly repeats the schema, and its claim that 'project_id or group_id is accepted' is not supported by the schema, which lists only project_id. This makes the parameter guidance partially misleading.

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 repository commits with filtering options.' It explicitly positions this tool as the collection-level operation and distinguishes it from the corresponding get tool for a single resource, so an agent can tell it apart from get_commit and similar siblings.

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?

Directly says when to use this tool ('Use this for a collection of resources') and when to choose an alternative ('choose the corresponding get tool when you already know the single resource to inspect'). It also adds operational context: read-only behavior, error conditions, and identifier/pagination care.

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

list_commit_statusesA
Read-only

List statuses for a commit. Use this for a collection of resources; choose the corresponding get tool when you already know the single resource to inspect. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
allNoReturn all statuses, not only latest ones
refNoFilter statuses by Git ref
shaYesThe commit hash or name of a repository branch or tag
nameNoFilter statuses by status name or context
pageNoPage number for pagination (default: 1)
sortNoSort direction
stageNoFilter statuses by build stage
jmespathNoOptional JMESPath expression filtering the JSON result before return.
order_byNoField to order statuses by
per_pageNoNumber of items per page (max: 100, default: 20)
project_idYesProject ID or complete URL-encoded path to project
pipeline_idNoFilter statuses by pipeline ID

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already mark readOnlyHint=true, and the description adds that the tool does not mutate GitLab data and describes error behavior for missing resources, invalid identifiers, insufficient permission, and rate limits. This is useful operational context 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.

Conciseness4/5

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

Three compact sentences, with the core purpose first and operational notes after. Some boilerplate is present, such as the generic 'collection of resources' phrasing, but it is not excessive.

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?

The tool has 12 parameters and no output schema, but every parameter is documented and the description covers read-only behavior, error conditions, and pagination. Missing details like default latest-only status are already implied by the schema's `all` parameter.

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 the schema already handles parameter meaning; the description mostly repeats project_id and pagination guidance. The mention of group_id is not present in this schema and adds slight noise rather than new semantic value.

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 action and resource: 'List statuses for a commit,' and contrasts it with a get-tool pattern for single resources. This clearly distinguishes it from siblings like list_commits or create_commit_status.

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 use this tool when retrieving a collection and to choose the corresponding get tool when a single resource is known, providing a when/when-not rule. It does not name the exact get sibling, so the guidance is slightly generic.

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

list_draft_notesA
Read-only

List draft notes for a merge request. Use this for a collection of resources; choose the corresponding get tool when you already know the single resource to inspect. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
jmespathNoOptional JMESPath expression filtering the JSON result before return.
project_idYesProject ID or complete URL-encoded path to project
merge_request_iidYesThe IID of a merge request

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already mark this as read-only, and the description reinforces that and adds useful error behavior: missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. This goes beyond the structured annotations by setting caller expectations for failure modes, though it does repeat the read-only point.

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?

The description is organized with the purpose first, followed by usage, behavioral, and parameter guidance. Every sentence contributes, though the closing identifier/pagination sentence is somewhat generic and could be trimmed.

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 two-required-parameter list tool with readOnly annotations, the description covers purpose, selection criteria, safety, error behavior, and identifier formatting. Without an output schema, it could still be more explicit about the response shape or pagination behavior, but the core information an agent needs to call it correctly is present.

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 the structured definitions already explain project_id, merge_request_iid, and jmespath. The description repeats the numeric-ID-or-URL-encoded-path guidance and says to use identifiers exactly as documented, but it adds no new parameter semantics beyond the schema.

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 opens with 'List draft notes for a merge request,' giving a specific verb and resource and scoping it to merge requests. It also distinguishes the collection operation from 'the corresponding get tool,' so an agent can separate it from get_draft_note 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 Guidelines5/5

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

It explicitly states when to use this tool ('for a collection of resources') and when to choose another ('choose the corresponding get tool when you already know the single resource to inspect'). It also directs callers to follow the documented identifier and pagination conventions, which aids correct invocation.

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

list_eventsA
Read-only

List events for the authenticated user (before/after: YYYY-MM-DD). Use this for a collection of resources; choose the corresponding get tool when you already know the single resource to inspect. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoReturns the specified results page. Default: 1
sortNoDirection to sort the results by creation date. Default: desc
afterNoIf defined, Returns events created after the specified date (YYYY-MM-DD format). To include events on 2025-08-29, use after=2025-08-28
scopeNoInclude all events across a user's projects
actionNoIf defined, returns events with the specified action type
beforeNoIf defined, Returns events created before the specified date (YYYY-MM-DD format). To include events on 2025-08-29, use before=2025-08-30
jmespathNoOptional JMESPath expression filtering the JSON result before return.
per_pageNoNumber of results per page. Default: 20
target_typeNoIf defined, returns events with the specified target type

TDQS

A3.9/5.0
Behavior4/5

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

The description states 'It is read-only and does not mutate GitLab data' and enumerates error conditions (missing resources, invalid identifiers, insufficient permission, rate limits). This goes beyond the readOnlyHint annotation by specifying how failures are surfaced, which helps an agent anticipate outcomes.

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

Conciseness3/5

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

The purpose is front-loaded and the main usage note is efficient. However, the sentence about project_id/group_id references parameters absent from the schema, so it is filler that could mislead an agent and should be removed. This prevents the description from earning full marks for 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?

For a tool with 9 parameters and no output schema, the description covers usage, safety, and error behavior, but it leaves gaps. It does not clarify the relationship with the get_project_events sibling, and the project_id/group_id sentence is irrelevant to this tool's schema. An agent would still rely heavily on the schema for invocation details.

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 the baseline is 3. The description adds generic guidance about project_id/group_id and pagination fields, but those identifiers are not in the schema, making the guidance potentially confusing rather than additive. It does not meaningfully enrich the already-documented parameter semantics.

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 opens with 'List events for the authenticated user' which clearly identifies the verb, resource, and scope. It explicitly distinguishes itself from sibling get tools by instructing to 'choose the corresponding get tool when you already know the single resource to inspect,' making it unambiguous as a collection-oriented list 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 provides a clear when-to-use guideline: 'Use this for a collection of resources' and an exclusion: 'choose the corresponding get tool when you already know the single resource to inspect.' However, it does not name specific siblings like get_project_events, so an agent might still need to infer the exact alternative for project-scoped events.

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

list_group_iterationsA
Read-only

List group iterations with filtering options. Use this for a collection of resources; choose the corresponding get tool when you already know the single resource to inspect. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number for pagination (default: 1)
stateNoReturn opened, upcoming, current, closed, or all iterations.
searchNoReturn only iterations with a title matching the provided string.
group_idYesGroup ID or URL-encoded path
jmespathNoOptional JMESPath expression filtering the JSON result before return.
per_pageNoNumber of items per page (max: 100, default: 20)
search_inNoFields in which fuzzy search should be performed with the query given in the argument search. The available options are title and cadence_title. Default is [title].
updated_afterNoReturn only iterations updated after the given datetime. Expected in ISO 8601 format (2019-03-15T08:00:00Z).
updated_beforeNoReturn only iterations updated before the given datetime. Expected in ISO 8601 format (2019-03-15T08:00:00Z).
include_ancestorsNoInclude iterations for group and its ancestors. Defaults to true.
include_descendantsNoInclude iterations for group and its descendants. Defaults to false.

TDQS

A4.1/5.0
Behavior4/5

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

The annotations already declare readOnlyHint=true, and the description reinforces non-mutation while adding useful behavioral detail about errors for missing resources, invalid identifiers, insufficient permission, and rate limits. This goes beyond the annotations without contradicting them.

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?

The description is front-loaded with the main action first, and most sentences carry real guidance: collection scope, read-only/error behavior, and identifier handling. The only minor redundancy is stating both 'read-only' and 'does not mutate,' but it does not bloat the description significantly.

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 filtered list tool with rich schema descriptions and readOnlyHint/openWorldHint annotations, the description provides adequate context: scope, error behavior, pagination handling, and identifier guidance are covered. Without an output schema, it does not describe the return shape, but the core invocation context is sufficiently 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 schema coverage is 100%, so the schema already documents all parameters in detail. The description adds a general identifier-format guideline, but no additional meaning for specific filter parameters beyond what the schema already states.

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 uses the imperative verb 'List' with the explicit resource 'group iterations' and mentions filtering options. It clearly communicates that this is the collection-oriented counterpart to a single-resource get tool, making it distinguishable from siblings that target one resource.

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 explicitly states when to use the tool: use it for a collection of resources, and directs the agent to a get tool when a single resource is already known. It does not name a specific sibling alternative, but the when-to-use guidance is clear and selection-relevant.

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

list_group_membersA
Read-only

List members of a GitLab group with optional name or username search. Use this for a collection of resources; choose the corresponding get tool when you already know the single resource to inspect. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number for pagination (default: 1)
queryNoSearch for members by name or username
group_idYesGroup ID or URL-encoded path
jmespathNoOptional JMESPath expression filtering the JSON result before return.
per_pageNoNumber of items per page (default: 20, max: 100)
user_idsNoFilter by user IDs
skip_usersNoUser IDs to exclude
include_inheritanceNoInclude inherited members. Defaults to false.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, and the description reinforces that it is read-only and does not mutate GitLab data. It adds useful behavioral context by disclosing that missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors, which goes 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.

Conciseness4/5

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

The description is reasonably concise and front-loaded with the core purpose, followed by usage guidance and behavioral notes. It is slightly dense with multiple clauses in the last sentence, but every sentence earns its place and there is no fluff.

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 100% schema coverage and no output schema, the description covers purpose, usage, error behavior, and identifier guidance. It does not describe the return format, but the absence of an output schema and the read-only nature make this a minor gap rather than a critical one.

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 the schema already documents all parameters. The description adds general guidance about using numeric IDs or URL-encoded paths and pagination fields, but does not add specific meaning beyond the schema for individual parameters. Baseline 3 is appropriate.

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 clearly states the tool lists members of a GitLab group with optional name or username search, and explicitly distinguishes it from the corresponding get tool for single resources. This makes its purpose unambiguous and differentiates it from siblings like list_project_members.

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?

The description explicitly says to use this for a collection of resources and to choose the corresponding get tool when you already know the single resource to inspect. It also provides guidance on identifiers and pagination fields, giving clear when-to-use and how-to-use context.

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

list_group_merge_requestsA
Read-only

List merge requests across all projects of a group and its subgroups. Use this for a collection of resources; choose the corresponding get tool when you already know the single resource to inspect. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
wipNoFilter merge requests against their wip status
pageNoPage number for pagination (default: 1)
sortNoReturn merge requests sorted in ascending or descending order
scopeNoReturn merge requests from a specific scope
stateNoReturn merge requests with a specific state
labelsNoArray of label names
searchNoSearch for specific terms
group_idYesGroup ID or URL-encoded path
jmespathNoOptional JMESPath expression filtering the JSON result before return.
order_byNoReturn merge requests ordered by the given field
per_pageNoNumber of items per page (max: 100, default: 20)
author_idNoReturns merge requests created by the given user ID (integer). Mutually exclusive with author_username.
milestoneNoMilestone title
assignee_idNoReturn MRs assigned to the given user ID (integer), 'none', or 'any'. Mutually exclusive with assignee_username.
reviewer_idNoReturns merge requests which have the user as a reviewer. Must be an integer, 'none', or 'any'. Mutually exclusive with reviewer_username.
non_archivedNoReturn merge requests from non-archived projects only. Defaults to true.
created_afterNoReturn merge requests created after the given time
source_branchNoReturn merge requests from a specific source branch
target_branchNoReturn merge requests targeting a specific branch
updated_afterNoReturn merge requests updated after the given time
created_beforeNoReturn merge requests created before the given time
updated_beforeNoReturn merge requests updated before the given time
author_usernameNoReturns merge requests created by the given username. Mutually exclusive with author_id.
assignee_usernameNoReturns merge requests assigned to the given username. Mutually exclusive with assignee_id.
reviewer_usernameNoReturns merge requests which have the user as a reviewer by username. Mutually exclusive with reviewer_id.
source_project_idNoReturn merge requests with the given source project ID
with_labels_detailsNoReturn more details for each label
approved_by_usernamesNoReturns merge requests approved by the given usernames (array).

TDQS

A4.1/5.0
Behavior4/5

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

It confirms read-only behavior, which matches the readOnlyHint annotation, and adds useful error behavior: missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. This goes beyond the annotations by telling the agent what failure modes to expect, without contradicting any annotation.

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?

The description is compact and front-loaded with the primary purpose. The third sentence is somewhat long and includes a mildly redundant instruction to use fields exactly as documented, but it still earns its place by disclosing error behavior and ID format requirements.

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?

Given the tool's 28 parameters and no output schema, the description reasonably covers the essential call context: scope, when to use it, read-only safety, error conditions, and identifier format. The schema handles the exhaustive parameter details, so nothing critical is missing for correct invocation.

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?

The input schema has 100% description coverage, so the description does not need to repeat parameter details. The note about numeric IDs versus URL-encoded paths mirrors the schema's group_id description, and the instruction to use required identifiers and pagination fields is general rather than additive. Baseline 3 is appropriate.

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 identifies a specific verb, resource, and scope: 'List merge requests across all projects of a group and its subgroups.' It clearly distinguishes this group-scoped list operation from the single-resource get tool mentioned in the second sentence, and the name itself differentiates it from project-level or global list 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?

The description gives explicit when-to-use guidance: use it for a collection of resources, and use the corresponding get tool when a single resource is already known. It does not explicitly compare against the sibling list_merge_requests tool, but the group/subgroup scope and the get-tool contrast provide clear context for selection.

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

list_group_projectsA
Read-only

List projects in a group. Use this for a collection of resources; choose the corresponding get tool when you already know the single resource to inspect. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number for pagination (default: 1)
sortNoSort direction
topicNoFilter by topic (projects tagged with this topic)
searchNoSearch term to filter projects
starredNoFilter by starred projects
archivedNoFilter for archived projects
group_idYesGroup ID or path
jmespathNoOptional JMESPath expression filtering the JSON result before return.
order_byNoField to sort by
per_pageNoNumber of items per page (max: 100, default: 20)
statisticsNoInclude project statistics
visibilityNoFilter by project visibility
min_access_levelNoFilter by minimum access level
include_subgroupsNoInclude projects from subgroups
with_issues_enabledNoFilter projects with issues feature enabled
with_security_reportsNoInclude security reports
with_custom_attributesNoInclude custom attributes
with_programming_languageNoFilter by programming language
with_merge_requests_enabledNoFilter projects with merge requests feature enabled

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already carry readOnlyHint and openWorldHint, so the bar is lower; the description adds value beyond them by disclosing error behavior (missing resources, invalid identifiers, insufficient permission, rate limits returned as errors). No contradiction with annotations — the read-only claim aligns with readOnlyHint=true.

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

Conciseness3/5

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

The core purpose is front-loaded in the first sentence, and the description is compact at three sentences. However, phrases like 'read-only and does not mutate GitLab data' are redundant, and the final sentence is generic boilerplate that could apply to nearly any tool, diluting the value of the prose.

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?

For a 19-parameter tool with no output schema, the description covers purpose, routing, safety, and error behavior, leaving parameter details to the fully documented schema. It is adequate but incomplete: it does not describe the return format or pagination response shape, which matters since no output schema exists to fill that gap.

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%, so the baseline is 3. The description adds minor guidance about supplying numeric IDs or URL-encoded paths, but this largely restates the schema's 'Group ID or path' note and is somewhat generic boilerplate. It also references project_id, which is not a parameter in this schema, introducing slight inaccuracy.

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 opens with a specific verb+resource ('List projects in a group') and explicitly contrasts itself with the 'corresponding get tool' for single-resource inspection, which differentiates it from siblings like get_project. However, it does not distinguish itself from the close sibling list_projects, leaving a plausible alternative ambiguous.

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 decision rule: use for a collection of resources, and switch to the get tool when a single resource is known. This is explicit routing guidance, but it omits exclusions relative to list_projects and other list tools, so it falls short of fully covering when-not-to-use scenarios.

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

list_issue_discussionsA
Read-only

List discussions for an issue. Use this to inspect threaded discussions for an issue; use list_issues for issue records and get_issue for one issue's fields. It is read-only and returns discussion items, while invalid identifiers, missing issues, and permission failures are reported as errors.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number for pagination (default: 1)
jmespathNoOptional JMESPath expression filtering the JSON result before return.
per_pageNoNumber of items per page (max: 100, default: 20)
issue_iidYesThe internal ID of the project issue
project_idYesProject ID or URL-encoded path

TDQS

A4.4/5.0
Behavior4/5

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

The description states it is read-only (matching readOnlyHint=true) and adds error behavior: invalid identifiers, missing issues, and permission failures are reported as errors. It also says it returns discussion items. While annotations already cover the read-only safety profile, the error reporting adds value beyond annotations. It doesn't contradict 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 with no filler. The core purpose is front-loaded, and the sibling differentiation and error behavior are compactly included. Every word 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?

The description covers purpose, usage, and error behavior, and the schema covers parameters and pagination. It does not describe the exact structure of returned discussion items, but for a list tool with no output schema, this is a minor gap. The tool is adequately specified for correct invocation.

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 all five parameters are already fully documented in the schema. The description adds no extra parameter-level detail, but given the complete schema, the baseline of 3 is appropriate.

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 clearly states the action (list discussions) and the target (an issue), and explicitly differentiates it from `list_issues` and `get_issue`, so an agent can immediately tell what this tool does and how it differs from close siblings.

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?

The description gives explicit usage guidance: use this to inspect threaded discussions, use `list_issues` for issue records, and `get_issue` for single issue fields. This provides both when-to-use and when-not-to-use with named alternatives.

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

list_issue_emoji_reactionsA
Read-only

List all emoji reactions on an issue. Use this for a collection of resources; choose the corresponding get tool when you already know the single resource to inspect. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
jmespathNoOptional JMESPath expression filtering the JSON result before return.
issue_iidYesThe IID of an issue
project_idYesProject ID or complete URL-encoded path to project

TDQS

A3.7/5.0
Behavior4/5

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

The annotations already declare readOnlyHint and openWorldHint, so the bar for additional behavioral disclosure is lower. The description adds concrete error conditions (missing resources, invalid identifiers, insufficient permission, rate limits) and explicitly states it does not mutate data, providing useful operational context 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.

Conciseness4/5

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

The description is three sentences with the core purpose front-loaded. The first two sentences are tight and informative; the third is a generic template clause that introduces off-schema references, but overall the structure is efficient.

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?

For a simple read-only list operation, the description covers purpose, read-only behavior, error handling, and a rough usage rule. However, the inaccurate `group_id`/pagination references and silence about the response shape leave minor gaps that an agent must infer or discover elsewhere.

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 coverage is 100%, so the schema already documents the parameters. The description's parameter guidance is mostly redundant, and it references `group_id` and 'pagination fields' that do not appear anywhere in the input schema. This can mislead an agent rather than clarify.

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 opens with 'List all emoji reactions on an issue,' a specific verb+resource pair. This clearly distinguishes it from sibling tools like list_issue_note_emoji_reactions and the merge request reaction counterparts, leaving no ambiguity about what is listed.

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 advises using this tool 'for a collection of resources' and suggests a get tool when a single resource is known. However, no corresponding get tool for emoji reactions actually exists, and the description does not explicitly contrast with create/delete or note-scoped siblings. The guidance is directionally useful but lacks concrete alternatives.

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

list_issue_note_emoji_reactionsA
Read-only

List all emoji reactions on an issue note. Pass discussion_id for discussion thread replies. Use this for a collection of resources; choose the corresponding get tool when you already know the single resource to inspect. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
note_idYesThe ID of a note (comment or thread reply)
jmespathNoOptional JMESPath expression filtering the JSON result before return.
issue_iidYesThe IID of an issue
project_idYesProject ID or complete URL-encoded path to project
discussion_idNoThe ID of a discussion thread. Required for notes that are discussion replies; omit for top-level notes.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, and the description reinforces this by saying the tool 'is read-only and does not mutate GitLab data.' It additionally discloses error behavior for missing resources, invalid identifiers, insufficient permissions, and rate limits, which adds value 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.

Conciseness4/5

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

The description is only four sentences and front-loads the core purpose first. It is appropriately concise, though the final generic sentence about project_id/group_id and pagination is not specific to this tool and adds minor noise.

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 straightforward read-only list tool with all parameters schema-documented, the description is largely complete. It covers collection-vs-single use, discussion_id handling, and error behavior, though it does not describe the expected return payload since no output schema is present.

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 the baseline is 3 and the schema already documents all parameters. The description adds discussion_id context already present in the schema, but also includes a boilerplate note about group_id which is not a parameter in this schema, reducing its added value.

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 opens with a specific verb and resource: 'List all emoji reactions on an issue note.' It also distinguishes a collection use case from a single-resource get tool, clearly separating it from sibling list/get tools.

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?

The description explicitly says to pass discussion_id for discussion thread replies and directs the agent to 'choose the corresponding get tool when you already know the single resource to inspect.' This gives concrete when-to-use versus alternative guidance.

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

list_issuesA
Read-only

List issues (default: created by current user; use scope='all' for all). Use this for issue management: list GitLab issues, optionally scoped with project_id. Use get_issue when the issue iid is already known and my_issues for issues assigned to the current user. It is read-only and paginated, requires issue read permission, and returns issue records or GitLab errors for invalid identifiers, missing resources, or rate limits.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number for pagination (default: 1)
scopeNoReturn issues from a specific scope
stateNoReturn issues with a specific state
labelsNoArray of label names
searchNoSearch for specific terms
due_dateNoReturn issues that have the due date
jmespathNoOptional JMESPath expression filtering the JSON result before return.
per_pageNoNumber of items per page (max: 100, default: 20)
author_idNoReturn issues created by the given user ID. Mutually exclusive with author_username.
milestoneNoMilestone title
issue_typeNoFilter to a given type of issue. One of issue, incident, test_case or task
project_idNoProject ID or URL-encoded path (optional - if not provided, lists issues across all accessible projects)
assignee_idNoReturn issues assigned to the given user ID (user id, none, or any). Mutually exclusive with assignee_username.
confidentialNoFilter confidential or public issues
iteration_idNoReturn issues assigned to the given iteration ID. None returns issues that do not belong to an iteration. Any returns issues that belong to an iteration.
created_afterNoReturn issues created after the given time
updated_afterNoReturn issues updated after the given time
created_beforeNoReturn issues created before the given time
updated_beforeNoReturn issues updated before the given time
author_usernameNoReturn issues created by the given username. Mutually exclusive with author_id.
assignee_usernameNoReturn issues assigned to the given username. Mutually exclusive with assignee_id.
with_labels_detailsNoReturn more details for each label

TDQS

A4.7/5.0
Behavior5/5

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

Even though annotations already mark readOnlyHint=true, the description adds meaningful behavioral context: it is paginated, requires issue read permission, and returns issue records or GitLab errors for invalid identifiers, missing resources, or rate limits. This goes beyond the annotation and helps the agent anticipate failure modes.

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?

The description is three sentences with no wasted words. It front-loads the core purpose, immediately covers the default behavior, then adds alternative routing and safety/error context in a tight structure.

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 22-parameter tool with no output schema, the description covers the essential context: what it lists, how scope works, when to use siblings, pagination, permissions, and expected return/error behavior. The rich schema fills in the remaining parameter details, so nothing critical 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 every parameter already has a meaningful description. The tool description adds only light semantic value by mentioning the default scope and optional project_id filtering, but it does not need to explain the many other parameters.

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 clearly states a specific verb and resource: 'List issues' and 'list GitLab issues, optionally scoped with project_id'. It also gives the default scope and explicitly distinguishes itself from get_issue and my_issues, so an agent can confidently select it over sibling tools.

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?

Usage guidance is explicit: it says to use get_issue when the issue iid is already known and my_issues for issues assigned to the current user. It also clarifies the default behavior (created by current user) and how to broaden it with scope='all'.

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

list_labelsA
Read-only

List labels for a project. Use this for a collection of resources; choose the corresponding get tool when you already know the single resource to inspect. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number for pagination (default: 1)
searchNoKeyword to filter labels by
jmespathNoOptional JMESPath expression filtering the JSON result before return.
per_pageNoNumber of items per page (max: 100, default: 20)
project_idYesProject ID or URL-encoded path
with_countsNoWhether to include issue and merge request counts
include_ancestor_groupsNoInclude ancestor groups

TDQS

A4.5/5.0
Behavior5/5

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

The description adds that the tool is read-only and does not mutate GitLab data, which aligns with readOnlyHint=true. It goes beyond annotations by disclosing that missing resources, invalid identifiers, insufficient permission, and rate limits are surfaced as errors, which is useful behavioral context. No contradiction with annotations.

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?

The description is front-loaded with the purpose and usage guidance, but the third sentence mixes generic identifier advice with pagination and includes a conditional about group_id that does not apply to this schema. It is relatively concise but could be tightened by removing the irrelevant group_id clause.

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?

Given the tool is a simple read-only list with all parameters documented in schema, the description covers the key distinctions and error behavior. It doesn't describe the return format, but for a list tool that may be acceptable. The advice about projection and pagination is present, so an agent has enough to invoke it 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?

All 7 parameters already have descriptions in the schema (100% coverage), so the description's role is supplementary. It reiterates that project_id accepts a numeric ID or URL-encoded path (already in schema) and advises using pagination fields as documented, adding little new meaning beyond the schema.

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 names the action ('List labels') and the resource ('for a project'), which is specific. It also distinguishes this collection-oriented tool from the get tool for single resources, differentiating it from siblings like get_label. The mention of group_id is slightly tangential because the schema only accepts project_id.

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?

It explicitly states when to use this tool ('for a collection of resources') and when to choose the alternative ('when you already know the single resource to inspect'). This is direct usage guidance versus siblings. It also instructs to use required identifiers and pagination fields as documented, reinforcing correct invocation.

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

list_merge_request_changed_filesA
Read-only

List changed file paths in a merge request without diff content (mergeRequestIid or branchName required). Use this for a collection of resources; choose the corresponding get tool when you already know the single resource to inspect. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
jmespathNoOptional JMESPath expression filtering the JSON result before return.
project_idYesProject ID or complete URL-encoded path to project
source_branchNoSource branch name
merge_request_iidNoThe IID of a merge request
excluded_file_patternsNoArray of regex patterns to exclude files. Examples: ["^vendor/", "\.pb\.go$"]

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, and the description reinforces it by saying 'does not mutate GitLab data'. It adds behavioral context on error handling (missing resources, invalid identifiers, insufficient permission, rate limits), which is valuable beyond annotations. No contradiction.

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?

The description is reasonably concise with key info front-loaded: purpose and scope first, then usage guidance and error handling. It is a bit dense with multiple clauses but each sentence adds value. It could be split for readability but is not bloated.

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?

Given the tool's moderate complexity (5 params, no output schema) and the strong annotation coverage, the description covers purpose, usage, error behavior, and identifier handling. It does not detail the return format (e.g., array of strings), but with no output schema that might be expected; still, the lack of explicit return description is a minor gap given the tool's simple output.

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 description coverage is 100%, so the baseline is 3. The description adds guidance on using numeric ID or URL-encoded paths for project_id/group_id and mentions pagination fields, which is extra clarity. It also implies which parameters are alternative identifiers (mergeRequestIid or branchName) despite not listing all in the schema. This exceeds the baseline.

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'), resource ('changed file paths'), and scope ('in a merge request'), and distinguishes from the 'get' tool by noting it is for a collection of resources. The description also clarifies what it does NOT include ('without diff content'), preventing confusion with diff-related 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?

Explicitly states the main use case (listing a collection) and contrasts with the 'get' tool for a single resource. It also notes required identifiers and error conditions, but does not explicitly mention when NOT to use this tool beyond the sibling distinction.

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

list_merge_request_diffsA
Read-only

List merge request diffs with pagination (mergeRequestIid or branchName required). Use this for a collection of resources; choose the corresponding get tool when you already know the single resource to inspect. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number for pagination (default: 1)
unidiffNoPresent diffs in the unified diff format. Default is false. Introduced in GitLab 16.5.
jmespathNoOptional JMESPath expression filtering the JSON result before return.
per_pageNoNumber of items per page (max: 100, default: 20)
project_idYesProject ID or complete URL-encoded path to project
source_branchNoSource branch name
merge_request_iidNoThe IID of a merge request

TDQS

A3.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, but the description adds value by explicitly stating it does not mutate GitLab data and by enumerating error conditions such as missing resources, invalid identifiers, insufficient permission, and rate limits. This is useful context beyond the annotations, though not exhaustive.

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

Conciseness3/5

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

The description is reasonably front-loaded with the action and pagination, and the read-only/error sentence adds useful context. However, the final sentence repeats schema guidance, references group_id outside the schema, and the parenthetical identifier requirement is unclear, adding noise.

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?

It covers purpose, pagination, read-only behavior, error handling, and the collection-vs-single guidance. But with no output schema, it does not describe what a returned diff list looks like, and it muddies identifier requirements; for a 7-parameter tool this is only partially complete.

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 coverage is 100%, so the baseline is 3, but the description adds unreliable semantics: 'mergeRequestIid or branchName required' conflicts with the schema's only required parameter being project_id, 'branchName' is not a schema parameter, and group_id is mentioned though absent from the schema. The URL-encoded path advice mostly duplicates the schema, so the net contribution is negative and potentially misleading.

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 action ('List merge request diffs with pagination') and identifies the tool as the collection-oriented alternative to a get tool. However, the parenthetical claiming 'mergeRequestIid or branchName required' uses names that do not match the schema and could confuse an agent, so it does not earn a 5.

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 explicitly says to use this for a collection of resources and to choose the corresponding get tool when inspecting a single resource. It does not name the exact sibling tool or cover alternatives like changed-files tools, but it gives clear enough when-to-use direction.

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

list_merge_request_emoji_reactionsA
Read-only

List all emoji reactions on a merge request. Use this for a collection of resources; choose the corresponding get tool when you already know the single resource to inspect. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
jmespathNoOptional JMESPath expression filtering the JSON result before return.
project_idYesProject ID or complete URL-encoded path to project
merge_request_iidYesThe IID of a merge request

TDQS

A3.9/5.0
Behavior4/5

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

Annotations supply readOnlyHint=true, and the description adds concrete value beyond it: 'read-only and does not mutate GitLab data,' plus enumerated error conditions (missing resources, invalid identifiers, insufficient permission, rate limits). This aligns with both readOnlyHint and openWorldHint, and no contradiction exists between description and annotations.

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?

Four sentences, front-loaded with the core purpose, followed by usage routing, safety/error disclosure, and parameter guidance. Each sentence earns its place, though the final sentence contains boilerplate (group_id, pagination) that is not actually applicable to this schema, keeping it just short of top marks.

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 3-parameter list tool with 100% schema coverage, readOnlyHint=true, and no output schema, the description covers selection criteria, safety posture, and error conditions—the essentials an agent needs. Residual gaps (unnamed note-level sibling, no return-format hint) are minor given the schema richness; the inapplicable group_id line is the main noise.

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%, so the schema already documents all three parameters, setting the baseline at 3. The description reinforces the project_id format ('numeric ID or complete URL-encoded path described by the schema'), but introduces a conditional reference to group_id that does not exist in this schema and a generic pagination directive with no pagination fields present—mild noise that prevents it from exceeding the baseline.

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 all emoji reactions on a merge request,' which matches the tool name precisely and distinguishes it from single-resource get tools. It frames collection vs. single-resource tooling, but refers generically to 'the corresponding get tool' rather than naming the most confusable sibling, list_merge_request_note_emoji_reactions, so the name must carry that differentiation.

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?

Provides an explicit selection rule: use for a collection of resources, switch to a get tool when a single resource is already known. This is actionable and clear, though the get-tool alternative is generic; it does not point at a concrete sibling for note-level emoji reactions or the create/delete emoji tools, leaving some routing to inference.

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

list_merge_request_note_emoji_reactionsA
Read-only

List all emoji reactions on a merge request note. Pass discussion_id for discussion thread replies. Use this for a collection of resources; choose the corresponding get tool when you already know the single resource to inspect. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
note_idYesThe ID of a note (comment or thread reply)
jmespathNoOptional JMESPath expression filtering the JSON result before return.
project_idYesProject ID or complete URL-encoded path to project
discussion_idNoThe ID of a discussion thread. Required for notes that are discussion replies; omit for top-level notes.
merge_request_iidYesThe IID of a merge request

TDQS

A4.3/5.0
Behavior4/5

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

While readOnlyHint already flags safety, the description adds concrete behavioral detail by stating the tool 'does not mutate GitLab data' and enumerating error outcomes (missing resources, invalid identifiers, insufficient permission, rate limits). This goes 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.

Conciseness4/5

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

The description is front-loaded with the core purpose and each sentence adds a distinct piece of information. The final sentence contains minor boilerplate (mentioning group_id and pagination fields that are not in the schema), but overall it remains efficient.

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 no output schema, the description covers scope, read-only behavior, error handling, and identifier formats. It falls slightly short of full completeness because the generic group_id/pagination mention could confuse an agent, and it doesn't describe the result shape.

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 meaningful guidance: discussion_id is 'Required for notes that are discussion replies' and project_id can be a numeric ID or URL-encoded path. This clarifies the schema rather than repeating it.

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 opens with a specific verb and resource: 'List all emoji reactions on a merge request note.' It also distinguishes the collection-oriented tool from a hypothetical get tool, and the name plus content differentiates it from siblings like list_merge_request_emoji_reactions.

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 description gives an explicit collection-vs-single rule ('Use this for a collection of resources; choose the corresponding get tool when you already know the single resource to inspect') and explains when discussion_id is required. It does not explicitly contrast with list_merge_request_emoji_reactions, but the name makes the MR-note scope clear.

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

list_merge_request_pipelinesA
Read-only

List pipelines for a merge request with pagination. Use this to inspect pipelines associated with one merge request; use list_pipelines for project-wide pipeline filtering. It is read-only and paginated, requires project access, and returns pipeline records or GitLab errors for invalid identifiers, missing resources, or rate limits.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number for pagination (default: 1)
jmespathNoOptional JMESPath expression filtering the JSON result before return.
per_pageNoNumber of items per page (max: 100, default: 20)
project_idYesProject ID or complete URL-encoded path to project
merge_request_iidYesThe internal ID of the merge request

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already provide readOnlyHint and openWorldHint, so the description's 'read-only' claim adds little, but it does add value by stating 'requires project access' and describing error conditions (invalid identifiers, missing resources, rate limits). This goes beyond what annotations convey.

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 no wasted words. Purpose is front-loaded, followed by usage guidance and behavioral notes. Very efficient and well-structured.

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 list tool with no output schema and annotations present, the description covers purpose, usage, access requirements, and error conditions. It is sufficiently complete for an agent to invoke this tool correctly; a small gap is not detailing return structure, but that's not required given no output schema.

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 the input schema already documents all parameters. The description mentions pagination, which ties to page/per_page, but does not add significant semantic detail beyond the schema. Baseline of 3 is appropriate.

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 and resource ('List pipelines for a merge request with pagination') and explicitly differentiates from list_pipelines. It clearly identifies the MR-scoped scope, distinguishing it among many siblings.

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?

Provides explicit usage guidance: 'Use this to inspect pipelines associated with one merge request; use `list_pipelines` for project-wide pipeline filtering.' Also notes that project access is required, giving a clear prerequisite.

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

list_merge_requestsA
Read-only

List merge requests (without project_id: user's MRs; with project_id: project MRs). Use this for a collection of resources; choose the corresponding get tool when you already know the single resource to inspect. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
wipNoFilter merge requests against their wip status
pageNoPage number for pagination (default: 1)
sortNoReturn merge requests sorted in ascending or descending order
scopeNoReturn merge requests from a specific scope
stateNoReturn merge requests with a specific state
labelsNoArray of label names
searchNoSearch for specific terms
jmespathNoOptional JMESPath expression filtering the JSON result before return.
order_byNoReturn merge requests ordered by the given field
per_pageNoNumber of items per page (max: 100, default: 20)
author_idNoReturns merge requests created by the given user ID (integer). Mutually exclusive with author_username.
milestoneNoMilestone title
project_idNoProject ID or URL-encoded path (optional - if not provided, lists all merge requests the user has access to)
assignee_idNoReturn MRs assigned to the given user ID (integer), 'none', or 'any'. Mutually exclusive with assignee_username.
reviewer_idNoReturns merge requests which have the user as a reviewer. Must be an integer, 'none', or 'any'. Mutually exclusive with reviewer_username.
created_afterNoReturn merge requests created after the given time
source_branchNoReturn merge requests from a specific source branch
target_branchNoReturn merge requests targeting a specific branch
updated_afterNoReturn merge requests updated after the given time
created_beforeNoReturn merge requests created before the given time
updated_beforeNoReturn merge requests updated before the given time
author_usernameNoReturns merge requests created by the given username. Mutually exclusive with author_id.
assignee_usernameNoReturns merge requests assigned to the given username. Mutually exclusive with assignee_id.
reviewer_usernameNoReturns merge requests which have the user as a reviewer by username. Mutually exclusive with reviewer_id.
with_labels_detailsNoReturn more details for each label
approved_by_usernamesNoReturns merge requests approved by the given usernames (array).

TDQS

A3.5/5.0
Behavior3/5

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

The read-only claim repeats what readOnlyHint already provides. The description does add some behavioral context by stating that missing resources, invalid identifiers, insufficient permissions, and rate limits are returned as errors, and by calling out pagination fields. However, these are generic API behaviors and no unexpected effects are disclosed beyond that; the added value over the annotations is modest.

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

Conciseness3/5

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

The description is reasonably organized, leading with the main purpose and then giving usage context. However, the read-only sentence largely duplicates the existing annotation, and the closing instruction about identifiers and pagination is vague filler. The group_id mention also creates confusion without adding useful structure.

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?

Given 26 documented parameters, full schema coverage, and no required parameters, the schema does most of the heavy lifting. The description covers the key decision point (project_id vs no project_id) and general error behavior, but it does not describe the return shape, which matters here because there is no output schema. It also omits any mention of the list_group_merge_requests alternative, so the overall context is adequate but not 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 100%, so the baseline is 3 because the schema already documents all 26 parameters. The description adds only a high-level explanation of project_id's optional role and a generic instruction to follow documented identifiers and pagination fields. The mention of 'group_id' is misleading because group_id is not in the schema, slightly reducing the semantic value of the description.

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 clearly states the tool's purpose: listing merge requests, with behavior depending on presence or absence of project_id. It also distinguishes this from single-resource 'get' tools via the collection-vs-single framing. However, it does not explicitly distinguish itself from the closely related sibling list_group_merge_requests, and the mention of group_id is confusing since group_id is not in the input 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?

The description gives practical guidance: use this for a collection of resources and use the corresponding get tool when a single resource is already known. It also explains the project_id vs no-project_id scoping. It stops short of naming the specific alternative tool (get_merge_request) or addressing when list_group_merge_requests should be chosen, so guidance is good but not fully explicit.

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

list_merge_request_versionsA
Read-only

List all versions of a merge request. Use this for a collection of resources; choose the corresponding get tool when you already know the single resource to inspect. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
jmespathNoOptional JMESPath expression filtering the JSON result before return.
project_idYesProject ID or complete URL-encoded path to project
merge_request_iidYesThe internal ID of the merge request

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already provide readOnlyHint and openWorldHint, so the description's read-only statement is partially redundant. However, it adds useful behavioral detail by stating that missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors, which is 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.

Conciseness4/5

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

Three sentences front-load the purpose and selection guidance, followed by behavior and parameter notes. It is compact and readable, though the final sentence includes boilerplate that references group_id and pagination fields not present in the 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 read-only list operation with fully documented parameters, the description gives enough to select and invoke the tool correctly: purpose, sibling distinction, error behavior, and identifier format. Without an output schema, it doesn't describe exact response shape, but the list nature of the operation makes that reasonably inferable.

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%, so the schema carries most parameter documentation. The description mostly paraphrases project_id and gives a generic 'as documented' instruction without adding substantive meaning. The mention of group_id and pagination fields is slightly inaccurate since neither appears in the schema, preventing a higher score.

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 first sentence names a specific action and resource: 'List all versions of a merge request.' It also distinguishes itself from the single-resource 'get' variant, which separates it from sibling tools like get_merge_request_version.

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 instructs to use this tool for a collection and to choose the corresponding get tool when the single resource is already known. It also covers read-only usage and error conditions, making the selection context clear.

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

list_namespacesA
Read-only

List all namespaces (users and groups) available to the current user. Filter by kind='group' for groups only. Use this for a collection of resources; choose the corresponding get tool when you already know the single resource to inspect. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number for pagination (default: 1)
ownedNoFilter for namespaces owned by current user
searchNoSearch term for namespaces
jmespathNoOptional JMESPath expression filtering the JSON result before return.
per_pageNoNumber of items per page (max: 100, default: 20)

TDQS

A4/5.0
Behavior4/5

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

Annotations already set readOnlyHint=true, so read-only is redundant, but the description adds valuable error semantics: 'missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors.' This goes beyond the annotation and helps the agent anticipate failure modes. It does not explain openWorldHint, but that's already covered by 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.

Conciseness3/5

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

The core purpose is front-loaded, but the description is longer than necessary. The sentence about project_id/group_id is boilerplate and not relevant to this schema, and the 'kind' filter sentence is misleading. With some trimming and removal of inaccurate references, it could be much tighter.

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?

For a list tool with no required parameters and full schema coverage, the description covers purpose and error behavior. However, the false parameter hints (kind, project_id, group_id) and the lack of any statement about the return shape (list of namespaces) leave the agent with uncertain guidance when calling the tool correctly. The inaccuracies make it less complete than it appears.

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 coverage is 100%, so the baseline is 3, but the description introduces parameters that do not exist in the schema: 'kind', 'project_id', and 'group_id'. This actively misleads the agent into trying non-existent arguments. It adds no clarification for the actual parameters (page, owned, search, jmespath, per_page) beyond their schema descriptions, and the generic closing sentence about identifiers adds no value.

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 identifies the exact resource and action: 'List all namespaces (users and groups) available to the current user.' It explicitly distinguishes this collection-style tool from a single-resource get tool ('choose the corresponding get tool when you already know the single resource to inspect'), making it easy to tell apart from get_namespace and verify_namespace.

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?

The description gives an explicit when-to-use rule: 'Use this for a collection of resources' and when-not: 'choose the corresponding get tool when you already know the single resource to inspect.' It also provides a filter hint ('Filter by kind='group' for groups only') to narrow results, which is a clear usage scenario even if the parameter isn't in the schema.

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

list_project_membersA
Read-only

List members of a GitLab project. Use this for a collection of resources; choose the corresponding get tool when you already know the single resource to inspect. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number for pagination (default: 1)
queryNoSearch for members by name or username
jmespathNoOptional JMESPath expression filtering the JSON result before return.
per_pageNoNumber of items per page (default: 20, max: 100)
user_idsNoFilter by user IDs
project_idYesProject ID or URL-encoded path
skip_usersNoUser IDs to exclude
include_inheritanceNoInclude inherited members. Defaults to false.

TDQS

A4.1/5.0
Behavior4/5

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

The annotations already declare readOnlyHint=true, and the description reinforces the read-only/non-mutating nature. It adds useful behavioral context beyond the annotations by stating that missing resources, invalid identifiers, insufficient permission, and rate limits are surfaced as errors. No contradiction with annotations exists.

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 and usage guidance are front-loaded in three sentences, and the text avoids parameter-by-parameter repetition. The final sentence is somewhat generic ('exactly as documented') and the group_id mention adds slight noise, preventing a 5.

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?

Given 8 parameters and no output schema, the description supplies the safety profile, error behavior, and identifier formatting guidance while leaving field details to the high-coverage schema. The stray group_id reference and the unnamed single-resource alternative leave a small completeness gap, but the tool remains safely invocable.

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 the description is not required to document each parameter and adds little beyond the schema. The identifier guidance largely restates the schema's project_id description, and the reference to group_id is potentially misleading because this schema only accepts project_id.

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 'List members of a GitLab project', a specific verb+resource statement that clearly states what the tool does. The collection-vs-single-resource contrast further distinguishes it from the get_* siblings before the schema is even considered.

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?

Provides explicit when-to-use guidance: use it for a collection and prefer a get tool when a single resource is already known. However, the alternative is only named generically ('the corresponding get tool'), and it does not explicitly contrast this tool with the sibling list_group_members.

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

list_projectsA
Read-only

List projects accessible by the current user. Use this for a collection of resources; choose the corresponding get tool when you already know the single resource to inspect. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number for pagination (default: 1)
sortNoReturn projects sorted in ascending or descending order
ownedNoFilter for projects owned by current user
topicNoFilter by topic (projects tagged with this topic)
searchNoSearch term for projects
simpleNoReturn only limited fields
archivedNoFilter for archived projects
jmespathNoOptional JMESPath expression filtering the JSON result before return.
order_byNoReturn projects ordered by field
per_pageNoNumber of items per page (max: 100, default: 20)
membershipNoFilter for projects where current user is a member
visibilityNoFilter by project visibility
min_access_levelNoFilter by minimum access level
search_namespacesNoNeeds to be true if search is full path
with_issues_enabledNoFilter projects with issues feature enabled
with_merge_requests_enabledNoFilter projects with merge requests feature enabled

TDQS

A4.2/5.0
Behavior4/5

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

The description explicitly states it is read-only and does not mutate GitLab data, and enumerates error conditions: missing resources, invalid identifiers, insufficient permission, and rate limits. While annotations already convey readOnlyHint, the description adds concrete error semantics, which is valuable for an agent deciding how to handle failures.

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 with no filler. The core action, scope, usage guidance, safety note, and error behavior are all conveyed efficiently, with the most important information 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?

The description is complete enough for a list tool: it covers scope, read-only behavior, error semantics, and points to the schema for identifiers and pagination. It does not describe the return shape, but given no output schema and the obvious meaning of 'list projects,' the omission is minor.

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 the baseline is 3 even without additional parameter details in the description. The description's mention of project_id/group_id and URL-encoded paths is generic and not directly applicable to this tool's actual schema, so it adds little beyond the structured parameter descriptions.

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 clearly states the verb and resource: 'List projects accessible by the current user.' It also distinguishes the collection-oriented purpose from a single-resource get tool, saying to choose the 'corresponding get tool when you already know the single resource.' This makes the tool's intent unambiguous and separates it from siblings like get_project.

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 provides clear context: use for a collection of resources, and choose a get tool for a known single resource. It also instructs to use required identifiers and pagination fields as documented. However, it does not explicitly differentiate when to use this over the sibling list_group_projects, so the guidance is good but not fully exhaustive.

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

list_protected_branchesA
Read-only

List protected branches in a project, supports search filter. Use this for a collection of resources; choose the corresponding get tool when you already know the single resource to inspect. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number for pagination (default: 1)
searchNoSearch term to filter protected branches by name
jmespathNoOptional JMESPath expression filtering the JSON result before return.
per_pageNoNumber of items per page (max: 100, default: 20)
project_idYesProject ID or complete URL-encoded path to project

TDQS

A4.5/5.0
Behavior5/5

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

The description clearly states the operation is read-only and does not mutate GitLab data, which is useful even though readOnlyHint=true already exists. It goes beyond annotations by describing error behavior for missing resources, invalid identifiers, insufficient permission, and rate limits, giving the agent expectations for failure modes.

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?

The description is reasonably compact and front-loaded with the core purpose. The sentences about read-only behavior and parameter usage are useful, though the group_id reference feels like boilerplate and could be trimmed without losing value.

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 list operation, the description covers the main use case, differentiates from the singular get tool, and provides error expectations. It does not describe the return format or explicitly name the sibling get_protected_branch, but given the tool is a straightforward collection listing and there is no output schema, the current level is sufficient.

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 the schema already documents all parameters. The description adds some reinforcement about numeric ID or URL-encoded paths and pagination usage, but it largely restates what the schema says. The mention of group_id is a slight mismatch because the schema only accepts project_id, so it adds minor confusion but no substantive new meaning.

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 precise verb and resource ('List protected branches in a project') and immediately distinguishes itself from the singular get tool by saying to use that when the agent already knows the single resource. The name itself could be ambiguous among siblings like list_branches, but the description resolves it by naming the resource type and search filter.

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?

The description explicitly tells the agent when to use this tool (for a collection of resources) and when not to ('choose the corresponding get tool when you already know the single resource to inspect'). It also instructs to use required identifiers and pagination fields exactly as documented, which is clear operational guidance.

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

list_todosA
Read-only

List GitLab to-do items for the current user. Use this for a collection of resources; choose the corresponding get tool when you already know the single resource to inspect. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number for pagination (default: 1)
typeNoFilter by to-do target type
stateNoFilter by to-do state
actionNoFilter by to-do action
group_idNoFilter by group ID
jmespathNoOptional JMESPath expression filtering the JSON result before return.
per_pageNoNumber of items per page (max: 100, default: 20)
author_idNoFilter by author ID
project_idNoFilter by project ID

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and openWorldHint, but the description adds concrete error behavior: missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. This is valuable, non-redundant context beyond the structured 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?

Three sentences, each serving a distinct purpose: operation statement, usage/error snapshot, parameter/identifier guidance. The description is front-loaded with the core action and contains no filler or redundant restatements.

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 no output schema and nine optional parameters, the description covers purpose, usage, error behavior, and parameter encoding. It does not describe the return shape, but for a list operation this is largely inferable; the missing output details are a minor gap given the solid coverage of invocation concerns.

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 coverage is 100% and already documents all parameters, so the baseline would be 3. However, the description's guidance on project_id/group_id says to provide 'the numeric ID or complete URL-encoded path described by the schema' – yet the schema types these as numbers and never mentions URL-encoded paths. This is potentially misleading and could cause an agent to pass a string where a number is expected. The reference to 'required identifiers' is also confusing because no parameters are required.

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 the exact operation: 'List GitLab to-do items for the current user.' It clearly identifies the resource (to-do items) and distinguishes from single-resource get tools with the explicit guidance to 'choose the corresponding get tool when you already know the single resource to inspect.' This differentiates it from siblings like list_issues or get_issue without ambiguity.

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 explicit when-to-use context: for a collection of resources, and when to instead use a get tool for a single known resource. It also instructs on identifier handling and pagination field usage, covering the practical conditions under which the tool should be invoked.

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

mark_all_todos_doneB

Mark all pending GitLab to-do items as done for the current user. Use this for the specific operation described; choose a sibling tool when you need a different resource or lifecycle action. It changes remote GitLab state and requires the necessary project or group permission; GitLab returns validation, conflict, permission, or rate-limit errors instead of silently applying an invalid request. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
jmespathNoOptional JMESPath expression filtering the JSON result before return.

TDQS

B3.1/5.0
Behavior3/5

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

The description does add useful behavioral context beyond the minimal openWorldHint annotation by stating that it 'changes remote GitLab state,' requires permission, and that GitLab returns validation/conflict/permission/rate-limit errors. However, it also references 'project_id or group_id' and 'pagination fields' that are absent from this tool's schema, which introduces confusion and weakens the disclosure.

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 strong, but the remaining three sentences are padded with generic instructions that could apply to almost any tool in the sibling set. The irrelevant project_id/group_id and pagination guidance should not be present, making the description longer without earning its space.

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?

For a simple tool with one optional parameter and no output schema, the description covers the core operation, mutation, permission requirements, and error behavior. It is adequate, but the misapplied generic text and lack of any mention of the response or distinction from mark_todo_done leave meaningful gaps.

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?

The schema fully documents the only parameter, jmespath, so the description does not need to repeat it. But the only parameter-related guidance it gives mentions 'project_id or group_id,' 'required identifiers,' and 'pagination fields' – none of which exist in this tool's actual schema. This actively misleads rather than adding meaning.

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 opens with a precise verb-object-scope statement: 'Mark all pending GitLab to-do items as done for the current user.' This clearly identifies the resource, action, and target, and the word 'all' distinguishes it from the singular sibling mark_todo_done without needing to inspect its schema.

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?

The only guidance is generic boilerplate: 'Use this for the specific operation described; choose a sibling tool when you need a different resource or lifecycle action.' It does not mention the closely related mark_todo_done sibling or explain when to choose one versus the other, so an agent gets no actionable disambiguation.

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

mark_todo_doneB

Mark a GitLab to-do item as done. Use this for the specific operation described; choose a sibling tool when you need a different resource or lifecycle action. It changes remote GitLab state and requires the necessary project or group permission; GitLab returns validation, conflict, permission, or rate-limit errors instead of silently applying an invalid request. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesThe ID of the to-do item
jmespathNoOptional JMESPath expression filtering the JSON result before return.

TDQS

B3.3/5.0
Behavior4/5

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

The description states that the tool mutates remote GitLab state, requires project or group permission, and surfaces validation, conflict, permission, or rate-limit errors rather than silently succeeding. This exceeds the sparse openWorldHint annotation with actionable behavioral context.

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 purpose sentence is front-loaded, but two of the four sentences are boilerplate: the generic sibling-selection instruction and the parameter guidance about identifiers and pagination that do not apply to this tool's schema. The instructions are not tailored enough to earn their 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 single-id mutation with no output schema, the description covers the operation, state change, authorization prerequisite, and error behavior. It does not describe the return payload or idempotency, but those are comparatively minor for this simple action.

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?

The input schema already documents both id and jmespath at 100%, so the baseline is 3; however, the description adds no schema-level meaning and instead mentions project_id, group_id, and pagination fields that do not exist in this schema. This generic filler is potentially misleading.

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 first sentence names a specific verb and resource: mark a GitLab to-do item as done. It is clear which lifecycle action this covers, but it does not explicitly distinguish itself from sibling mark_all_todos_done, so it misses the top score.

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?

It tells the agent to use the tool for the 'specific operation described' and to choose a sibling for a different resource or lifecycle action, which gives general guidance. It does not name mark_all_todos_done as the single-item vs bulk alternative, so the routing guidance is only implied.

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

merge_merge_requestA
Destructive

Merge a merge request. Use this only after checking the merge request approval, conflict, and pipeline state; use approve_merge_request to approve rather than merge. The operation changes repository state and may squash commits, schedule auto-merge, or delete the source branch, so it requires merge permission and returns GitLab's merge result or a mergeability error. Pass sha from get_merge_request (sha or diff_refs.head_sha); GitLab 19.2+ groups may reject merges without it.

ParametersJSON Schema
NameRequiredDescriptionDefault
shaNoSHA of the source-branch HEAD from get_merge_request (`sha` or `diff_refs.head_sha`). If provided, GitLab merges only when HEAD still matches. GitLab 19.2+ groups may require this (Require a commit SHA on the merge requests API).
squashNoSquash commits into a single commit when merging
jmespathNoOptional JMESPath expression filtering the JSON result before return.
auto_mergeNoIf true, the merge request merges when the pipeline succeeds.
project_idYesProject ID or complete URL-encoded path to project
merge_request_iidNoThe IID of a merge request
merge_commit_messageNoCustom merge commit message
squash_commit_messageNoCustom squash commit message
should_remove_source_branchNoRemove source branch after merge
merge_when_pipeline_succeedsNoIf true, the merge request merges when the pipeline succeeds. Deprecated in GitLab 17.11. Use `auto_merge` instead.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already flag openWorldHint and destructiveHint, but the description goes further: it explains the operation changes repository state, may squash commits, schedule auto-merge, or delete the source branch, requires merge permission, and returns a merge result or mergeability error. This goes well beyond the annotations and provides actionable behavioral context about side effects and permissions.

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?

The description is not extremely short but every sentence contributes: purpose, usage condition, side effects, permission, SHA guidance. It is front-loaded with the core purpose and conditional usage. There is no redundant content, though it could be slightly tighter without losing meaning.

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 destructive, open-world tool with 10 parameters and no output schema, the description covers all essential aspects: when to use, side effects, permission requirement, error behavior, and the critical SHA parameter guidance. Nothing an agent needs to call it correctly is missing, given the schema already details each parameter.

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 schema documents all parameters. The description adds extra semantic value by explicitly instructing to pass `sha` from get_merge_request and warning about GitLab 19.2+ groups, which is not fully in the schema. This is helpful cross-tool wiring, though the description does not add much beyond that because the schema already describes each parameter.

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 clearly that the tool merges a merge request, and explicitly differentiates it from approve_merge_request, which is the relevant sibling. The verb 'merge' plus the resource 'merge request' is specific and unambiguous, so an agent can immediately distinguish this from sibling operations like approval or update.

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?

The description specifies when to use (only after checking approval, conflict, and pipeline state) and when not to (use approve_merge_request for approval). It also names the alternative tool explicitly. This gives an agent clear decision logic for tool selection, which is more than typical guidance.

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

mr_discussionsA
Read-only

List discussion items for a merge request. Use this to list complete discussion threads for a merge request; use get_merge_request_notes when only flat notes are needed. It is read-only and returns threaded discussion items, while invalid merge request identifiers, missing resources, and permission failures are reported as errors.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number for pagination (default: 1)
jmespathNoOptional JMESPath expression filtering the JSON result before return.
per_pageNoNumber of items per page (max: 100, default: 20)
project_idYesProject ID or complete URL-encoded path to project
merge_request_iidYesThe IID of a merge request

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, and the description reinforces this while adding valuable context: it returns threaded discussion items and reports invalid IDs, missing resources, and permission failures as errors. This goes beyond the structured annotations and helps the agent anticipate failure modes.

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?

The description is concise and front-loads the core purpose, then adds usage guidance and behavioral context. There is minor redundancy between 'List discussion items' and 'list complete discussion threads,' but overall each sentence contributes useful information without excessive length.

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 a well-covered schema and no output schema, the description provides enough context: what it returns, when to use an alternative, and how errors surface. It does not describe response shape, but that is not required here given the tool's simplicity and the absence of side effects.

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?

The input schema already has 100% description coverage for all five parameters, so the baseline is 3. The description does not add parameter-specific meaning beyond its general references to merge requests, but it also does not need to since the schema fully documents each parameter.

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 clearly states the verb and resource: 'List discussion items for a merge request' and specifies that it returns 'complete discussion threads.' It distinguishes itself from the sibling tool `get_merge_request_notes` by contrasting flat notes with threaded discussions, making the purpose unmistakable.

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?

The description explicitly provides usage guidance: use this tool for complete discussion threads and use `get_merge_request_notes` when only flat notes are needed. This gives an agent a clear decision rule between two closely related tools.

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

my_issuesA
Read-only

List issues assigned to the authenticated user. Use this for issue management: list issues assigned to the authenticated user. Use list_issues for project-wide or author-scoped listing and get_issue for one issue. It is read-only and paginated, requires authentication, and returns assigned issue records or permission/rate-limit errors.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number for pagination (default: 1)
stateNoReturn issues with a specific state (default: opened)
labelsNoArray of label names to filter by
searchNoSearch for specific terms in title and description
jmespathNoOptional JMESPath expression filtering the JSON result before return.
per_pageNoNumber of items per page (default: 20, max: 100)
milestoneNoMilestone title to filter by
project_idNoProject ID or URL-encoded path (optional to search across all accessible projects)
created_afterNoReturn issues created after the given time (ISO 8601)
updated_afterNoReturn issues updated after the given time (ISO 8601)
created_beforeNoReturn issues created before the given time (ISO 8601)
updated_beforeNoReturn issues updated before the given time (ISO 8601)

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=truebull; the description adds beyond that by stating the tool is paginated, requires authentication, and can return permission/rate-limit errors. This is useful behavioral context not present in 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.

Conciseness3/5

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

The description is short and front-loaded, but the first sentence is effectively repeated inside the second sentence ('list issues assigned to the authenticated user' appears twice). One redundant clause keeps this from being highly concise.

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 fully documented parameters, the description covers routing, authentication, pagination, and error behavior. There is no output schema, but the description gives enough about return value shape ('assigned issue records') for an agent to proceed.

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 the schema already documents all 12 parameters including defaults and enum choices. The description adds no parameter-level detail, 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 precise verb and resource: 'List issues assigned to the authenticated user.' It also explicitly distinguishes itself from list_issues and get_issue, so an agent can select correctly without inspecting other tools.

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?

Provides explicit routing guidance: use list_issues for project-wide/author-scoped listing, get_issue for a single issue. This clearly tells an agent when to use this tool versus its closest alternatives.

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

protect_branchA
Destructive

Protect a repository branch (set push/merge/unprotect access levels). Use this to create or update protection rules for a branch or wildcard; use get_protected_branch to inspect existing rules first. The operation changes who may push, merge, or unprotect, may enable force-push or code-owner settings, requires maintainer-level permission, and returns the protection rule or a validation/permission error.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoDeprecated alias for branch_name; prefer branch_name for consistency
jmespathNoOptional JMESPath expression filtering the JSON result before return.
project_idYesProject ID or complete URL-encoded path to project
branch_nameYesBranch name or wildcard pattern to protect
allow_force_pushNoAllow force push to the protected branch. Default: false
push_access_levelNoAccess level for pushing (0=No access, 30=Developer, 40=Maintainer, 60=Admin). GitLab default applies when omitted.
merge_access_levelNoAccess level for merging (0=No access, 30=Developer, 40=Maintainer, 60=Admin). GitLab default applies when omitted.
unprotect_access_levelNoAccess level for unprotecting (0=No access, 30=Developer, 40=Maintainer, 60=Admin). GitLab default applies when omitted.
code_owner_approval_requiredNoRequire code owner approval before merging (PREMIUM). Default: false

TDQS

A4.7/5.0
Behavior5/5

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

The description goes beyond the destructiveHint and openWorldHint annotations by disclosing the permission requirement ('requires maintainer-level permission'), the possible side effects ('may enable force-push or code-owner settings'), and the return format ('returns the protection rule or a validation/permission error'). This adds significant behavioral context that annotations do not convey, and it does not contradict them.

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?

The description is a single, tightly written paragraph of three sentences. The main purpose is front-loaded, followed by usage guidance and behavioral details. Every sentence adds necessary information with no fluff or repetition.

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?

Given the tool's 9 parameters (the schema fully documents them), no output schema, and annotations that already signal destructiveness and open world, the description covers all critical operational aspects: purpose, usage, permission, side effects, and return behavior. An agent has enough information to correctly invoke this tool and interpret the result.

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 (including access level meanings) already described in the schema. The tool description does not add any parameter-specific semantics beyond what the schema provides, so the baseline of 3 is appropriate. It does not clarify interactions between parameters (e.g., the effect of setting push_access_level to 0), but that is not required given full schema coverage.

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 clearly states the tool's purpose: 'Protect a repository branch' and specifies the actions (set push/merge/unprotect access levels). It distinguishes from siblings like get_protected_branch by explicitly naming it as the inspection tool, and the name contrasts with unprotect_branch. The scope (branch or wildcard) is also made explicit.

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?

It provides explicit when-to-use guidance: 'Use this to create or update protection rules for a branch or wildcard; use get_protected_branch to inspect existing rules first.' This directly routes the agent to the correct sibling and implies this tool is for modification, not inspection. No exclusions are missing.

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

publish_draft_noteA

Publish a single draft note. Use this for the specific operation described; choose a sibling tool when you need a different resource or lifecycle action. It changes remote GitLab state and requires the necessary project or group permission; GitLab returns validation, conflict, permission, or rate-limit errors instead of silently applying an invalid request. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
jmespathNoOptional JMESPath expression filtering the JSON result before return.
project_idYesProject ID or complete URL-encoded path to project
draft_note_idYesThe ID of the draft note
merge_request_iidYesThe IID of a merge request

TDQS

A3.5/5.0
Behavior4/5

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

With only openWorldHint set, the description adds valuable behavioral context: the call mutates remote GitLab state, requires project or group permission, and returns validation, conflict, permission, or rate-limit errors rather than silently applying invalid requests. This meaningfully compensates for the lack of readOnly/destructive hints and does not contradict 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.

Conciseness3/5

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

The tool purpose is front-loaded and useful, and the mutation/error-behavior content earns its place. However, several phrases are boilerplate, such as 'Use this for the specific operation described' and 'use required identifiers and pagination fields exactly as documented.' It is reasonably sized, but not every sentence adds meaningful information.

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?

For a simple four-parameter mutation, the description covers the core behavioral contract: remote state change, permissions, and error behavior. It does not describe what a successful publish returns, and because there is no output schema, that gap is left uncovered by the structured data. The generic boilerplate also weakens its completeness for this specific 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%, so the schema already documents every parameter and the baseline of 3 is appropriate. The description mostly repeats generic guidance about numeric IDs or URL-encoded paths, and the references to group_id and 'pagination fields do not cleanly match this schema. It adds no real semantic value beyond 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 clause names a specific verb and resource: 'Publish a single draft note.' The word 'single' distinguishes it from bulk publishing, and the lifecycle framing clarifies this is the publish action rather than create/update/delete. It does not explicitly name sibling tools like bulk_publish_draft_notes, so it stops just short of full differentiation.

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 gives only generic routing advice: 'Use this for the specific operation described; choose a sibling tool when you need a different resource or lifecycle action.' It never names the concrete alternative for publishing multiple draft notes or for editing a draft note first. The intended usage is implied by the operation, but not made explicit for the sibling set.

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

push_filesA
Destructive

Push multiple files in a single commit. Use this to commit several file changes atomically; use create_or_update_file when only one path is involved. Each file defaults to action create; optional per-file action (create/update/delete/move) and encoding (text/base64) are additive. GITLAB_PERMISSION_MODE=modify rejects delete and move. The operation writes repository history on the selected branch, requires repository write permission, and returns the commit result or a validation, conflict, or protected-branch error.

ParametersJSON Schema
NameRequiredDescriptionDefault
filesYesArray of files to push. Each entry defaults to action 'create'. Per-file fields: action (create/update/delete/move), encoding (text/base64; omitted uses GITLAB_REPO_FILE_ENCODING), previous_path (required for move). Content is required for create and update; omit content for delete, or for a move that should keep the original file. GITLAB_PERMISSION_MODE=modify rejects delete and move.
branchYesBranch to push to
jmespathNoOptional JMESPath expression filtering the JSON result before return.
project_idYesProject ID or complete URL-encoded path to project
commit_messageYesCommit message

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already flag destructiveHint, but the description adds concrete behavioral context: it writes repository history on the selected branch, requires repository write permission, and reports commit results or validation/conflict/protected-branch errors. It also discloses that GITLAB_PERMISSION_MODE=modify rejects delete and move, which is useful and non-obvious.

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?

Five compact sentences front-load the purpose and alternative, then cover defaults, restrictions, and behavior. Every sentence earns its place, with no filler or redundant restatement.

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?

Given a complex multi-file mutation with no output schema, the description covers the core invocation context: atomic commit behavior, write permission, branch-history side effects, error classes, and permission-mode restrictions. This is enough for an agent to select and call the tool 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 field-level details are already well documented. The description adds valuable aggregate semantics: each file defaults to action 'create', action and encoding are per-file and additive, and the permission-mode constraint on delete/move. This goes beyond simply restating the schema.

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: 'Push multiple files in a single commit.' It explicitly distinguishes itself from create_or_update_file, which is for single-path updates. An agent can immediately tell what this tool does and how it differs from a likely sibling.

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 explicit when-to-use guidance: use push_files for several atomic file changes, and use create_or_update_file when only one path is involved. This direct alternative-routing leaves no ambiguity about selection.

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

resolve_merge_request_threadA

Resolve a thread on a merge request. Use this to mark an existing merge request review thread resolved; use update_merge_request_discussion_note when the note text itself must change. The operation changes review state, requires permission to resolve discussions, and returns the updated discussion or a missing-thread/permission error.

ParametersJSON Schema
NameRequiredDescriptionDefault
jmespathNoOptional JMESPath expression filtering the JSON result before return.
resolvedYesWhether to resolve the thread
project_idYesProject ID or complete URL-encoded path to project
discussion_idYesThe ID of a thread
merge_request_iidYesThe IID of a merge request

TDQS

A4.7/5.0
Behavior5/5

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

Annotations provide only openWorldHint=true, so the description carries the burden. It clearly states the operation changes review state, requires permission to resolve discussions, and returns the updated discussion or a missing-thread/permission error. This discloses side effects, authorization needs, and failure modes. No contradiction with 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, purpose first, then usage distinctioncomm and behavior/error summary. Every clause is informative with no filler. Front-loaded with the action and resource.

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?

Despite having no output schemacorpor, the description explains the return value and error cases. It covers purpose, usage boundaries, permissions, state-change impact, and failure modes. Required parameters are all schema-documented, and optional jmespath needs no special explanation. Highly complete for a tool of this complexity.

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 the baseline is 3. The description adds general context (review thread, state change) but does not add parameter-level semantics beyond what the schema already provides for project_id, merge_request_iid, discussion_id, or resolved. It is adequate but not compensatory.

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 action (resolve), a precise resource (existing merge request review thread), and immediately distinguishes it from the sibling update_merge_request_discussion_note. An agent can tell exactly what this tool does 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 Guidelines5/5

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

Explicitly says when to use this tool (to mark a thread resolved) and when to use the alternative update_merge_request_discussion_note (when note text must change). This is direct when-to-use and when-not-to-use guidance, naming the exact sibling tool. No inference required.

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

search_repositoriesA
Read-only

Search for GitLab projects. Use this to discover matching content; choose a typed get or list tool when the target identifier is already known. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number for pagination (default: 1)
queryNoSearch query (alias for 'search')
searchNoSearch query
jmespathNoOptional JMESPath expression filtering the JSON result before return.
per_pageNoNumber of items per page (max: 100, default: 20)

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already provide readOnlyHint=true and openWorldHint=true, so the bar is lower. The description adds useful behavioral detail: it is read-only, does not mutate GitLab data, and returns errors for missing resources, invalid identifiers, insufficient permissions, and rate limits. This is solid but not exhaustive; for example, no detail on result ordering or empty searches is given.

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?

The description is front-loaded with the core purpose and includes routing, safety, and error semantics in a compact form. The last sentence is somewhat generic and mentions identifiers not present in the schema, so it is not perfectly tight, but overall every sentence contributes.

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 search tool with readOnly/openWorld annotations and full schema coverage, the description covers purpose, routing, safety, and error behavior. It does not describe what fields are searched or how matches are ranked, and there is no output schema, so an agent may still need to infer some return semantics.

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 the schema already documents all parameters and the baseline is 3. The description adds general guidance about numeric IDs/URL-encoded paths and pagination fields, but project_id/group_id are not actually present in the schema, so that guidance is somewhat detached from the real parameters.

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 uses a specific verb and resource ('Search for GitLab projects') and explicitly contrasts discovery with typed get/list tools when the identifier is already known. This clearly distinguishes search_repositories from siblings such as get_project and list_projects.

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?

It says when to use the tool ('discover matching content') and when not to ('choose a typed get or list tool when the target identifier is already known'). This gives an explicit routing rule with no ambiguity.

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

unapprove_merge_requestA

Unapprove a merge request. Use this to remove the current user's approval from an existing merge request; use merge_merge_request only when you intend to merge. The operation changes review state and requires approval permission, and GitLab returns the updated result or an error when the request or approval is unavailable.

ParametersJSON Schema
NameRequiredDescriptionDefault
jmespathNoOptional JMESPath expression filtering the JSON result before return.
project_idYesProject ID or complete URL-encoded path to project
merge_request_iidYesThe IID of the merge request to unapprove

TDQS

A4.1/5.0
Behavior4/5

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

Annotations only include openWorldHint=true, so the description carries the burden of behavioral disclosure. It states that the operation 'changes review state' (explicit mutation) and 'requires approval permission' (auth requirement). It also describes the return behavior: 'GitLab returns the updated result or an error when the request or approval is unavailable.' This is valuable context beyond the schema. It does not detail reversibility or side effects, but for a simple unapprove action, this is adequate. Given the sparse annotations, a 4 is justified.

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?

The description is three sentences: purpose, usage guidance, and behavior. It is front-loaded with the key action and keeps each sentence purposeful. No filler or repetition. While it could be slightly more compact, it is efficient and well-structured. A minor deduction for not being as tight as possible, but overall it is strong, so a 4.

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 straightforward tool with two required parameters and no output schema, the description covers the essentials: what it does, when to use it, required permissions, and the nature of the result (updated result or error). It also mentions the effect on review state. There is no missing critical information an agent would need to invoke it correctly. A 4 is fitting given the simplicity of the tool; it could be a 5 if it also mentioned that it only removes the current user's approval (not others'), but that is implied by 'current user's approval' in the text.

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?

The input schema already has 100% description coverage: `project_id` is described as 'Project ID or complete URL-encoded path to project' and `merge_request_iid` as 'The IID of the merge request to unapprove.' The tool description does not add any parameter-specific semantics beyond the schema. It mentions the current user's approval in the context, but that relates to the operation, not to a parameter. Since the schema fully documents both required parameters, the baseline of 3 applies without additional value from the 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?

The description opens with a clear and specific action: 'Unapprove a merge request.' It uses a precise verb and resource, and immediately distinguishes itself from `merge_merge_request` by explicitly stating that tool is only for merging. This makes it unambiguous which sibling it is not, and the purpose is evident without needing to inspect 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?

The description gives direct when-to-use guidance: 'Use this to remove the current user's approval from an existing merge request.' It also provides an exclusion: 'use `merge_merge_request` only when you intend to merge.' This distinguishes it from a key sibling. However, it does not mention the alternative `approve_merge_request` (the inverse operation), which could be relevant if the user wants to add approval instead. Since the purpose is already clear from the name, this is a minor gap, so a 4 is appropriate.

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

unprotect_branchA
Destructive

Remove protection from a previously protected branch. Use this to remove protection from an existing branch; use protect_branch to change access levels without removing the rule. The operation changes repository security controls, requires permission to manage protected branches, and returns the result or an error when the branch is missing or policy forbids the change.

ParametersJSON Schema
NameRequiredDescriptionDefault
jmespathNoOptional JMESPath expression filtering the JSON result before return.
project_idYesProject ID or complete URL-encoded path to project
branch_nameYesName of the protected branch to unprotect

TDQS

A4.7/5.0
Behavior5/5

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

The annotations already flag destructiveHint and openWorldHint, and the description adds meaningful context on top: it changes repository security controls, requires permission to manage protected branches, and reports errors for missing branches or policy restrictions. This gives the agent clear expectations beyond the structured metadata.

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 with no wasted words, front-loading the primary action first, then the alternative, then behavioral and error context. Every sentence contributes useful information for selection or invocation.

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?

Given the tool's simplicity, full schema coverage, and existing annotations, the description is complete: it covers purpose, alternative usage, permissions, security implications, and error conditions. No output schema exists, but the mention of return error cases helps compensate without over-explaining.

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 the schema already documents project_id and branch_name clearly. The description adds context about the operation's purpose but no new parameter-specific semantics beyond what the schema provides. This matches the baseline of 3 for full schema coverage.

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: 'Remove protection from a previously protected branch.' It clearly distinguishes itself from protect_branch by noting that protect_branch changes access levels without removing the rule, so an agent can select the correct sibling.

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 this tool: to remove protection from an existing branch, and names the alternative for a different goal: use protect_branch to change access levels without removing the rule. This is direct when/when-not guidance with no inference required.

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

update_default_branchA
Destructive

Change the default branch of a project. Use this to change which branch GitLab treats as the project's default; use create_branch to create a branch rather than changing project defaults. The operation changes project settings and may affect clone, merge request, and CI defaults, requires project-maintainer permission, and returns the updated project or a validation/permission error.

ParametersJSON Schema
NameRequiredDescriptionDefault
jmespathNoOptional JMESPath expression filtering the JSON result before return.
project_idYesProject ID or complete URL-encoded path to project
default_branchYesThe new default branch name for the project

TDQS

A4.7/5.0
Behavior5/5

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

Annotations declare destructiveHint=true and openWorldHint=true, and the description goes beyond them by detailing the collateral effects (clone, MR, CI defaults), permission requirement (project maintainer), and expected return (updated project or validation/permission error). No contradictions with 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 with zero filler: the first front-loads the purpose and the second packs usage, effects, permission, and return behavior. Every clause adds value.

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 destructive mutation tool, the description covers what it does, how it differs from a sibling, what side effects occur, permission needed, and the return value. No output schema exists, but the return type is explicitly described. Nothing essential 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%, so the schema already documents both required parameters. The description adds no new parameter-specific information (e.g., format, constraints), resting on the schema. Baseline 3 is appropriate.

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 ('Change') and resource ('default branch of a project'), and explicitly differentiates from the sibling `create_branch`, making the tool's purpose unambiguous even without inspecting 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 Guidelines5/5

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

Provides explicit when-to-use ('change which branch GitLab treats as the project's default') and when-not-to-use ('use create_branch to create a branch rather than changing project defaults'), naming the alternative directly. It also states the high-level effect (affects clone, MR, CI defaults) and required permission, giving agents full routing context.

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

update_draft_noteA

Update an existing draft note. Use this for an existing resource; choose the corresponding create tool for a new resource and a note tool for discussion-only text. It changes remote GitLab state and requires the necessary project or group permission; GitLab returns validation, conflict, permission, or rate-limit errors instead of silently applying an invalid request. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyNoThe content of the draft note
jmespathNoOptional JMESPath expression filtering the JSON result before return.
positionNoPosition when creating a diff note
project_idYesProject ID or complete URL-encoded path to project
draft_note_idYesThe ID of the draft note
merge_request_iidYesThe IID of a merge request
resolve_discussionNoWhether to resolve the discussion when publishing

TDQS

A4.1/5.0
Behavior4/5

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

With only openWorldHint in annotations, the description carries the burden. It discloses that the tool mutates remote GitLab state, requires permissions, and that GitLab returns validation, conflict, permission, or rate-limit errors rather than silently succeeding. This is meaningful behavioral context beyond the sparse annotations.

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?

The description is a single paragraph with a clear front-loaded purpose. It is reasonably concise, but includes some redundancy (e.g., referencing pagination fields that don't exist) and could be tightened without losing information.

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?

The tool has a complex position object, but the schema thoroughly documents it. The description covers mutation, permissions, and error behavior, which are the key non-schema contexts. It doesn't mention alternatives like publish or delete, but those are different operations. Given the schema's richness, the description is largely complete for calling the tool 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 coverage is 100%, so the baseline is 3. The description adds a note about providing numeric IDs or URL-encoded paths, but that duplicates the schema's own description for project_id. It also references pagination fields, but this tool has none. It does not add semantics for the complex position object beyond what the schema already explains.

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 opens with a clear verb and resource: 'Update an existing draft note.' It then explicitly differentiates from the create tool for new resources and from a note tool for discussion-only text, which distinguishes it from sibling tools like create_draft_note and create_note/update_merge_request_note.

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 explicit when-to-use guidance: 'Use this for an existing resource; choose the corresponding create tool for a new resource and a note tool for discussion-only text.' It also notes permission requirements and error behavior, but it doesn't reference other draft-note siblings like publish_draft_note or delete_draft_note. The guidance is clear enough for the primary alternatives.

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

update_issueA

Update an issue. Returns a slim confirmation by default; set full_response=true for the complete updated issue object. Use this to change fields on an existing issue; use update_issue_description_patch for a targeted description edit that avoids sending the full body, and use create_issue_note for discussion. The operation mutates issue state, requires issue-edit permission, and returns the updated issue or a validation/permission/conflict error.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleNoThe title of the issue
labelsNoArray of label names
weightNoWeight of the issue (numeric, typically hours of work)
due_dateNoDate the issue is due (YYYY-MM-DD)
jmespathNoOptional JMESPath expression filtering the JSON result before return.
issue_iidYesThe internal ID of the project issue
issue_typeNoThe type of issue. One of issue, incident, test_case or task.
project_idYesProject ID or URL-encoded path
descriptionNoThe description of the issue
state_eventNoUpdate issue state (close/reopen)
assignee_idsNoArray of user IDs to assign issue to
confidentialNoSet the issue to be confidential
milestone_idNoMilestone ID to assign
full_responseNoIf true, return the complete updated issue object. Default returns a slim confirmation (iid, title, state, web_url, updated_at) to reduce token usage.
discussion_lockedNoFlag to lock discussions

TDQS

A4.9/5.0
Behavior5/5

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

Annotations only carry `openWorldHint: true`, so the description carries the full behavioral disclosure burden. It discloses that the operation mutates issue state, requires issue-edit permission, returns the updated issue or validation/permission/conflict errors, and explains the slim vs. full response behavior. This substantially exceeds what annotations alone provide and contains no contradiction.

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?

The description is three sentences and front-loads the primary action and response behavior before moving to usage distinctions and side effects. Every sentence earns its place: no filler, no repetition of schema details, and the most decision-relevant information appears 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?

Given no output schema and sparse annotations, the description is thorough: it covers mutability, permission requirements, return values, error types, and response-shape options. It also provides enough usage context to route between related tools. Nothing an agent needs to call this correctly and safely 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 description coverage is 100%, so the schema already documents all 15 parameters. The description adds meaningful semantics for `full_response` by explaining the default slim confirmation and the specific fields it returns, which goes beyond the schema's one-line description. This warrants a 4 rather than a baseline 3.

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 ('Update') and resource ('an issue'), and clearly identifies the tool's scope: changing fields on an existing issue. It also distinguishes itself from sibling tools like `update_issue_description_patch` and `create_issue_note`, so an agent can tell them apart 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 Guidelines5/5

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

The description explicitly says when to use this tool ('change fields on an existing issue') and names two alternatives with their use cases: `update_issue_description_patch` for targeted description edits avoiding full-body sends, and `create_issue_note` for discussion. This gives both positive and negative routing guidance.

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

update_issue_description_patchA

Apply a patch (search/replace or unified diff) to an issue description. Reduces token usage by allowing small changes without sending the full description. Supports dry_run to preview changes and create_note to summarize updates. Use this for a targeted search/replace or unified-diff change to an issue description; use dry_run before applying an uncertain patch and create_note when an audit summary is wanted. It changes the issue description when not dry-running, requires issue-edit permission, and returns the patch result or a mismatch/validation/permission error.

ParametersJSON Schema
NameRequiredDescriptionDefault
patchYesThe patch content to apply to the issue description
dry_runNoIf true, preview changes without updating the issue
jmespathNoOptional JMESPath expression filtering the JSON result before return.
issue_iidYesThe internal ID of the project issue
patch_typeYesType of patch format to apply
project_idYesProject ID or URL-encoded path
create_noteNoIf true, add a note summarizing the change after update
allow_multipleNoFor search_replace: allow multiple matches to all be replaced (default: false — fail on duplicate)

TDQS

A4.1/5.0
Behavior4/5

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

With only openWorldHint in annotations, the description carries the transparency burden and does well: it discloses the side effect ('changes the issue description when not dry-running'), the permission requirement ('requires issue-edit permission'), and possible outcomes ('patch result or a mismatch/validation/permission error'). This goes well beyond the sparse annotations.

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?

The description is front-loaded with the core action and is generally efficient. However, the dry_run/create_note functionality is stated twice ('supports dry_run... create_note' and 'use dry_run... create_note'), creating slight redundancy without much added information.

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?

Given no output schema, the description adequately covers the return value ('returns the patch result or ... error') and the key side-effect/permission context. It relies on the thoroughly documented schema for parameter details, which is reasonable at 100% coverage, though a bit more detail on duplicate-match failure for allow_multiple could strengthen it.

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 the baseline is 3. The description adds mild value by explaining dry_run as 'preview changes' and create_note as 'summarize updates,' and by mapping patch_type to 'search/replace or unified diff,' but it does not substantially extend what the schema already documents.

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 opens with a specific verb and resource: 'apply a patch ... to an issue description.' It also distinguishes itself from a full-description update by noting it 'reduces token usage by allowing small changes without sending the full description,' which differentiates it from sibling tools like update_issue.

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 explicitly says 'use this for a targeted search/replace or unified-diff change to an issue description' and gives conditional guidance for dry_run and create_note. It does not explicitly name the alternative full-update tool or state 'do not use for full rewrites,' but the targeted-change framing makes the intended use clear.

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

update_issue_noteA

Modify an existing issue thread note. Use this for an existing resource; choose the corresponding create tool for a new resource and a note tool for discussion-only text. It changes remote GitLab state and requires the necessary project or group permission; GitLab returns validation, conflict, permission, or rate-limit errors instead of silently applying an invalid request. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyNoThe content of the note or reply
note_idYesThe ID of a thread note
jmespathNoOptional JMESPath expression filtering the JSON result before return.
resolvedNoResolve or unresolve the note
issue_iidYesThe IID of an issue
project_idYesProject ID or complete URL-encoded path to project
discussion_idYesThe ID of a thread

TDQS

A3.5/5.0
Behavior4/5

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

With only openWorldHint in annotations, the description takes on the burden of explaining side effects. It clearly states that the tool changes remote GitLab state and requires project or group permission. It also discloses that GitLab returns validation, conflict, permission, or rate-limit errors instead of silently applying invalid requests, which is useful behavioral context.

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

Conciseness3/5

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

The description is reasonably concise and front-loads the core purpose and usage. However, the final sentence includes generic and partially incorrect guidance about group_id and pagination fields, so not every sentence earns its place. Structurally it is adequate but not tight.

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?

The description covers the action, usage context, permission requirements, and error behavior, which is useful for a mutating tool with minimal annotations. However, with no output schema, it does not mention what a successful response contains or how the updated note is returned. It is complete enough for basic invocation but leaves some uncertainty about the result shape.

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 coverage is 100%, so the schema already documents all parameters, meaning the description does not need to explain them. The description actually introduces inaccuracies: it mentions group_id and pagination fields, but the schema only includes project_id and no pagination parameters. This could confuse an agent into looking for fields that do not exist, lowering the score below the baseline of 3.

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 opens with a specific verb and resource: 'Modify an existing issue thread note.' It also distinguishes this from creating a new resource via the corresponding create tool, which helps separate it from siblings like create_issue_note. However, it does not explicitly name the exact sibling alternative, so it falls short of full sibling differentiation.

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 description gives clear context: use it for an existing resource, and use a create tool for a new resource. It also explains that the tool changes remote GitLab state and requires appropriate permissions, which helps an agent decide whether this is appropriate. It lacks explicit exclusions for other sibling tools like merge-request note update tools, so it is not a perfect 5.

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

update_labelA

Update an existing label in a project. Use this for an existing resource; choose the corresponding create tool for a new resource and a note tool for discussion-only text. It changes remote GitLab state and requires the necessary project or group permission; GitLab returns validation, conflict, permission, or rate-limit errors instead of silently applying an invalid request. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
colorNoThe color of the label given in 6-digit hex notation with leading '#' sign
jmespathNoOptional JMESPath expression filtering the JSON result before return.
label_idYesThe ID or title of a project's label
new_nameNoThe new name of the label
priorityNoThe new priority of the label
project_idYesProject ID or URL-encoded path
descriptionNoThe new description of the label

TDQS

A4.3/5.0
Behavior4/5

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

Annotations only include openWorldHint, so the description carries most of the behavioral burden. It clearly discloses that the tool changes remote GitLab state, requires project or group permission, and that GitLab returns validation, conflict, permission, or rate-limit errors instead of silently applying invalid requests. It could add more detail about patch semantics or response content, but it meaningfully surpasses 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.

Conciseness4/5

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

The description is front-loaded with purpose, then covers usage, behavior, and parameter guidance in a logical order. The final sentence about identifiers and pagination is somewhat boilerplate and slightly inconsistent with the schema, adding minor noise, but overall the description is still appropriately compact.

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 mutating 7-parameter tool with sparse annotations and no output schema, the description covers the essentials: what it does, when to use it, remote state changes, required permissions, and error behavior. It does not describe return values or detailed update semantics, and the group_id/pagination clause is slightly mismatched, but an agent can select and invoke the tool correctly using the description plus the schema.

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?

All 7 parameters have schema descriptions, so the schema already does the heavy lifting. The description's extra guidance about numeric IDs, URL-encoded paths, and using required identifiers is generic rather than parameter-specific, and it mentions group_id and pagination fields not present in the schema. This adds only marginal value beyond the schema.

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 opening sentence names a specific operation ('Update an existing label in a project') with a clear verb and resource. It also distinguishes itself from create and note tools by explicitly targeting an existing resource, and sibling tools confirm it is the update counterpart to create_label.

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?

The description explicitly says to use this tool for an existing resource and to choose the corresponding create tool for new resources or a note tool for discussion-only text. This gives an agent clear when-to-use and when-not-to-use guidance relative to alternatives.

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

update_merge_requestA

Update a merge request (mergeRequestIid or branchName required). Use this for an existing resource; choose the corresponding create tool for a new resource and a note tool for discussion-only text. It changes remote GitLab state and requires the necessary project or group permission; GitLab returns validation, conflict, permission, or rate-limit errors instead of silently applying an invalid request. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
draftNoWork in progress merge request
titleNoThe title of the merge request
labelsNoLabels for the MR
squashNoSquash commits into a single commit when merging
jmespathNoOptional JMESPath expression filtering the JSON result before return.
project_idYesProject ID or complete URL-encoded path to project
descriptionNoThe description of the merge request
state_eventNoNew state (close/reopen) for the MR
assignee_idsNoThe ID of the users to assign the MR to
milestone_idNoMilestone ID to assign. Set to 0 to unassign. Null is treated as omitted.
reviewer_idsNoThe ID of the users to assign as reviewers of the MR
source_branchNoSource branch name
target_branchNoThe target branch
merge_request_iidNoThe IID of a merge request
remove_source_branchNoFlag indicating if the source branch should be removed

TDQS

A4.1/5.0
Behavior4/5

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

Annotations only include openWorldHint, so the description carries the burden. It discloses that the tool changes remote GitLab state, requires project or group permission, and returns validation/conflict/permission/rate-limit errors rather than silently succeeding. This is useful, though it does not mention destructive effects like remove_source_branch or what happens on merged MRs.

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?

The description is front-loaded with purpose and usage distinction, and stays compact. Minor boilerplate like 'use required identifiers and pagination fields exactly as documented' is vague and could be trimmed, but overall it is efficient and well-ordered.

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?

For a 15-parameter mutation tool with no output schema, the description gives high-level context: mutates remote state, needs permissions, and surfaces error types. However, it omits critical specifics such as valid identifier combinations, the meaning of state_event/remove_source_branch, and does not resolve the misleading required-field statement. The schema carries much of the parameter detail, but the description is not fully complete for safe invocation.

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 coverage is 100%, so baseline is 3, but the description misleadingly states 'mergeRequestIid or branchName required' while the schema's required list contains only project_id, and 'branchName' does not appear as a parameter. This contradiction undermines guidance. The useful note about project_id/group_id path encoding is outweighed by the incorrect required-field claim.

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 opens with 'Update a merge request', a specific verb and resource, and immediately distinguishes this tool from create and note tools. It clearly identifies this as the mutation tool for existing merge requests against siblings like create_merge_request and update_merge_request_note.

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?

The description explicitly tells the agent to use the corresponding create tool for new resources and a note tool for discussion-only text, providing clear when-not guidance. It also notes permission requirements and describes error behavior, so the agent knows when this tool is appropriate versus alternatives.

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

update_merge_request_discussion_noteA

Update a discussion note on a merge request. Use this for an existing resource; choose the corresponding create tool for a new resource and a note tool for discussion-only text. It changes remote GitLab state and requires the necessary project or group permission; GitLab returns validation, conflict, permission, or rate-limit errors instead of silently applying an invalid request. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyNoThe content of the note or reply
note_idYesThe ID of a thread note
jmespathNoOptional JMESPath expression filtering the JSON result before return.
resolvedNoResolve or unresolve the note
project_idYesProject ID or complete URL-encoded path to project
discussion_idYesThe ID of a thread
merge_request_iidYesThe IID of a merge request

TDQS

A4.5/5.0
Behavior5/5

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

Annotations only include openWorldHint, so the description carries the full behavioral burden. It clearly states that this changes remote GitLab state, requires project/group permission, and surfaces validation, conflict, permission, and rate-limit errors rather than silently succeeding.

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?

The description is well-structured: purpose first, then usage alternatives, then behavioral warnings retries and identifier guidance. It is somewhat longer than necessary and includes a generic 'pagination fields' phrase that does not apply here, but the content is relevant and 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?

For a 7-parameter mutation tool without an output schema, the description conveys purpose, usage, side effects, authorization, error handling, and identifier format. It does not describe the success return payload or the exact interaction of body and resolved, but the schema covers parameter semantics and the description is sufficient for correct selection and invocation.

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 the baseline is 3 and the description adds little beyond the schema. It offers generic advice on numeric IDs or URL-encoded paths and required identifiers, but it also mentions pagination fields that do not exist in this schema and adds no per-parameter meaning.

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 names a specific action and resource: 'Update a discussion note on a merge request.' It also differentiates from likely siblings by stating that it is for an existing resource, pointing to the corresponding create tool for new resources and a note tool for discussion-only text.

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?

The description provides explicit guidance on when to use this tool versus create and note tools, and it explains required permissions and error behavior. It also instructs on how to supply project identifiers, covering both context and exclusions.

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

update_merge_request_noteA

Modify an existing merge request note. Use this for an existing resource; choose the corresponding create tool for a new resource and a note tool for discussion-only text. It changes remote GitLab state and requires the necessary project or group permission; GitLab returns validation, conflict, permission, or rate-limit errors instead of silently applying an invalid request. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyYesThe content of the note or reply
note_idYesThe ID of a thread note
jmespathNoOptional JMESPath expression filtering the JSON result before return.
project_idYesProject ID or complete URL-encoded path to project
merge_request_iidYesThe IID of a merge request

TDQS

A4.5/5.0
Behavior4/5

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

Annotations only include openWorldHint, so the description carries the burden. It discloses that the operation modifies remote state, requires permissions, and returns errors (validation, conflict, permission, rate-limit) rather than silently applying invalid requests. This is clear behavioral context, though it could mention idempotency or side effects more explicitly.

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?

The description is a single coherent paragraph, starts with the primary action, and avoids fluff. It includes necessary context without being overly verbose, though it could be trimmed slightly to improve scannability.

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 mutating tool with no output schema, it adequately covers permissions, error handling, and identifier formatting. It does not describe the return value, but that's not required. It is complete enough for an agent to call correctly, with only minor gaps around success behavior.

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 covers 100% of parameters, so baseline is 3. The description adds value by advising to provide numeric IDs or complete URL-encoded paths and to use required identifiers exactly as documented. However, it references 'project_id or group_id' while the schema only includes project_id, a slight inconsistency that reduces the bonus.

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 clearly states the tool's function: 'Modify an existing merge request note.' It explicitly distinguishes from the create tool ('choose the corresponding create tool for a new resource') and from discussion-only notes, making the purpose unambiguous and differentiated from siblings.

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?

Provides explicit guidance: use for existing resources, create tool for new resources, note tool for discussion-only text. It also specifies permission requirements and error behavior, covering when and how to invoke the tool versus alternatives.

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

update_projectA

Update project settings such as description, visibility, default branch, and feature access levels. Use this for an existing resource; choose the corresponding create tool for a new resource and a note tool for discussion-only text. It changes remote GitLab state and requires the necessary project or group permission; GitLab returns validation, conflict, permission, or rate-limit errors instead of silently applying an invalid request. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoProject display name
pathNoProject path/slug
topicsNoProject topics
jmespathNoOptional JMESPath expression filtering the JSON result before return.
project_idYesProject ID or complete URL-encoded path to project
visibilityNoProject visibility
descriptionNoProject description
merge_methodNoMerge method
squash_optionNoSquash commits setting
default_branchNoDefault branch name
wiki_access_levelNoWiki feature visibility
pages_access_levelNoPages feature visibility
builds_access_levelNoCI/CD pipelines feature visibility
issues_access_levelNoIssues feature visibility
forking_access_levelNoForking feature visibility
snippets_access_levelNoSnippets feature visibility
request_access_enabledNoAllow users to request access
environments_access_levelNoEnvironments feature visibility
merge_requests_access_levelNoMerge requests feature visibility
package_registry_access_levelNoPackage registry feature visibility
container_registry_access_levelNoContainer registry feature visibility
remove_source_branch_after_mergeNoRemove source branches after merge by default
only_allow_merge_if_pipeline_succeedsNoRequire successful pipeline before merge
only_allow_merge_if_all_discussions_are_resolvedNoRequire all discussions to be resolved before merge

TDQS

A4.1/5.0
Behavior5/5

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

The description clearly states that it changes remote GitLab state, requires appropriate project or group permissions, and that GitLab returns validation, conflict, permission, or rate-limit errors rather than silently applying invalid requests. This is valuable context beyond the openWorldHint annotation and directly informs the agent of side effects and error handling behavior.

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

Conciseness3/5

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

The description is front-loaded with purpose and usage, but it contains extraneous and potentially confusing details (group_id and pagination fields that do not exist in the schema). It is not as concise or accurate as it could be; each sentence should earn its place, and the last sentence slightly derails the focus.

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?

For a tool with 24 parameters and no output schema, the description covers purpose, usage, and error behavior, but it incorrectly references group_id and pagination fields, which are not part of the input schema. This inaccuracy could mislead an agent about the tool's actual scope. It also does not clarify that only project_id is required, though that is visible in the schema. Overall it is mostly complete but has notable gaps and a distracting error.

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 the baseline is 3. The description does not add meaningful parameter semantics beyond the schema; it repeats that project_id can be a numeric ID or URL-encoded path (already documented in schema) and oddly references group_id and pagination fields, which are not present in the schema. This does not genuinely enhance understanding of the parameters.

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 opens with a specific verb ('Update') and resource ('project'), then lists concrete examples of settings (description, visibility, default branch, feature access levels). It also distinguishes itself from create and note tools for new resources and discussion-only text, so an agent can tell it apart from its primary siblings 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?

The description explicitly says to use it for an existing resource and to choose the corresponding create tool for a new resource and a note tool for discussion-only text. However, it does not mention the more directly overlapping sibling 'update_default_branch' as a specialized alternative for changing just the default branch, leaving that differentiation to inference.

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

upload_markdownB

Upload a file for use in markdown content. Use this for the specific operation described; choose a sibling tool when you need a different resource or lifecycle action. It changes remote GitLab state and requires the necessary project or group permission; GitLab returns validation, conflict, permission, or rate-limit errors instead of silently applying an invalid request. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
jmespathNoOptional JMESPath expression filtering the JSON result before return.
file_pathYesPath to the file to upload
project_idYesProject ID or URL-encoded path of the project

TDQS

B3.3/5.0
Behavior4/5

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

The annotations provide only openWorldHint, so the description carries most of the behavioral burden. The description adds meaningful context: the operation changes remote GitLab state, requires project or group permission, and surfaces validation, conflict, permission, or rate-limit errors rather than silently applying invalid requests. It could go further by explaining what a successful upload returns, but the core mutation and error behavior are clearly disclosed.

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

Conciseness3/5

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

The description is reasonably short and front-loads the purpose in the first sentence. The second sentence is largely generic boilerplate about choosing a sibling tool, and the final sentence mixes parameter advice with error behavior, including references to fields not present in the schema. It is not bloated, but contains some filler that does not earn its place.

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?

For a simple three-parameter tool with two required parameters and no output schema, the description covers the key operational facts: what it does, that it mutates state, that permissions are required, and what kinds of errors can occur. The main gaps are the lack of any description of the return value and the misleading mention of group_id and pagination fields that are absent from the schema, leaving moderate room for agent confusion.

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 the baseline is 3 even without extra parameter guidance. The description adds some useful emphasis on numeric ID or URL-encoded path handling for project_id, matching the schema. However, it also refers to group_id and pagination fields that do not appear in the input schema, which slightly confuses the otherwise adequate parameter guidance.

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 clearly states a specific verb and resource: 'Upload a file for use in markdown content.' It is clear enough about the tool's basic job, and the mention of changing remote GitLab state adds useful scope. However, the sibling-tool sentence is generic and does not name any concrete alternative, so it does not meaningfully distinguish this tool from similar file-related tools like create_or_update_file or push_files.

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 real when-to-use guidance beyond the boilerplate 'Use this for the specific operation described; choose a sibling tool when you need a different resource or lifecycle action.' This does not tell an agent when this tool is preferred, when to avoid it, or which sibling should be chosen instead. The instruction is essentially a restatement of the obvious and provides no actionable decision support.

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

validate_ci_lintA
Read-only

Validate provided GitLab CI/CD YAML content for a project. Use this to check configuration without applying it; choose a create or update tool only after validation succeeds. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
refNoBranch or tag context for dry_run validation
contentYesGitLab CI/CD YAML content to validate
dry_runNoRun pipeline creation simulation
jmespathNoOptional JMESPath expression filtering the JSON result before return.
project_idYesProject ID or URL-encoded path
include_jobsNoInclude jobs in the lint response

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, and the description reinforces this consistently. It adds genuine value beyond annotations by disclosing error behavior: 'missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors.' This is exactly the kind of failure-mode context an agent needs and that structured fields don't provide.

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?

Well-structured: purpose first, then usage guidance, then behavioral details. Three sentences carry real information with minimal waste. Small deductions for the redundant restatement of the read-only annotation and the stray `group_id` reference, but overall tight and front-loaded.

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?

With no output schema, the description bears the burden of explaining what the agent should expect back, yet it never describes the lint response format (valid/invalid indicators, errors, warnings, jobs). It also fails to differentiate from the near-twin sibling `validate_project_ci_lint`. Coverage of usage timing, safety, and error modes is solid, so the tool is usable, but these gaps keep it at adequate rather than 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 100%, so the baseline is 3. The description adds little beyond the schema: the guidance to 'provide the numeric ID or complete URL-encoded path' merely restates the schema's own 'Project ID or URL-encoded path' description. The mention of `group_id` is actually confusing since no such parameter exists in 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 states a specific verb and resource: 'Validate provided GitLab CI/CD YAML content for a project.' It also implicitly distinguishes itself from mutation tools via the 'without applying it' framing. However, sibling `validate_project_ci_lint` exists and the description never differentiates this tool from that near-twin, so an agent cannot tell which lint validator to pick.

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 this to check configuration without applying it; choose a create or update tool only after validation succeeds' provides explicit workflow sequencing and a clear when-to-use directive. It stops short of naming specific alternative tools or stating when NOT to use this tool in favor of `validate_project_ci_lint`, leaving that sibling distinction unaddressed.

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

validate_project_ci_lintA
Read-only

Validate an existing .gitlab-ci.yml configuration for a project. Use this to check configuration without applying it; choose a create or update tool only after validation succeeds. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.

ParametersJSON Schema
NameRequiredDescriptionDefault
dry_runNoRun pipeline creation simulation
jmespathNoOptional JMESPath expression filtering the JSON result before return.
project_idYesProject ID or URL-encoded path
content_refNoCommit SHA, branch, or tag to read the existing CI config from
dry_run_refNoBranch or tag context for dry_run validation
include_jobsNoInclude jobs in the lint response

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, and the description reinforces that it is read-only and does not mutate GitLab data. It adds useful behavioral context by disclosing that missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors, which goes 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.

Conciseness4/5

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

The description is reasonably concise and front-loaded with the core purpose. It includes necessary usage guidance and behavioral notes without excessive verbosity. The sentence about identifiers and pagination is slightly generic but still 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 read-only validation tool with full schema coverage and annotations declaring safety, the description covers the essential context: what it does, when to use it, and what errors to expect. It does not describe the return format, but no output schema exists and the tool's purpose is straightforward validation, so this is a minor gap.

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 the schema already documents all six parameters. The description adds general guidance about providing numeric IDs or URL-encoded paths and using required identifiers and pagination fields exactly as documented, but it does not add specific meaning beyond the schema for individual parameters. Baseline 3 is appropriate.

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 ('Validate') and resource ('.gitlab-ci.yml configuration for a project'), and distinguishes it from the sibling 'validate_ci_lint' by specifying it operates on an existing project configuration. It clearly conveys the tool's purpose and scope.

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?

The description explicitly says to use this tool to check configuration without applying it, and to choose a create or update tool only after validation succeeds. It also provides guidance on identifiers and pagination fields, giving clear context for when and how to use the tool.

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

verify_namespaceA
Read-only

Verify if a namespace path exists. Use parent_id to scope the check to a specific parent namespace — required for nested namespaces where the same path may exist under different parents.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesNamespace path to verify
jmespathNoOptional JMESPath expression filtering the JSON result before return.
parent_idNoParent namespace ID; required to correctly resolve paths in nested namespaces where the same path may exist under different parents

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint and openWorldHint, so the read-only safety profile is covered. The description adds the nested-parent resolution behavior, but it does not disclose what the tool returns or how it behaves when the path does not exist.

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?

The description is two sentences with no filler. The core purpose is front-loaded and the parent_id guidance is relevant, necessary context.

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 existence check with complete schema coverage and read-only annotations, the description covers the essential edge case. It could be more explicit about the return format, but 'verify if exists' sufficiently implies the intended 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 100%, so all parameters are already documented. The description mostly restates the parent_id rationale already provided in the schema rather than adding genuinely new semantic 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?

The description clearly identifies the action and resource: 'Verify if a namespace path exists.' It also adds meaningful context about parent_id scoping. It does not explicitly distinguish this tool from sibling namespace tools like get_namespace or list_namespaces, but the verification purpose is 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?

The description gives useful guidance on when parent_id is required, specifically for nested namespaces where the same path can exist under different parents. However, it does not explain when to choose this tool over alternatives or when not to use it.

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

whoamiA
Read-only

Get current authenticated user details. Use this to identify the authenticated GitLab user; use get_user or get_users when looking up another user. It is read-only and returns the current user profile, while missing credentials or GitLab permission failures are reported as errors.

ParametersJSON Schema
NameRequiredDescriptionDefault
jmespathNoOptional JMESPath expression filtering the JSON result before return.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true Fowler, so the read-only nature is covered. The description adds value by stating that the operation returns 'the current user profile' and that missing credentials or permission failures surface as errors. This gives the agent insight into failure behavior 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.

Conciseness4/5

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

The description is compact and front-loaded, with the primary purpose first, followed by alternative tool guidance and one behavioral qualifier. Minor redundancy exists between 'Get current authenticated user details' and 'returns the current user profile', but overall it is efficient and well-structured.

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 simple, zero-required-parameter tool with a fully documented optional parameter Scott, the description covers purpose, scope, alternative tools, and error behavior. No output schema exists, but the description sufficiently indicates what the call returns and what can go wrong, so nothing essential 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?

The single `jmespath` parameter is fully described by the schema with 100% coverage, and the description does not add any parameter-specific details. Per the baseline rule, a score of 3 is appropriate when the schema already handles parameter documentation.

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 clearly states 'Get current authenticated user details' with a specific verb and resource, and explicitly differentiates from `get_user` and `get_users` by scoping this tool to the authenticated user. An agent can immediately tell this apart from sibling lookup tools.

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?

The description explicitly says when to use this tool ('identify the authenticated GitLab user') and when to use alternatives ('use `get_user` or `get_users` when looking up another user'). This is clear, actionable guidance that covers both selection and exclusion.

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. 118 tool updatesv2.1.66
    • Changedapprove_merge_request1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedbulk_publish_draft_notes1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedcreate_branch1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedcreate_commit_status1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedcreate_draft_note1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedcreate_group1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedcreate_issue1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedcreate_issue_emoji_reaction1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedcreate_issue_link1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedcreate_issue_note1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedcreate_issue_note_emoji_reaction1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedcreate_label1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedcreate_merge_request1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedcreate_merge_request_discussion_note1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedcreate_merge_request_emoji_reaction1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedcreate_merge_request_note1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedcreate_merge_request_note_emoji_reaction1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedcreate_merge_request_thread1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedcreate_note1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedcreate_or_update_file1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedcreate_repository1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changeddelete_branch1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changeddelete_draft_note1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changeddelete_issue1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changeddelete_issue_emoji_reaction1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changeddelete_issue_link1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changeddelete_issue_note_emoji_reaction1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changeddelete_label1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changeddelete_merge_request_discussion_note1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changeddelete_merge_request_emoji_reaction1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changeddelete_merge_request_note1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changeddelete_merge_request_note_emoji_reaction1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changeddiscover_tools1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changeddownload_attachment1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedfork_repository1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedget_branch1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedget_branch_diffs1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedget_ci_catalog_resource1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedget_commit1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedget_commit_diff1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedget_draft_note1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedget_file_blame1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedget_file_contents1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedget_issue1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedget_issue_link1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedget_label1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedget_merge_request1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedget_merge_request_approval_state1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedget_merge_request_conflicts1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedget_merge_request_diffs1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedget_merge_request_discussion1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedget_merge_request_file_diff1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedget_merge_request_note1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedget_merge_request_notes1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedget_merge_request_version1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedget_namespace1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedget_project1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedget_project_events1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedget_protected_branch1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedget_repository_tree1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedget_user1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedget_users1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedhealth_check1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedlist_branches1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedlist_ci_catalog_resources1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedlist_commit_statuses1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedlist_commits1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedlist_draft_notes1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedlist_events1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedlist_group_iterations1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedlist_group_members1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedlist_group_merge_requests1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedlist_group_projects1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedlist_issue_discussions1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedlist_issue_emoji_reactions1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedlist_issue_links1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedlist_issue_note_emoji_reactions1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedlist_issues1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedlist_labels1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedlist_merge_request_changed_files1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedlist_merge_request_diffs1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedlist_merge_request_emoji_reactions1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedlist_merge_request_note_emoji_reactions1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedlist_merge_request_pipelines1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedlist_merge_request_versions1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedlist_merge_requests1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedlist_namespaces1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedlist_project_members1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedlist_projects1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedlist_protected_branches1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedlist_todos1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedmark_all_todos_done1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedmark_todo_done1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedmerge_merge_request1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedmr_discussions1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedmy_issues1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedprotect_branch1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedpublish_draft_note1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedpush_files1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedresolve_merge_request_thread1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedsearch_repositories1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedunapprove_merge_request1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedunprotect_branch1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedupdate_default_branch1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedupdate_draft_note1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedupdate_issue1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedupdate_issue_description_patch1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedupdate_issue_note1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedupdate_label1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedupdate_merge_request1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedupdate_merge_request_discussion_note1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedupdate_merge_request_note1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedupdate_project1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedupload_markdown1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedvalidate_ci_lint1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedvalidate_project_ci_lint1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedverify_namespace1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
    • Changedwhoami1 field changed
      • addedInput schema / properties / jmespath
        Added value: +{
        +  "description": "Optional JMESPath expression filtering the JSON result before return.",
        +  "type": "string"
        +}
  2. 1 tool updatev2.1.63
    • Addedget_merge_request_discussion
  3. 37 tool updatesv2.1.62
    • Changedcreate_branch1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "branch",
        -  "project_id"
        -]New value: +[
        +  "project_id",
        +  "branch"
        +]
    • Changedcreate_commit_status1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "sha",
        -  "state",
        -  "project_id"
        -]New value: +[
        +  "project_id",
        +  "sha",
        +  "state"
        +]
    • Changedcreate_draft_note1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "body",
        -  "project_id",
        -  "merge_request_iid"
        -]New value: +[
        +  "project_id",
        +  "merge_request_iid",
        +  "body"
        +]
    • Changedcreate_issue1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "title",
        -  "project_id"
        -]New value: +[
        +  "project_id",
        +  "title"
        +]
    • Changedcreate_issue_emoji_reaction1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "name",
        -  "project_id",
        -  "issue_iid"
        -]New value: +[
        +  "project_id",
        +  "issue_iid",
        +  "name"
        +]
    • Changedcreate_issue_note1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "body",
        -  "project_id",
        -  "issue_iid"
        -]New value: +[
        +  "project_id",
        +  "issue_iid",
        +  "body"
        +]
    • Changedcreate_issue_note_emoji_reaction1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "name",
        -  "project_id",
        -  "issue_iid",
        -  "note_id"
        -]New value: +[
        +  "project_id",
        +  "issue_iid",
        +  "note_id",
        +  "name"
        +]
    • Changedcreate_label1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "name",
        -  "color",
        -  "project_id"
        -]New value: +[
        +  "project_id",
        +  "name",
        +  "color"
        +]
    • Changedcreate_merge_request1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "title",
        -  "source_branch",
        -  "target_branch",
        -  "project_id"
        -]New value: +[
        +  "project_id",
        +  "title",
        +  "source_branch",
        +  "target_branch"
        +]
    • Changedcreate_merge_request_discussion_note1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "body",
        -  "project_id",
        -  "merge_request_iid",
        -  "discussion_id"
        -]New value: +[
        +  "project_id",
        +  "merge_request_iid",
        +  "discussion_id",
        +  "body"
        +]
    • Changedcreate_merge_request_emoji_reaction1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "name",
        -  "project_id",
        -  "merge_request_iid"
        -]New value: +[
        +  "project_id",
        +  "merge_request_iid",
        +  "name"
        +]
    • Changedcreate_merge_request_note1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "body",
        -  "project_id",
        -  "merge_request_iid"
        -]New value: +[
        +  "project_id",
        +  "merge_request_iid",
        +  "body"
        +]
    • Changedcreate_merge_request_note_emoji_reaction1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "name",
        -  "project_id",
        -  "merge_request_iid",
        -  "note_id"
        -]New value: +[
        +  "project_id",
        +  "merge_request_iid",
        +  "note_id",
        +  "name"
        +]
    • Changedcreate_merge_request_thread1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "body",
        -  "project_id",
        -  "merge_request_iid"
        -]New value: +[
        +  "project_id",
        +  "merge_request_iid",
        +  "body"
        +]
    • Changedcreate_note1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "noteable_type",
        -  "body",
        -  "project_id",
        -  "noteable_iid"
        -]New value: +[
        +  "project_id",
        +  "noteable_type",
        +  "noteable_iid",
        +  "body"
        +]
    • Changedcreate_or_update_file1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "file_path",
        -  "content",
        -  "commit_message",
        -  "branch",
        -  "project_id"
        -]New value: +[
        +  "project_id",
        +  "file_path",
        +  "content",
        +  "commit_message",
        +  "branch"
        +]
    • Changedcreate_repository1 field changed
      • addedInput schema / properties / namespace_id / maximum
        Added value: +9007199254740991
    • Changeddelete_branch1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "branch_name",
        -  "project_id"
        -]New value: +[
        +  "project_id",
        +  "branch_name"
        +]
    • Changedget_branch1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "branch_name",
        -  "project_id"
        -]New value: +[
        +  "project_id",
        +  "branch_name"
        +]
    • Changedget_branch_diffs1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "from",
        -  "to",
        -  "project_id"
        -]New value: +[
        +  "project_id",
        +  "from",
        +  "to"
        +]
    • Changedget_commit1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "sha",
        -  "project_id"
        -]New value: +[
        +  "project_id",
        +  "sha"
        +]
    • Changedget_commit_diff1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "sha",
        -  "project_id"
        -]New value: +[
        +  "project_id",
        +  "sha"
        +]
    • Changedget_file_blame5 fields changed
      • addedInput schema / properties / range_end / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / range_end / minimum
        Added value: +-9007199254740991
      • addedInput schema / properties / range_start / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / range_start / minimum
        Added value: +-9007199254740991
      • changedInput schema / required
        Previous value: -[
        -  "file_path",
        -  "ref"
        -]New value: +[
        +  "project_id",
        +  "file_path",
        +  "ref"
        +]
    • Changedget_protected_branch1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "branch_name",
        -  "project_id"
        -]New value: +[
        +  "project_id",
        +  "branch_name"
        +]
    • Changedlist_commit_statuses1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "sha",
        -  "project_id"
        -]New value: +[
        +  "project_id",
        +  "sha"
        +]
    • Changedlist_merge_request_pipelines1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "merge_request_iid",
        -  "project_id"
        -]New value: +[
        +  "project_id",
        +  "merge_request_iid"
        +]
    • Changedprotect_branch7 fields changed
      • addedInput schema / properties / merge_access_level / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / merge_access_level / minimum
        Added value: +-9007199254740991
      • addedInput schema / properties / push_access_level / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / push_access_level / minimum
        Added value: +-9007199254740991
      • addedInput schema / properties / unprotect_access_level / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / unprotect_access_level / minimum
        Added value: +-9007199254740991
      • changedInput schema / required
        Previous value: -[
        -  "branch_name"
        -]New value: +[
        +  "project_id",
        +  "branch_name"
        +]
    • Changedpush_files2 fields changed
      • removedInput schema / properties / files / items / additionalProperties
        Removed value: -false
      • changedInput schema / required
        Previous value: -[
        -  "branch",
        -  "files",
        -  "commit_message",
        -  "project_id"
        -]New value: +[
        +  "project_id",
        +  "branch",
        +  "files",
        +  "commit_message"
        +]
    • Changedunprotect_branch1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "branch_name",
        -  "project_id"
        -]New value: +[
        +  "project_id",
        +  "branch_name"
        +]
    • Changedupdate_default_branch1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "default_branch",
        -  "project_id"
        -]New value: +[
        +  "project_id",
        +  "default_branch"
        +]
    • Changedupdate_issue_description_patch1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "patch_type",
        -  "patch",
        -  "project_id",
        -  "issue_iid"
        -]New value: +[
        +  "project_id",
        +  "issue_iid",
        +  "patch_type",
        +  "patch"
        +]
    • Changedupdate_issue_note1 field changed
      • addedInput schema / required
        Added value: +[
        +  "project_id",
        +  "issue_iid",
        +  "discussion_id",
        +  "note_id"
        +]
    • Changedupdate_merge_request_discussion_note1 field changed
      • addedInput schema / required
        Added value: +[
        +  "project_id",
        +  "merge_request_iid",
        +  "discussion_id",
        +  "note_id"
        +]
    • Changedupdate_merge_request_note1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "body",
        -  "project_id",
        -  "merge_request_iid",
        -  "note_id"
        -]New value: +[
        +  "project_id",
        +  "merge_request_iid",
        +  "note_id",
        +  "body"
        +]
    • Changedupdate_project1 field changed
      • addedInput schema / required
        Added value: +[
        +  "project_id"
        +]
    • Changedvalidate_ci_lint1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "content",
        -  "project_id"
        -]New value: +[
        +  "project_id",
        +  "content"
        +]
    • Changedverify_namespace2 fields changed
      • addedInput schema / properties / parent_id / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / parent_id / minimum
        Added value: +-9007199254740991
  4. 1 tool updatev2.1.57
    • Addedlist_group_merge_requests
  5. 3 tool updatesv2.1.52
    • Changedcreate_or_update_file1 field changed
      • addedInput schema / properties / encoding
        Added value: +{
        +  "description": "Content encoding. Use 'base64' for binary files (content must already be base64-encoded). When omitted, GITLAB_REPO_FILE_ENCODING applies.",
        +  "enum": [
        +    "text",
        +    "base64"
        +  ],
        +  "type": "string"
        +}
    • Changedmerge_merge_request1 field changed
      • addedInput schema / properties / sha
        Added value: +{
        +  "description": "SHA of the source-branch HEAD from get_merge_request (`sha` or `diff_refs.head_sha`). If provided, GitLab merges only when HEAD still matches. GitLab 19.2+ groups may require this (Require a commit SHA on the merge requests API).",
        +  "type": "string"
        +}
    • Changedpush_files7 fields changed
      • changedInput schema / properties / files / description
        Previous value: -"Array of files to push"New value: +"Array of files to push. Each entry defaults to action 'create'. Per-file fields: action (create/update/delete/move), encoding (text/base64; omitted uses GITLAB_REPO_FILE_ENCODING), previous_path (required for move). Content is required for create and update; omit content for delete, or for a move that should keep the original file. GITLAB_PERMISSION_MODE=modify rejects delete and move."
      • addedInput schema / properties / files / items / properties / action
        Added value: +{
        +  "description": "Commit action for this file. Defaults to 'create'.",
        +  "enum": [
        +    "create",
        +    "update",
        +    "delete",
        +    "move"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / files / items / properties / content / description
        Previous value: -"Content of the file"New value: +"File content. Required for create and update. Omit for delete, or for a move that should keep the original content. Base64-encoded when encoding is 'base64'."
      • addedInput schema / properties / files / items / properties / encoding
        Added value: +{
        +  "description": "Use 'base64' for binary files (content must already be base64-encoded). When omitted, GITLAB_REPO_FILE_ENCODING applies.",
        +  "enum": [
        +    "text",
        +    "base64"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / files / items / properties / file_path / description
        Previous value: -"Path where to create the file"New value: +"Path of the file in the repo"
      • addedInput schema / properties / files / items / properties / previous_path
        Added value: +{
        +  "description": "Previous path of the file. Required when action is 'move'.",
        +  "type": "string"
        +}
      • changedInput schema / properties / files / items / required
        Previous value: -[
        -  "file_path",
        -  "content"
        -]New value: +[
        +  "file_path"
        +]
  6. 1 tool updatev2.1.46
    • Addedlist_group_members
  7. 35 tool updatesv2.1.45
    • Addedapprove_merge_request
    • Addedcreate_branch
    • Addedcreate_commit_status
    • Addedcreate_issue_emoji_reaction
    • Addedcreate_issue_link
    • Addedcreate_or_update_file
    • Addeddelete_issue_link
    • Addeddelete_label
    • Addeddiscover_tools
    • Addedfork_repository
    • Addedget_commit
    • Addedget_commit_diff
    • Addedget_file_blame
    • Addedget_issue_link
    • Addedget_merge_request_approval_state
    • Addedget_repository_tree
    • Addedget_user
    • Addedget_users
    • Addedlist_ci_catalog_resources
    • Addedlist_commit_statuses
    • Addedlist_commits
    • Addedlist_group_projects
    • Addedlist_issue_discussions
    • Addedlist_issue_links
    • Addedlist_merge_request_changed_files
    • Addedlist_merge_request_versions
    • Addedlist_protected_branches
    • Addedmark_all_todos_done
    • Addedmerge_merge_request
    • Addedpush_files
    • Addedupdate_label
    • Addedupload_markdown
    • Addedvalidate_ci_lint
    • Addedvalidate_project_ci_lint
    • Addedwhoami
  8. 37 tool updatesv2.1.43
    • Removedapprove_merge_request
    • Changedbulk_publish_draft_notes3 fields changed
      • addedInput schema / properties / internal
        Added value: +{
        +  "description": "If true, the summary note is internal (GitLab 19.2+, default false)",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / note
        Added value: +{
        +  "description": "Summary note body to post on the merge request (GitLab 19.2+)",
        +  "type": "string"
        +}
      • addedInput schema / properties / reviewer_state
        Added value: +{
        +  "description": "Set reviewer review state after publishing (GitLab 19.2+). Does not record a formal approval. Works even with no draft notes.",
        +  "enum": [
        +    "requested_changes",
        +    "reviewed"
        +  ],
        +  "type": "string"
        +}
    • Removedcreate_branch
    • Removedcreate_commit_status
    • Removedcreate_issue_emoji_reaction
    • Removedcreate_issue_link
    • Removedcreate_or_update_file
    • Removeddelete_issue_link
    • Removeddelete_label
    • Removeddiscover_tools
    • Removedfork_repository
    • Removedget_commit
    • Removedget_commit_diff
    • Removedget_file_blame
    • Removedget_issue_link
    • Removedget_merge_request_approval_state
    • Removedget_repository_tree
    • Removedget_user
    • Removedget_users
    • Removedlist_ci_catalog_resources
    • Removedlist_commit_statuses
    • Removedlist_commits
    • Removedlist_group_projects
    • Removedlist_issue_discussions
    • Removedlist_issue_links
    • Removedlist_merge_request_changed_files
    • Removedlist_merge_request_versions
    • Removedlist_protected_branches
    • Removedmark_all_todos_done
    • Removedmerge_merge_request
    • Removedpush_files
    • Removedupdate_label
    • Changedupdate_merge_request1 field changed
      • addedInput schema / properties / milestone_id
        Added value: +{
        +  "description": "Milestone ID to assign. Set to 0 to unassign. Null is treated as omitted.",
        +  "type": "string"
        +}
    • Removedupload_markdown
    • Removedvalidate_ci_lint
    • Removedvalidate_project_ci_lint
    • Removedwhoami
  9. 3 tool updatesv2.1.30
    • Changedget_issue1 field changed
      • addedInput schema / properties / full_response
        Added value: +{
        +  "description": "If true, return the complete issue object including the full milestone description. Default returns a slim milestone (id, iid, title, state, web_url) to reduce token usage.",
        +  "type": "boolean"
        +}
    • Changedget_merge_request1 field changed
      • addedInput schema / properties / include_summaries
        Added value: +{
        +  "description": "If true, include deployment_summary, commit_addition_summary and approval_summary (extra API calls, larger response). Default false to reduce token usage.",
        +  "type": "boolean"
        +}
    • Changedupdate_issue1 field changed
      • addedInput schema / properties / full_response
        Added value: +{
        +  "description": "If true, return the complete updated issue object. Default returns a slim confirmation (iid, title, state, web_url, updated_at) to reduce token usage.",
        +  "type": "boolean"
        +}
  10. 1 tool updatev2.1.28
    • Changedget_ci_catalog_resource1 field changed
      • removedInput schema / anyOf
        Removed value: -[
        -  {
        -    "properties": {
        -      "component_limit": {
        -        "description": "Number of components per version to include (default: 20, max: 50)",
        -        "maximum": 50,
        -        "minimum": 1,
        -        "type": "integer"
        -      },
        -      "component_name": {
        -        "description": "Filter returned components by component name",
        -        "type": "string"
        -      },
        -      "full_path": {
        -        "description": "CI/CD Catalog resource full project path. Required when id is omitted.",
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "id": {
        -        "description": "CI/CD Catalog resource global ID. Required when full_path is omitted.",
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "include_readme": {
        -        "description": "Include version README content",
        -        "type": "boolean"
        -      },
        -      "version_limit": {
        -        "description": "Number of versions to include (default: 5, max: 20)",
        -        "maximum": 20,
        -        "minimum": 1,
        -        "type": "integer"
        -      }
        -    },
        -    "required": [
        -      "id"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "component_limit": {
        -        "description": "Number of components per version to include (default: 20, max: 50)",
        -        "maximum": 50,
        -        "minimum": 1,
        -        "type": "integer"
        -      },
        -      "component_name": {
        -        "description": "Filter returned components by component name",
        -        "type": "string"
        -      },
        -      "full_path": {
        -        "description": "CI/CD Catalog resource full project path. Required when id is omitted.",
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "id": {
        -        "description": "CI/CD Catalog resource global ID. Required when full_path is omitted.",
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "include_readme": {
        -        "description": "Include version README content",
        -        "type": "boolean"
        -      },
        -      "version_limit": {
        -        "description": "Number of versions to include (default: 5, max: 20)",
        -        "maximum": 20,
        -        "minimum": 1,
        -        "type": "integer"
        -      }
        -    },
        -    "required": [
        -      "full_path"
        -    ],
        -    "type": "object"
        -  }
        -]
  11. 4 tool updatesv2.1.26
    • Changedcreate_repository1 field changed
      • addedInput schema / properties / namespace_id
        Added value: +{
        +  "description": "Group namespace ID to create the project in. Omit to use the current user's namespace.",
        +  "minimum": 1,
        +  "type": "integer"
        +}
    • Addedget_ci_catalog_resource
    • Addedlist_ci_catalog_resources
    • Addedupdate_project
  12. 2 tool updatesv2.1.25
    • Changedmy_issues1 field changed
      • changedInput schema / properties / project_id / description
        Previous value: -"Project ID or URL-encoded path (optional when GITLAB_PROJECT_ID is set)"New value: +"Project ID or URL-encoded path (optional to search across all accessible projects)"
    • Changedverify_namespace1 field changed
      • addedInput schema / properties / parent_id
        Added value: +{
        +  "description": "Parent namespace ID; required to correctly resolve paths in nested namespaces where the same path may exist under different parents",
        +  "type": "integer"
        +}

TDQS

A3.8/5.0

Scored across 118 tools

Disambiguation4/5

The tool descriptions explicitly differentiate similar operations (e.g., get_merge_request_note vs. get_merge_request_notes vs. mr_discussions, and create_note vs. create_issue_note). While the sheer volume of tools creates some potential confusion, each description clearly states when to use it and which sibling tool to prefer. A few pairs like validate_ci_lint and validate_project_ci_lint are close but still distinguishable.

Naming Consistency4/5

The vast majority follow a consistent verb_noun pattern (e.g., create_issue, update_issue, list_issues, get_issue). There are minor deviations like mr_discussions, whoami, health_check, and discover_tools, but these are understandable abbreviations or standalone names. No mixing of naming conventions is observed.

Tool Count2/5

With 118 tools, this server is far beyond the typical scope and even the 'extreme mismatch' threshold of 50+ tools. While the toolset covers many GitLab features, the sheer count makes it heavy for an agent to navigate and likely overwhelms the model's context. The high number suggests insufficient consolidation of related operations.

Completeness5/5

The server provides comprehensive coverage across projects, issues, merge requests, branches, files, CI/CD, labels, users, and more, including full CRUD and lifecycle operations. It even includes edge cases like draft notes, emoji reactions, and CI validation. No obvious dead ends or missing core operations were identified for the domain.

Maintenance

ActivityActive
ResponsivenessWithin a week

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    B
    maintenance
    MCP server for GitLab CI/CD — pipelines, jobs, schedules, branches, tags, merge requests and repository files. Works with any GitLab (SaaS gitlab.com or self-hosted) via python-gitlab.
    23
    46 PyPI
    2
    MIT
  • 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.
    646 npm
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Model Context Protocol (MCP) server for GitLab — exposes 1006 GitLab REST & GraphQL API operations as MCP tools (42 meta-tools / 57 enterprise), 24 resources, 38 prompts, and 17 completion types for AI assistants. Written in Go, single static binary, stdio and HTTP transport.
    2
    41
    MIT