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 reviewlist_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

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.63. 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 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 (including delete mutations 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 areaApplications, 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

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.

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 11000. 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
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?

The annotation openWorldHint: true is non-standard and gives the agent little safety information, so the description carries the full burden for this state-changing operation. It discloses that review state is mutated, that auth/permission may be required, and that either an updated result or a permission/state error is returned — meaningful behavioral context beyond the generic annotation. Slight deduction for not addressing idempotency or double-approval behavior, but this is well above the minimum viable bar.

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 their place: the first states the core action, the second handles scope and sibling differentiation, and the third covers side effects, permissions, and return behavior. Front-loaded and free of redundancy. This is textbook economical writing.

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 mutation with 4 documented parameters and no output schema, the description discloses the critical operational aspects: what it doesn't do, what state it changes, what permissions matter, and what the caller can expect in return. The lack of an output schema raises the burden, and the description meets it by noting the return value. Could have added error taxonomy (e.g., not-found vs. already-approved cases), but 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 coverage is 100%, so the schema already documents all four parameters (project_id, merge_request_iid, sha, approval_password). The description makes a passing connection to the permission semantics of the approval_password parameter, but adds no genuinely new parameter-level information. Baseline of 3 is correct since the schema does the heavy lifting.

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?

Uses a specific verb and resource ('record an approval on an existing merge request') and explicitly declares what it does NOT do ('does not merge the request or change its source branch'). This directly differentiates it from the sibling merge_merge_request, letting an agent route correctly without opening either schema.

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

Usage Guidelines4/5

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

Provides clear context on when this is appropriate by contrasting with merging, and warns about preconditions ('may require re-authentication or approval permission'). It stops short of naming the exact sibling (merge_merge_request) to delegate to, so the alternative is implied rather than explicit.

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

bulk_publish_draft_notesB

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)
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

B3.1/5.0
Behavior3/5

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

States that it mutates remote GitLab state, requires project/group permission, and that GitLab returns validation, conflict, permission, and rate-limit errors rather than silently proceeding. This is genuinely useful operational guidance. Annotations add limited behavioral detail, so the description does real work here, though it stops short of describing the success response shape.

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?

Front-loaded with the core action, but the middle sections repeat boilerplate ('for the specific operation described', 'exactly as documented') that could be cut without losing information. Adequately organized, mildly padded.

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?

Covers the core action, optional fields, version constraints, permission, and error behavior. It doesn't clarify which identifier must be real vs. which scope (project_id vs group_id) is expected when both are accepted, and it stops short of describing the success response. Given mutation semantics and no output schema, these are moderate gaps, but the core call is well-constrained.

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 the GitLab 19.2+ version gates for note/internal/reviewer_state fields, which is value beyond the enum descriptions)Skip: the numeric-ID-vs-URL-path line only restates what the schema already says, so it contributes nothing.

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?

Action and resource are explicit: publishes draft notes for a merge request, with optional reviewer_state and internal note. The phrase 'choose a sibling tool' is generic, not a real discriminator, so it doesn't fully pin down when this tool differs from publish_draft_note — but the core operation is unmistakable.

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 guidance 'choose a sibling tool when you need a different resource or lifecycle action' is generic filler applicable to literally every tool in the catalog; it names no specific sibling. It does add useful version gating (GitLab 19.2+ for note/reviewer_state) and permission requirements, but the routing advice carries no concrete signal.

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
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?

The description discloses that the operation changes remote repository state, requires branch-creation permission, and lists possible error types (validation, missing-ref, protected-project, already-exists). The openWorldHint annotation is minimal, so the description carries the burden and does so well, though it doesn't detail side effects beyond state change.

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 purpose is front-loaded, usage guidance follows, and parameter clarifications are compactly appended. 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?

For a 3-parameter tool with no output schema, the description covers purpose, usage, permissions, error cases, and parameter semantics. It doesn't describe the return value shape, but the description already mentions it returns the new branch or an error, which 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.

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 a small amount of context by explaining that project_id accepts a numeric ID or URL-encoded path and that ref selects the starting revision, but this largely mirrors 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 states a specific verb and resource ('Create a new branch') and distinguishes it from siblings by naming get_branch/list_branches for inspection and protect_branch for post-creation protection. It clearly identifies what the tool does and how it differs from related branch 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 ('Use this to create a branch from a branch, tag, or commit') and names alternatives for inspection and protection. It also states the required permission (branch-creation permission), giving clear context for 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.

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
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
Behavior5/5

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

The description explicitly states that it changes remote GitLab state and requires project/group permissions, and explains that the API returns validation, conflict, permission, and rate-limit errors rather than silently succeeding. Since annotations only contain openWorldHint=true, this behavioral disclosure carries the full burden and does so well.

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 and side effects are front-loaded and concise, but the generic create-vs-update sentence and the closing boilerplate about required identifiers or pagination are not tailored to this tool and could mislead. Size is reasonable but not every sentence earns 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 mutation with 10 parameters and no output schema, the description covers state change, permission requirements, and error behavior, but it omits the key upsert semantics (that an existing status with the same name/context is updated) and repeats the confusing update-tool advice. This leaves an agent with enough to act but with a significant ambiguity.

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 documents all 10 parameters at 100% coverage, so no extra parameter detail is needed, but the description adds boilerplate that is not grounded in the schema: it mentions group_id, which is not an accepted input, and references pagination fields that do not exist on this schema. This is actively more confusing than helpful.

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?

Opening sentence names the exact operation and resource: 'Create or update the status of a commit.' This distinguishes it from the read-only sibling list_commit_statuses and leaves no doubt about what resource is acted on.

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?

It offers a generic rule ('choose the corresponding update or edit tool when the resource already exists') but this is misleading here: the tool itself supports updating commit statuses and there is no update_commit_status sibling. It also does not point to list_commit_statuses for checking existing statuses, so an agent could be steered toward a non-existent alternative.

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
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/5.0
Behavior4/5

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

With only openWorldHint as an annotation, the description carries the safety disclosure burden. It explicitly says the tool 'changes remote GitLab state,' requires project/group permission, and returns validation, conflict, permission, or rate-limit errors rather than silently applying invalid requests. This adds meaningful 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 front-loaded with purpose and side-effect warning, and is not overly long. However, the closing sentence about pagination fields is generic boilerplate that does not apply to this tool's schema, and 'described by the schema' is redundant 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?

The complex position object is thoroughly documented in the schema, so the description does not need to repeat it. It adds the key operational context: state change, permissions, and error behavior. A short note on draft-note lifecycle (unpublished until publish_draft_note) would strengthen it, but it is reasonably 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 schema already documents all six parameters in detail, including the complex position object. The description's note about numeric IDs or URL-encoded paths mostly restates the project_id schema, and the 'group_id' mention is conditional boilerplate not present in this schema. 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 a specific verb and resource: 'Create a draft note for a merge request.' It also explicitly distinguishes creation from update/edit tools, which separates it from siblings like update_draft_note and delete_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?

It states 'Use this for a new resource or action' and directs the agent to the corresponding update or edit tool when the resource already exists. It also adds permission prerequisites and error behavior. It could name update_draft_note explicitly or contrast with create_note, but the guidance is clear.

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
parent_idNoThe parent group ID for creating a subgroup
visibilityNoThe group's visibility level
descriptionNoThe group's description

TDQS

A4.3/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. It discloses that the tool changes remote state, requires permissions, and returns errors instead of silently failing—valuable context beyond the annotation. Lacks detail on partial success or atomicity, but sufficient.

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 moderately long but each sentence adds value: purpose, usage differentiation, behavior, and parameter tips. It is front-loaded with the core purpose and does not waste words.

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 creation tool with 5 parameters, no output schema, and minimal annotations, the description covers purpose, usage, behavior, and parameter guidance. It doesn't mention return value, but that's not required without an output schema. Adequate for an agent to call 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% with descriptions for all parameters. The description's parameter guidance (numeric ID or URL-encoded path) is generic and references project_id/group_id not present in the schema. Adds little beyond what the schema already provides, so 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?

Clearly states 'Create new group or subgroup' with a specific verb and resource, and differentiates from update/edit tools by explicitly noting when to use them instead. This distinguishes it from sibling create tools like create_issue or create_repository, which are for different 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?

Provides explicit guidance: use for new resources, choose update/edit for existing ones. Also mentions permission requirements and error behavior, giving clear context on when and how to invoke it. 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.

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)
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.5/5.0
Behavior4/5

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

Beyond the sparse openWorldHint annotation, the description discloses that the operation creates remote project data, requires issue creation permission, and returns either the new issue or validation, permission, and duplicate-related errors. This is meaningful behavioral context for a mutation tool, though it could have added more detail about side effects like notifications or idempotency.

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, followed by routing guidance and behavioral/error context, and 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 mutation tool with 8 parameters, a fully documented schema, and no output schema, the description provides the essential extra context: side effect, permission requirement, and expected success/error returns. An agent has what it needs to decide whether to call the tool and what to expect.

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 does not add parameter-level detail beyond what the schema provides, so it meets the baseline but does not exceed 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 'Create a new issue', a specific verb and resource that makes the tool's purpose immediately clear. It further distinguishes itself from update_issue and create_issue_note, ensuring the agent can tell it apart from the most similar 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?

It explicitly states when to use this tool ('Use this to open a new issue') and when not to: 'use update_issue for an existing issue and create_issue_note to add discussion without changing issue fields'. This gives clear routing guidance 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')
issue_iidYesThe IID of an issue
project_idYesProject ID or complete URL-encoded path to project

TDQS

A3.5/5.0
Behavior4/5

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

With no readOnly or destructive annotations present, the description usefully states that the tool changes remote GitLab state and requires permissions. It also discloses error behavior (validation, conflict, permission, rate-limit) rather than silent failure. This gives an agent important behavioral context beyond 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?

Four sentences, with the core action front-loaded and examples early. The final sentence contains generic filler ('pagination fields', 'described by the schema') that is not applicable and could be trimmed, so it is not maximally concise.

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 3-parameter creation tool, the description covers purpose, mutation, permissions, errors, and identifier format. It is diminished by irrelevant boilerplate about group_id and pagination, and it does not mention what a successful response returns or how to distinguish from note-level emoji reactions. Overall 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?

The schema already describes all three parameters with 100% coverage, so the baseline is 3. The description adds emoji-name examples and repeats URL-encoding guidance for project_id, but its mention of group_id and pagination fields is boilerplate that does not match this schema. It does not meaningfully clarify issue_iid 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 first sentence states a concrete action and resource ('Add an emoji reaction to an issue') with examples of valid emoji names, which is immediately actionable. The follow-up create-vs-update phrasing helps distinguish from edit tools, though it does not explicitly distinguish from sibling note-emoji reaction tools.

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 explicitly advises using this for a new resource or action and choosing an update/edit tool when the resource already exists, and it notes permission requirements. However, the guidance is generic and does not name specific siblings like create_issue_note_emoji_reaction, and the 'update or edit' advice is questionable for this tool since no update_issue_emoji_reaction sibling exists.

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
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.5/5.0
Behavior4/5

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

Annotations are sparse (only openWorldHint), so the description must carry the transparency burden. It does: it states the operation 'creates remote discussion content,' requires note permission, and returns the note or a missing-issue/thread/permission error. This covers mutation, permissions, 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.

Conciseness5/5

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

Two tightly packed sentences front-load the core action, then handle alternatives, side effects, permissions, and error cases. There is no filler, repetition, or unnecessary detail.

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 schema and only a weak annotation, the description is complete enough for an agent to select and invoke the tool correctly: it covers purpose, when to use alternatives, remote side effects, permission requirements, and expected return/error behavior. The 100% schema coverage handles parameter 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 schema already documents all five parameters. The description adds only contextual framing around the discussion thread behavior, which is already reflected in the discussion_id schema description. It doesn't enrich 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 starts with a specific verb and resource: 'Add a note to an issue, optionally replying to a discussion thread.' It also explicitly distinguishes itself from update_issue and create_note, making its purpose unambiguous against a crowded set of 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?

It gives direct routing guidance: 'use update_issue for issue fields and create_note only when the generic endpoint is required.' This tells an agent exactly when to pick this tool and when to pick an alternative.

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)
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.8/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 burden and delivers: it states that the tool mutates remote GitLab state, requires project/group permission, and surfaces validation, conflict, permission, or rate-limit errors rather than silently accepting invalid requests. This is valuable 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.

Conciseness3/5

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

The core purpose is front-loaded in the first sentence, which is good. However, the middle sentences are generic boilerplate ('Use this for a new resource or action...', 'use required identifiers and pagination fields exactly as documented') that could apply to any GitLab tool and add little specific value; the mention of pagination fields is inaccurate for a schema with no pagination parameters.

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 five-parameter tool with full schema coverage and no output schema, the description addresses the key gaps: the discussion_id nuance, mutation semantics, permission requirements, and error behavior. An agent has enough to call the tool correctly without needing to read the GitLab API docs.

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 marginal value by noting that project_id accepts a numeric ID or URL-encoded path and that discussion_id is the thread-reply differentiator — but most parameter meaning already lives in the schema, and the generic 'pagination fields' remark is boilerplate that doesn't apply to this 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 states a specific verb and resource ('Add an emoji reaction to an issue note') and clarifies the discussion_id variant for thread replies. It distinguishes creation from update/edit tools, though it doesn't explicitly name the closest siblings (create_issue_emoji_reaction, create_merge_request_note_emoji_reaction) — the resource is specific enough that 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 Guidelines4/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 ('Pass discussion_id for discussion thread replies'), a creation-vs-update routing rule ('choose the corresponding update or edit tool when the resource already exists'), and notes that required identifiers must be used exactly as documented. It lacks an explicit alternative-tool name, but the guidance is concrete and actionable.

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
priorityNoThe priority of the label
project_idYesProject ID or URL-encoded path
descriptionNoThe description of the label

TDQS

A4/5.0
Behavior4/5

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

The openWorldHint annotation already implies external side effects, but the description adds valuable specifics: it changes remote GitLab state, requires project or group permission, and returns validation, conflict, permission, or rate-limit errors rather than silently succeeding. This goes beyond the annotation and gives the agent a clear failure model, though it doesn't discuss idempotency or response payload.

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 tight and valuable, but the third sentence includes generic boilerplate about pagination and group_id that doesn't apply to this tool. This wastes tokens and could misdirect the agent, making the description less effective than it could be with a more targeted final sentence.

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 there is no output schema, the description should explain the return value, but it does not. It also omits behavior for duplicate labels or partial updates, though it does mention conflict errors. The inaccurate group_id and pagination references detract from completeness, making this only minimally adequate for a correct 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?

The schema already has 100% coverage, so the baseline is 3, but the description's parameter guidance is partly inaccurate. It mentions 'group_id' which is not in the input schema, and refers to 'pagination fields' that have no relevance to this create operation. The only useful addition, that project_id can be a numeric ID or URL-encoded path, merely repeats the schema's description, so it adds confusion instead of clear 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 states 'Create a new label in a project' with a specific verb and resource. It also differentiates from the update/edit siblings by explicitly saying to use those when the resource already exists, so an agent can confidently select this tool versus update_label or create_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?

It explicitly says 'Use this for a new resource or action; choose the corresponding update or edit tool when the resource already exists,' giving a direct when-to-use vs. when-not-to-use. It also notes permission requirements and error behavior, which helps the agent decide if this tool is appropriate given its context.

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.
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.4/5.0
Behavior4/5

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

With only `openWorldHint` as an annotation, the description carries the behavioral disclosure burden. It clearly states that the operation "creates remote review state," requires project access, and returns either the new MR or validation, permission, branch, or duplicate-related errors. It stops short of detailing reversibility or side effects like source branch removal, but this is solid coverage.

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

Conciseness5/5

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

The description is three tightly written sentences with the core action front-loaded. Every sentence adds meaning: what it does, when to use it versus the sibling, and what side effects and outcomes to expect.

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

Completeness4/5

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

For a 13-parameter tool with no output schema, the description covers the essential operational facts: purpose, lifecycle relationship to `update_merge_request`, remote state creation, permission requirements, and return/error categories. It could mention that merging an existing MR is handled by `merge_merge_request`, but the sibling names make that 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 baseline is 3. The description mentions source and target branches but adds little semantic depth beyond the schema's own parameter descriptions, which already explain each field.

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 merge request." It further specifies that it opens an MR from an existing source branch to a target branch and explicitly distinguishes it from `update_merge_request`, so an agent can tell it apart from sibling MR 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 gives direct usage guidance: use it to open a new merge request and use `update_merge_request` after the MR exists. It also notes the operation requires project access, which helps the agent decide when it is applicable.

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
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.4/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 burden. It discloses that the operation creates remote review content, requires note permission, and returns either the new note or missing-discussion/position/permission errors. This adds meaningful context 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, front-loaded with the core action, followed by routing and consequence details. There is no filler or redundant restatement of 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 write-style tool with no output schema, it still tells the agent what to expect (new note or error) and which permission is required. Combined with full parameter schema and sibling differentiation, the description is sufficiently complete; only minor details like created_at behavior are left to the schema, which already documents them.

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%, with descriptions for all five parameters, so the schema carries the parameter documentation burden. The description reinforces the purpose of discussion_id and body but adds no new parameter-level detail beyond what the schema already provides.

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

Purpose5/5

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

Description uses a specific verb and resource: 'Add a new discussion note to an existing merge request thread.' It also distinguishes itself from `create_merge_request_thread` and `create_merge_request_note` by naming the exact context (reply inside existing discussion).

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: to reply inside an existing merge request discussion. It names the alternatives for starting a new thread and adding a top-level note, so no inference is needed.

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_reactionB

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')
project_idYesProject ID or complete URL-encoded path to project
merge_request_iidYesThe IID of a merge request

TDQS

B3.4/5.0
Behavior4/5

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

The annotations only provide openWorldHint, so the description carries the behavioral burden. It explicitly says the tool changes remote GitLab state, requires project or group permission, and surfaces validation, conflict, permission, or rate-limit errors rather than silently applying invalid requests.

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 front-loads the purpose effectively and the error/permission sentence is useful. However, the update/edit alternative and the group_id/pagination boilerplate add noise without corresponding to this tool's actual API surface.

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 three-parameter create tool with no output schema, the description covers the key operational details: side effects, permissions, error behavior, and identifier format. It is not fully complete because it omits a pointer to the note-emoji sibling and does not mention what a successful response looks like.

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?

Input schema coverage is 100 percent and already documents the emoji examples and project_id path format, so the description adds little beyond the schema. The closing note about group_id and pagination fields is generic and not fully relevant to this tool's actual parameters.

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 action, Add an emoji reaction to a merge request, with concrete emoji examples. It is clear about the resource but does not distinguish itself from the similarly named sibling create_merge_request_note_emoji_reaction.

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?

Offers only a generic new-resource versus update/edit rule, which does not map cleanly to any real update tool for emoji reactions in the sibling list. It gives no guidance about when to choose this tool over the closely related create_merge_request_note_emoji_reaction.

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
project_idYesProject ID or complete URL-encoded path to project
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?

Description discloses that it mutates remote state, requires permissions, and returns validation/conflict/permission/rate-limit errors. This is valuable since annotations provide only openWorldHint and no safety flags. It doesn't mention potential side effects (e.g., notifications or discussion threading) but covers the core behavior well.

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 usage, then behavior. It is moderately concise and each sentence earns its place, though the final sentence about identifiers/pagination is somewhat generic and could be trimmed without losing essential 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 the tool's simplicity (3 params, no output schema, minimal annotations), the description covers purpose, usage, permissions, and error handling. It is sufficiently complete for an agent to invoke it correctly, though it could mention the exact response format (since no output schema exists) and any content constraints on the note body.

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 parameters are already documented. The description adds minimal extra meaning; it mentions providing numeric ID or URL-encoded path, but that's already in the schema. It also references 'group_id' which is not a parameter in this tool, creating slight confusion. Value added is marginal.

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 clear verb+resource: 'Add a new note to a merge request.' Explicitly distinguishes from update/edit tools, making the purpose unambiguous and differentiating from siblings like 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?

Explicitly instructs to use this for new resources/actions and to choose the corresponding update/edit tool when the resource exists. This covers the main alternative, though it doesn't differentiate from other create-type note tools (e.g., create_merge_request_thread or create_draft_note), leaving some ambiguity for those siblings.

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)
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

A3.6/5.0
Behavior5/5

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

Despite only openWorldHint being set in the annotations, the description explicitly discloses that the tool changes remote GitLab state, requires appropriate project/group permissions, and returns validation, conflict, permission, or rate-limit errors instead of silently succeeding. This gives the agent the essential behavioral expectations for a mutating operation.

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 specific and efficient, but the final sentence is generic boilerplate about group_id and pagination fields that is neither relevant nor accurate for this tool. The overall length is acceptable, but that last sentence 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?

The description covers important operational context: discussion_id behavior, remote state mutation, permissions, and error modes. However, it includes irrelevant group_id/pagination wording and gives a misleading update/edit alternative when no such tool exists, leaving the overall picture accurate but not fully reliable.

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 does not add meaningful parameter semantics and instead introduces inaccuracies: it references group_id and pagination fields that do not exist in this tool's schema. The numeric ID or URL-encoded path advice merely repeats what the project_id schema description already 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 first sentence names a specific verb and resource: adding an emoji reaction to a merge request note. This clearly distinguishes it from related siblings like create_merge_request_emoji_reaction, which targets the merge request itself, and create_merge_request_note, which creates a note without a reaction.

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?

It offers some context, such as passing discussion_id for discussion thread replies, but the guidance to 'choose the corresponding update or edit tool when the resource already exists' is misleading: no update or edit tool exists for merge request note emoji reactions in the sibling list, only delete and create tools. It also does not name the closest alternatives like create_merge_request_emoji_reaction or delete_merge_request_note_emoji_reaction.

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
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.7/5.0
Behavior5/5

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

Annotations provide only openWorldHint, so the description carries the behavioral burden. It discloses that the operation creates remote content, requires note permission, and returns either the discussion or permission/validation errors. This goes beyond the schema and gives an agent a realistic failure model.

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 tight sentences: purpose, routing to alternatives, and behavioral/error summary. No filler or repeated schema content, and the most important selection information 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 complex nested tool there is no output schema, but the description states the success return (discussion) and main error categories. Combined with the very detailed input schema and sibling routing, an agent has enough to invoke and verify the 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 already documents all five parameters including the nested position object with detailed rules for line_code, shas, and line ranges. The description adds no parameter-level detail, but with 100% schema coverage the baseline of 3 applies.

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

Purpose5/5

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

Clearly states it creates a new thread on a merge request and explicitly frames it as starting a review thread. Names the sibling tools for unthreaded notes and replies, which distinguishes it from adjacent operations. The verb+resource is specific and 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?

Explicitly says when to use this tool: to start a review thread. It also says when not to use it, naming create_merge_request_note for unthreaded notes and create_merge_request_discussion_note for replies to existing threads. The permission requirement provides an additional eligibility check before invocation.

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
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=true, so the description carries the behavioral burden. It discloses that the operation mutates remote discussion content, requires note permission, and returns the created note or an error, covering the main behavioral risks even though it omits finer details like idempotency or rate limits.

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: definition, usage routing, and behavior/return information. No unnecessary detail 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?

Despite lacking an output schema, the description provides the essential return and error information. All required parameters are documented in the schema, and the tool's complexity is modest, so nothing needed for a 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 all four parameters are already fully documented. The description adds context about top-level usage but no additional parameter-level meaning, so the baseline 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 opens with a specific verb and resource: 'Create a new note (comment) to an issue or merge request.' It further narrows scope to top-level comments, distinguishing it from threaded note operations and making sibling differentiation clear.

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

Usage Guidelines5/5

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

Explicitly states when to use this tool ('for a top-level comment ... when no typed discussion operation is needed') and names alternatives for threaded replies (`create_merge_request_thread` or `create_issue_note`). The when-to-use and when-not-to-use guidance is direct and actionable.

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.
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.5/5.0
Behavior4/5

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

Annotations provide only `openWorldHint`, so the description carries the burden of disclosing effects. It explains that the tool writes through a commit, requires repository write permission, and surfaces conflict/validation errors. It stops just short of explicitly stating that an existing file's content will be overwritten.

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 purposeful sentences: purpose, usage rule, encoding default/backward compatibility, and permission/error behavior. It is front-loaded and contains no filler.

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 9-parameter mutation tool with no output schema, this description covers selection criteria, write permission, commit semantics, encoding, and the return/error class. The high schema coverage fills in remaining field details, so an agent has what it needs to call 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 for parameter semantics is 3. The description mostly restates the `encoding` default already present in the schema and does not clarify the relation between `commit_id` and `last_commit_id` or the rename behavior of `previous_path`.

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 ('Create or update a file in a GitLab project') and immediately narrows scope to a single repository file. It also names `push_files` as the multi-file sibling, so an agent can distinguish this tool 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 gives explicit conditions for use: a single repository file when the target path is known to be new or existing. It also calls out the alternative, `push_files`, for multi-file commits, which makes the selection rule unambiguous.

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
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/5.0
Behavior4/5

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

The description adds value beyond the openWorldHint annotation by disclosing that it changes remote GitLab state, requires permissions, and returns validation/conflict/permission/rate-limit errors instead of silently failing. This is useful behavioral context for the agent.

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 starts with a clear purpose and provides usage guidance, but the final sentence about project_id/group_id and pagination fields is irrelevant and confusing. It adds noise without earning its place, reducing overall 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?

The description covers the core purpose, usage guidance, and error behavior, but the misleading parameter reference creates a gap that could lead an agent to look for non-existent fields. It also does not mention what happens on success (e.g., returned project object), though with no output schema this may be less critical. Overall, it is adequate 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. However, the description includes a confusing reference to 'project_id' or 'group_id' and 'pagination fields' that do not exist in the schema (only namespace_id is present). This adds misleading guidance that could misdirect the agent, and it does not clarify any of the actual 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 the verb and resource: 'Create a new GitLab project.' It also distinguishes this from update/edit tools, making it easy for an agent to select this tool for new resources and the update tool for existing ones.

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 ('Use this for a new resource or action') and when not to ('choose the corresponding update or edit tool when the resource already exists'). This directly routes the agent to the correct alternative.

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
project_idYesProject ID or complete URL-encoded path to project
branch_nameYesName of the branch to delete

TDQS

A4.9/5.0
Behavior5/5

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

The description discloses the permanent/irreversible nature of the operation ('permanently removes a remote branch'), the required permission ('requires branch-delete permission'), and the error outcomes ('protected-branch, missing-resource, or permission error'). It adds value beyond the destructiveHint annotation by specifying consequences 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.

Conciseness5/5

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

The description is compact and front-loaded: the primary action and resource are stated in the first sentence, followed by concise usage and behavioral notes. Every sentence earns its place—no filler 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 destructive nature, the description is fully complete: it covers when to use, what to do before, what the operation does, what permissions are needed, and what errors to expect. No output schema is present, but the description adequately signals return shape ('returns the deletion result or ... error') while the error list covers the key failure 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?

The schema covers 100% of the parameters with descriptions, so the baseline is 3. The description adds clarifying context: it clarifies that `branch_name` refers to the branch being deleted, reinforces that `project_id` is the target, and connects the parameters to the operation's semantics (e.g., confirming the branch name means checking `branch_name`). This slight edge warrants a 4.

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 ('Delete') and resource ('branch from project'), and clearly distinguishes this tool from siblings like `get_branch`, `list_branches`, `protect_branch`, and `update_default_branch` by specifying the action and scope. It also names the sibling tools explicitly in the usage guidance, so 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?

The description provides explicit when-to-use guidance: '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.' It gives clear preconditions, exclusions, and alternatives, which is exemplary.

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
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 include destructiveHint: true, so the description adds value by stating irreversibility, permission requirements, and specific error responses (validation, conflict, permission, rate-limit). This goes beyond the annotation by detailing consequences and failure modes, though it does not describe effects on related data.

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 then provides necessary warnings and usage context. It is slightly verbose but every sentence adds relevant guidance. It could be trimmed, but it remains 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 destructive, irreversible operation, the description covers verification, permissions, error modes, and parameter formatting. There is no output schema, so return values need not be described. All essential guidance for safe and correct invocation is present, making it 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%, so the schema already fully documents all three required parameters. The description adds a redundant note about providing numeric IDs or URL-encoded paths, which is already in the schema. No new meaning beyond the schema is introduced, 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 a clear verb + resource: 'Delete a draft note.' It explicitly distinguishes itself from inspection operations by instructing to 'choose a get or list tool first', which differentiates it from siblings like get_draft_note and list_draft_notes. The purpose is unambiguous and specific.

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 guidance: 'Use this only after verifying the target' and directs to alternative tools for inspection. It also mentions the need for permissions and possible error types, providing a clear context for when and how to use it.

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
issue_iidYesThe internal ID of the project issue
project_idYesProject ID or URL-encoded path

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already include destructiveHint=true, but the description adds crucial context: the operation permanently removes data, requires delete permission, and returns specific error types (missing-resource, permission, policy). This goes beyond annotation-specified safety.

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 (two sentences) and front-loaded with the core action and usage caveat. Every sentence adds value, 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 two-parameter destructive operation with a full schema and annotations, the description covers the essential context: permissions, irreversibility, and error handling. No significant gaps remain 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 describes the required parameters. The description does not add extra parameter-level detail, but since the schema handles this, 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 this tool deletes an issue, with a specific verb and resource. It explicitly contrasts with update_issue for closing or editing, making its purpose distinct from the sibling tool.

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 when-to-use guidance: 'Use this only after confirming the issue and intended permanent removal' and clearly says to use update_issue for non-destructive changes. This is ideal for routing the agent to the correct tool.

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
issue_iidYesThe IID of an issue
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 states that the tool 'changes or removes remote GitLab data and may be irreversible' and that it 'requires the necessary project or group permission' and returns specific error types. This elaborates on the destructiveHint annotation, providing additional context about side effects and error conditions, which exceeds the annotation's minimal 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?

The description is somewhat lengthy but each sentence serves a purpose: stating the action, advising on pre-verification, describing side effects and permissions, and providing identifier formatting. It is well-structured with the core purpose first, followed by usage caveats. No redundant fluff, though it could be slightly more concise by removing the generic pagination mention.

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 delete operation, the description covers the key aspects: what it does, when to use it (and when not to), side effects, permissions, and potential errors. It does not describe the response format, but no output schema is provided, so that is not required. It is complete enough for an agent to safely decide on and execute the call, though it could have mentioned a success indicator.

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 descriptions cover all parameters (project_id, issue_iid, award_id) and the description echoes the schema's guidance about providing numeric IDs or URL-encoded paths. It adds a generic note about 'pagination fields' which is not relevant here. Since schema coverage is 100% and the description does not significantly enhance parameter meaning beyond the schema, the baseline 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 clearly states the specific action: 'Remove an emoji reaction from an issue.' It distinguishes this from the many sibling emoji tools by explicitly naming the resource (issue) and the operation (delete/remove). The verb and resource are 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 gives explicit guidance on when to use it: '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 to use a read-only tool first if inspection is needed, and also implies it is a destructive action. It further mentions permissions and error types, providing clear usage context.

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
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?

Without annotations, the description would carry the full burden — but here annotations already declare destructiveHint=true and openWorldHint=true. The description adds valuable behavioral context: states the operation 'changes or removes remote GitLab data and may be irreversible', mentions permission requirements ('requires the necessary project or group permission'), and enumerates possible errors ('validation, conflict, permission, or rate-limit errors'). This meaningfully extends the annotations, so a 4 is justified. It doesn't contradict the destructiveHint in any way (annotation_contradiction = false).

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 dense paragraph with front-loaded purpose. Every sentence adds value: action, usage guardrail, destructive disclosure, error types, and parameter clarifications. Slightly long (one compound sentence with multiple semicolons), but nothing is filler. It could be broken into bullets or separated into two paragraphs for easier scanning, but 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?

Given the tool has a destructive hint, open-world hint, 5 parameters (4 required), and no output schema, the description covers the critical aspects an agent needs: target semantics (issue vs discussion), safety warnings, error types, and identifier formatting. The only minor gap is return value expectations (tool has no output schema, and the description doesn't describe what a successful deletion returns). For a deletion tool where the action is clear, this is a minor omission. Overall complete enough.

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 real value beyond the schema: it clarifies the optional discussion_id ('Pass discussion_id for discussion thread replies'), states that discussion_id is 'Required for notes that are discussion replies; omit for top-level notes' — going beyond the schema's terse wording. It also clarifies the ambiguous project_id ('provide the numeric ID or complete URL-encoded path'). This is a solid improvement over schema-only knowledge, earning a 4.

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 the specific verb-resource pair ('Remove an emoji reaction from an issue note') and names the sibling it is not ('use a get or list tool first...'). It is clearly differentiated from create_issue_note_emoji_reaction and the merge_request variants present in the sibling list. The opening sentence 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 Guidelines4/5

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

The description gives clear context: 'Use this only after verifying the target; choose a get or list tool first when you need to inspect state without changing it.' This directs when not to use the tool. However, it doesn't explicitly name a specific sibling alternative tool by name (e.g., 'use list_issue_note_emoji_reactions first'), and doesn't cover when to prefer deletion over other operations. The guidance is clear but a touch generic.

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
label_idYesThe ID or title of a project's label
project_idYesProject ID or URL-encoded path

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare destructiveHint and openWorldHint, but the description adds critical context: it 'changes or removes remote GitLab data and may be irreversible,' requires 'the necessary project or group permission,' and 'returns validation, conflict, permission, or rate-limit errors.' This goes beyond the annotations by describing irreversibility, authorization needs, and error types, which helps the agent 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 three sentences long, front-loaded with the core purpose and safety caution. The second sentence packs usage and behavioral guidance into one clause, and the third gives parameter instructions. It is reasonably concise, though the final sentence's generic 'use required identifiers and pagination fields exactly as documented' is slightly redundant 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 destructive tool with no output schema, the description covers the essential aspects: purpose, when to use, behavioral consequences (irreversibility, permissions, errors), and parameter guidance. It does not describe return values, but none are specified, and the description adequately prepares the agent to call the tool safely. A minor omission is not specifying that the label must exist, but that is implicit in deletion operations.

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% for both required parameters, so the schema already explains project_id and label_id. The description's advice to 'provide the numeric ID or complete URL-encoded path described by the schema' repeats this information without adding new meaning. It also mentions 'project_id or group_id' even though group_id is not in the schema, slightly muddying parameter semantics. Overall, it adds little beyond the schema, justifying a baseline score 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 clearly states the action ('Delete a label from a project') with a specific verb and resource. It distinguishes from sibling tools like list_labels, get_label, create_label, and update_label by focusing exclusively on deletion and explicitly instructing to use get/list tools first for inspection. This makes the tool's 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 Guidelines5/5

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

The description provides explicit when-to-use 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 directly contrasts with inspection tools and sets a clear precondition. It also mentions permission requirements, giving further practical context for when it is appropriate to invoke.

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
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.3/5.0
Behavior5/5

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

Although destructiveHint is already true, the description adds valuable context: remote GitLab data may be changed or removed, the action may be irreversible, permissions are required, and specific error classes such as validation, conflict, permission, and rate-limit errors may be returned. This goes well 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 primary purpose and keeps safety guidance compact. The only slight weakness is the generic 'project_id or group_id' phrasing, since group_id is not present in this tool's schema, making that part mildly extraneous.

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 four-parameter operation with no output schema, the description covers usage timing, irreversibility, permissions, error behavior, and identifier formatting. It does not explicitly describe success behavior or distinguish itself from other note-deletion siblings, but it is otherwise well-rounded.

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 required parameters. The description adds only generic guidance about numeric IDs, URL-encoded paths, and exact identifier usage, which is helpful but does not add parameter-specific 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 opens with a direct, specific statement: 'Delete a discussion note on a merge request.' This clearly identifies the verb, resource, and scope. It also distinguishes this from related sibling note tools by naming the 'discussion note' target.

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 guidance to verify the target first and to use a get or list tool when inspection is needed rather than changing state. It could name specific sibling alternatives, but the general 'get or list' routing is clear and actionable.

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

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
project_idYesProject ID or complete URL-encoded path to project
merge_request_iidYesThe IID of a merge request

TDQS

A4.3/5.0
Behavior5/5

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

Annotations provide only destructiveHint and openWorldHint. The description goes well beyond: it warns that remote GitLab data 'may be irreversible,' states the permission requirement, and enumerates possible error classes (validation, conflict, permission, rate-limit). This is genuinely useful behavioral context consistent with the destructive 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 sentence order is effective: purpose, then usage guardrail, then destructive-safety and error context, then parameter reminder. While the final sentence is a bit boilerplate-heavy, every section earns its place and the core message 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 tool with three fully documented parameters and no output schema, the description covers safety, permission prerequisites, and error behavior. The only real gap is the absence of a statement about what a successful response looks like.

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 project_id, merge_request_iid, and award_id; the baseline is 3. The description's instruction about numeric IDs or URL-encoded paths mostly duplicates the schema's own text, and its mention of 'group_id' and 'pagination fields' does not match this tool's actual parameters. The added semantic value is minimal.

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-resource pair: 'Remove an emoji reaction from a merge request.' This clearly differentiates it from siblings like delete_merge_request_note_emoji_reaction and the create/list emoji reaction variants. The purpose is precise and immediately recognizable.

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 ('only after verifying the target') and instructs the agent to 'choose a get or list tool first' when needing to inspect state. This provides a clear when/when-not split, though it does not name a specific sibling such as list_merge_request_emoji_reactions as the verification tool.

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
project_idYesProject ID or complete URL-encoded path to project
merge_request_iidYesThe IID of a merge request

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already include destructiveHint and openWorldHint, but the description adds valuable context: dangerous irreversibility ('may be irreversible'), permission requirements, and specific error types (validation, conflict, permission, rate-limit). This goes beyond the simple destructive flag and helps the agent set expectations.

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, followed by caution and usage rules. It is free of fluff, and every sentence earns its place by conveying essential operational or safety 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 simple 3-parameter tool with no output schema, the description covers the key aspects: what it does, when to use it (and not), permissions, irreversibility, and error handling. It doesn't describe the return value, but with no output schema that is not required. The mention of pagination fields is slightly incongruous since the schema has none, but it does not harm completeness.

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% coverage with each parameter described ('The ID of a thread note', etc.), so the baseline is 3. The description adds no new parameter-specific meaning, only a generic reminder to provide numeric IDs or URL-encoded paths exactly as documented, which merely echoes 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 a specific verb and resource: 'Delete an existing merge request note.' This clearly distinguishes it from sibling tools like get_merge_request_note (read) and create_merge_request_note (create). The scope is precise and 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?

The description explicitly advises using get or list tools first when inspection is needed, which frames when not to use this tool. It also mentions verifying the target before deletion, providing clear conditional guidance. It doesn't name specific alternatives like delete_merge_request_discussion_note, but the cautionary context is sufficient.

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
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.7/5.0
Behavior5/5

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

Beyond the annotations (destructiveHint), the description details the destructive nature: '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.' This adds important behavioral context not covered by annotations alone.

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 somewhat verbose but well-structured, starting with the core action, then parameter nuances, usage guidance, and consequences. Each sentence adds necessary information, though some redundancy with schema descriptions could be trimmed. It is appropriately sized for the tool's complexity.

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 there is no output schema, the description covers all necessary aspects: purpose, usage, parameters, permissions, and error types. It is complete for an agent to understand when and how to invoke the tool correctly without additional context.

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

Parameters5/5

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

The description adds value beyond the schema by clarifying when discussion_id is needed ('Pass discussion_id for discussion thread replies') and the format for project_id ('provide the numeric ID or complete URL-encoded path described by the schema'). It also emphasizes using required identifiers and pagination fields correctly, which is useful.

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 specific action: 'Remove an emoji reaction from a merge request note.' It also distinguishes this from other note-related tools by specifying the context and the necessary parameters like discussion_id for thread replies.

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 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.' It also mentions passing discussion_id for thread replies, giving a clear condition. However, it does not explicitly compare with alternative delete tools for other resources, but the naming clarifies the scope.

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.

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already provide readOnlyHint=true-does not say 'is a read-only operation' in description. The description adds that the effect is scoped to the session tool registryrix, that categories are listed in the response, and that GitLab data is untouched. This is useful beyond the annotations, though it doesn't clarify failure modes like invalid category names or whether activation is idempotent.

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 compact paragraph with every sentence earning its place: core action, parameter semantics, usage trigger, side-effect scope, and response content. No filler.

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 tool with one optional parameter and no output schema, the description covers what the agent needs: available category examples, how to discover vs activate, what the response includes, and the safety boundary. Nothing important is missing.

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

Parameters4/5

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

Schema coverage is 100% with one optional string parameter. The description adds critical semantics: omitting the parameter lists available categories, while providing it activates that category. That usage nuance goes beyond the schema and meaningfully guides the agent.

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+resource pair: 'Discover and activate additional tool categories for this session.' It clearly differentiates this from the GitLab data-operation siblings by framing it as session tool management.

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 it ('when a needed opt-in category is not currently exposed') and precisely explains the two invocation modes: omit `category` to list, or provide it to activate. This gives an agent direct decision criteria for when this tool beats the 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
local_pathNoLocal path to save the file (optional, defaults to current directory)
project_idYesProject ID or URL-encoded path of the project

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 and openWorldHint=true, so the description doesn't need to restate read-only. It adds valuable behavior: images returned as base64 in remote mode, local_path saves to disk, requires project access, and returns content or an attachment/permission error. It does not contradict annotations. Slight gap: no detail on what happens if filename is not found, but the error mention covers it partially.

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 at a few sentences, front-loads the core purpose and the key base64 detail, and avoids redundancy. The mode explanation is useful but slightly repetitive; still, every 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 (download with modes and error handling) and that there is no output schema, the description covers the key aspects: what it does, the modes, the read-only nature, and required access. It doesn't detail the exact response structure beyond base64/URL, but that's acceptable for a download tool with a simple return. The openWorldHint annotation implies permissions might vary, and the description mentions 'requires project access' to complement 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 schema already documents all four parameters including local_path's optional behavior. The description adds meaning by explaining the mode distinction (remote vs local) that ties into project_id and filename, but doesn't add syntax or format details 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 clearly states the tool downloads an uploaded file from a project, and distinguishes it from related operations like upload_markdown or get_file_contents. It specifies the read-only nature and the different behaviors in remote vs local mode, making it distinct from siblings in the project/file domain.

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 explains when to use it: 'to retrieve a previously uploaded project attachment.' It also contrasts remote mode (returns inline base64 or download URL) with local mode (saves to path), providing practical context. However, it does not explicitly mention when NOT to use it or name alternative tools like get_file_contents for repository files, though the focus on 'uploaded attachments' implies that distinction.

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
namespaceNoNamespace to fork to (full path)
project_idYesProject ID or complete URL-encoded path to project

TDQS

A4.7/5.0
Behavior5/5

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

The annotations only provide openWorldHint, so the description carries the burden of behavioral disclosure. It clearly states the operation creates a new project, requires fork permission, and returns either the forked project or a namespace/permission error. This gives the agent important information about side effects, authorization requirements, and error behavior 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.

Conciseness5/5

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

The description is three sentences with no waste: the action is front-loaded, the alternative tools are named in the second sentence, and the third provides essential behavioral context. Every sentence earns its place and the structure is easy to scan.

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 two-parameter tool with no output schema, the description covers the core need: what the tool does, when to use it, what side effects occur, what permission is required, and what return/error behavior to expect. An agent has enough context 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%, with both parameters already documented: namespace is 'Namespace to fork to (full path)' and project_id is 'Project ID or complete URL-encoded path to project.' The description adds only marginal context like 'permitted namespace' and 'current user's namespace,' but does not add significant meaning beyond the schema. 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 a specific verb and resource: 'Fork a project to your account or specified namespace,' which clearly identifies the operation. It also distinguishes itself from siblings by noting that search_repositories and get_project are for inspecting without copying, so an agent can tell this tool apart 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?

The description explicitly states when to use this tool (to create a copy of an existing project) and names alternatives for when not to use it: use search_repositories or get_project to inspect projects without copying them. This gives clear routing guidance that leaves nothing to inference.

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
project_idYesProject ID or complete URL-encoded path to project
branch_nameYesName of the branch

TDQS

A3.9/5.0
Behavior4/5

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

It explicitly states the tool is read-only and does not mutate GitLab data, consistent with readOnlyHint. It also discloses concrete error behaviors (missing resources, invalid identifiers, insufficient permission, rate limits) that are not present in the annotations, adding valuable transparency.

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 front-loaded and concise, but the later sentences contain boilerplate about group_id and pagination that are irrelevant to this specific tool. The description could be tighter without losing necessary 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 simple getter with two required parameters and no output schema, the description covers the invocation context, safety profile, error behavior, and return-field hints. It is sufficiently complete for an agent to call the tool correctly and understand what to expect.

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 baseline 3 applies, but the description adds no new parameter meaning beyond the schema. It mostly repeats the project_id wording and includes a generic reference to group_id and pagination fields that do not apply to this two-parameter tool, which is slightly 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?

The first sentence names a specific verb and resource ('Get branch details') and identifies the key fields returned (commit, protection status). It also distinguishes itself from discovery tools by stating it is for a known resource, separating it clearly from siblings like list_branches and get_protected_branch.

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 this tool ('for a known resource or result') and when to prefer list/search tools (for discovering multiple resources). It does not name the exact sibling tool, e.g., list_branches, but the decision rule is clear and actionable.

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

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
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

A3.9/5.0
Behavior4/5

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

Annotations already include readOnlyHint=true, and the description reinforces this by stating 'read-only' and adding error behavior: missing resources, invalid identifiers, insufficient permission, and rate limits returned as errors. This provides useful context beyond the annotation 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.

Conciseness4/5

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

The description is moderately sized with purpose, usage, behavior, and parameter guidance in four sentences. It is mostly front-loaded and every sentence contributes value, though the final sentence's 'exactly as documented' is mildly redundant, so it is not maximally tight.

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, the description covers purpose, usage boundaries, read-only behavior, error conditions, and parameter handling. There is no output schema, but the tool's return values are fairly predictable from the name; the absence of explicit return-format details is a minor gap, not a blocking 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 all parameters are documented in the schema. The description adds a generic note about providing project_id as a numeric ID or URL-encoded path, but it mostly restates what the schema already offers and does not add per-parameter meaning beyond that 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?

The description opens with 'Get diffs between two branches or commits', a specific verb and resource. It also adds a scoping clue by contrasting with list/search tools, though it does not name sibling diff tools like get_commit_diff or list_merge_request_diffs, so differentiation is clear but not fully explicit.

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 ('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 offers a clear exclusion but does not name specific alternative tools, so it stops short of maximum explicitness.

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.
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.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and openWorldHint. The description reinforces the read-only nature ('It is read-only and does not mutate GitLab data') and adds transparency about error responses (missing resources, invalid identifiers, insufficient permission, rate limits are returned as errors). This goes beyond the annotations by detailing failure modes, so while the annotations lower the bar, the description adds meaningful 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 description is concise, with two sentences that front-load the purpose and usage. It efficiently covers read-only status, error conditions, and a general identifier/pagination note. The final sentence about `project_id`/`group_id` is slightly off-topic and could be removed, but overall it is well-structured and not verbose.

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?

Since there is no output schema, the description does not need to explain return values. It adequately covers error handling (missing resources, invalid identifiers, insufficient permission, rate limits) and mentions pagination fields. It does not elaborate on component or version limits beyond the schema, but those are self-explanatory. The description is sufficiently complete for a read-only getter with known parameters.

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% (each parameter has a description), so the baseline is 3. The description does not add significant semantic information beyond the schema. It includes a generic note about 'use required identifiers and pagination fields exactly as documented' but this is redundant with the schema descriptions. The mention of `project_id` or `group_id` is confusing because these are not actual parameters in this tool, but it does not clarify the inputs further.

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: 'Get details for a GitLab CI/CD Catalog resource, including versions and components.' It also distinguishes it from the list tool by specifying when to use it: 'Use this for a known resource or result; choose the corresponding list or search tool when you need to discover multiple resources.' This makes the purpose unambiguous and differentiates it from siblings like 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?

The description explicitly provides usage guidance: 'Use this for a known resource or result; choose the corresponding list or search tool when you need to discover multiple resources.' It also notes the tool is read-only and mentions error conditions (missing resources, invalid identifiers, insufficient permission, rate limits). This gives clear direction on when to invoke 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.

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
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, and the description reinforces it while adding concrete error behavior: missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. This is valuable beyond the annotation, though it does not describe success payloads.

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, front-loads the core action, and keeps usage guidance brief. However, it contains some redundancy ('read-only' vs 'does not mutate') and an irrelevant mention of group_id not present in the schema, which prevents a top 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?

For a single-commit retrieval tool with a complete schema and read-only annotations, the description provides enough context: purpose, usage, identifier format, and error handling. It doesn't explain the return shape, but that is permissible without an output schema. The optional stats parameter is left to the schema, which 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 coverage is 100%, so the description is not obligated to repeat parameter meanings. It does add a note about providing numeric ID or URL-encoded path, but that closely mirrors the schema description for project_id. The generic instruction to use identifiers and pagination fields 'exactly as documented' adds little 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 a specific verb and resource ('Get details of a specific commit') and explicitly distinguishes itself from list/search tools by saying to use those for discovery. This differentiates it from siblings like list_commits and get_commit_diff.

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 known resource or result; choose the corresponding list or search tool when you need to discover multiple resources.' This clearly routes the agent to alternatives, satisfying the requirement.

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
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.1/5.0
Behavior4/5

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

Building on the readOnlyHint annotation, the description adds that the tool does not mutate GitLab data and details error behavior for missing resources, invalid identifiers, insufficient permission, and rate limits. This is useful context beyond the structured annotations, though it does not describe the return payload.

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 and the description is only four sentences, each adding information. The final sentence is somewhat boilerplate and could be tightened, but nothing is redundant enough to hurt clarity.

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 small read-only tool with full schema coverage and no output schema, the description covers use case, mutation safety, and error behavior comprehensively. It is complete enough for an agent 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?

The schema already documents all three parameters (100% coverage), so the description needs to add little. It adds the practical note about numeric IDs or URL-encoded paths, but the group_id mention does not match the schema and no new per-parameter semantics are provided.

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 changes/diffs of a specific commit'), and clarifies scope by contrasting with list/search tools for discovering multiple resources. This distinguishes it from siblings like list_commits and get_commit without requiring 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?

It explicitly states to use this when a specific resource/result is already known and to switch to a list or search tool for discovery. It names a category of alternatives rather than specific sibling tools, but the when/when-not guidance is clear.

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
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.0
Behavior4/5

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

The read-only claim duplicates readOnlyHint, but the description adds useful error semantics: 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.

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 and readable, with purpose and usage appearing early. However, the final sentence contains boilerplate about group_id and pagination fields that do not apply to this tool's schema, adding noise and diminishing 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 single-resource getter with three required identifiers, the description sufficiently covers when to use it, its read-only nature, and error behavior. No output schema exists, but the missing return-format details are a minor gap for a straightforward draft-note retrieval.

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 the three parameters. The description mostly repeats the URL-encoded path guidance and adds generic instruction about pagination fields, which are not present in this schema. It provides little 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?

States a specific verb and resource: 'Get a single draft note from a merge request.' It also distinguishes itself from list/search tools by positioning this as the option for a known resource or result, which separates it from siblings 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 Guidelines4/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 and to choose the corresponding list or search tool when discovery is needed. It does not name a specific sibling such as list_draft_notes, but the selection rule is clear and actionable.

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

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)
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.3/5.0
Behavior4/5

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

Annotations already convey readOnlyHint=true, so the safety profile is covered. The description adds meaningful behavioral detail beyond the schema by explaining the return shape: each entry maps a contiguous source-line range to the commit that last changed them, including id, author, authored_date, and message. This is especially valuable given there is no output schema.

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

Conciseness5/5

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

The description is two sentences with no filler. The core purpose and output structure are front-loaded in the first sentence, and the optional line-range usage is clearly stated in the second. 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 read-only operation with fully documented parameters and readOnlyHint/openWorldHint annotations, the description covers what an agent needs: the purpose, the returned data shape, and the optional range restriction. The absence of an output schema is compensated by the explicit entry structure in the description.

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 required fields and the paired constraint on range_start/range_end. The description reiterates that range_start/range_end limit blame to specific lines, but does not add substantial new meaning 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 states a specific verb, resource, and operation: 'Get git blame for a file at a given ref.' The phrase 'git blame' clearly distinguishes it from sibling file-related tools like get_file_contents or get_repository_tree, since no other tool claims to map lines to commits.

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 clear context: it retrieves blame for a file at a ref, and explains how to scope the operation with range_start/range_end. It does not explicitly name alternative tools or when-not-to-use this tool, but the unique blame semantics make the proper use clear enough.

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
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.7/5.0
Behavior4/5

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

Beyond the readOnlyHint annotation, the description specifies that it does not mutate data and lists common error conditions (missing resources, invalid identifiers, insufficient permission, rate limits), giving 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.

Conciseness5/5

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

The description is compact, with the core purpose stated first, followed by targeted usage guidance and error behavior. No redundant or tangential information is present.

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 get operation with no output schema, the description covers purpose, usage, error conditions, and parameter guidance adequately. The schema's mention of 'file_path' precedence is present, so no critical gaps exist.

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?

While the schema already includes descriptions for each parameter, the description adds guidance on how to provide identifiers (e.g., numeric ID or URL-encoded path) and mentions using required identifiers and pagination fields, which adds practical usage context.

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 'get' and the resource 'contents of a file or directory from a GitLab project', and explicitly contrasts with list/search tools for discovery, making the 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 Guidelines5/5

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

It explicitly instructs to use this tool when the resource is known, and to choose list/search tools for discovery, providing clear decision criteria relative to sibling tools.

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
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.2/5.0
Behavior4/5

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

Beyond the readOnlyHint annotation, it discloses issue read permission, error behavior for invalid/missing identifiers or denied access, and the default slim response versus full_response mode. The 'milestone' wording is slightly inconsistent with the issue-focused schema, so transparency is high but not flawless.

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 cover purpose, response modes, usage context, permissions, and error behavior with no filler. It avoids duplicating the schema's parameter details.

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, the description covers default versus full response, error cases, permission requirements, and read-only status, which is enough for an agent to call and interpret the result. The main shortcoming is the ambiguous 'milestone' versus 'issue object' wording in the response-mode sentence.

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 three parameters are already described in the schema, so the description adds little new parameter-level meaning. It only restates that full_response=true yields a larger response, which is already implied by 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 a specific verb and resource: 'Get details of a specific issue' and reinforces that it is for inspecting a single issue's fields. It also distinguishes itself from the listing siblings by telling the agent to use list_issues or my_issues for discovery first.

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 — to inspect one issue's fields — and which alternatives to use first for discovery. It does not contrast it with update/delete siblings, but the read-only statement makes the non-mutating usage clear.

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
label_idYesThe ID or title of a project's label
project_idYesProject ID or URL-encoded path
include_ancestor_groupsNoInclude ancestor groups

TDQS

A4.3/5.0
Behavior4/5

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

The description notes it is read-only and that errors (missing resources, invalid identifiers, insufficient permission, rate limits) are returned as errors. This adds context beyond the readOnlyHint annotation and aligns with the openWorldHint, though it does not detail how these errors are surfaced. 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 concise and front-loaded with the core purpose. Each sentence adds value: purpose, usage distinction, and parameter notes. Slightly repetitive in mentioning error scenarios, but no filler or irrelevant content.

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 100% schema description coverage and no output schema, the description adequately covers identification and usage. It adds essential notes on formatting and error conditions. It could optionally mention what the returned label object contains, but this is not required since no output schema exists and the schema covers input.

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 100% of parameters with descriptions, so baseline is 3. The description adds minimal extra value—only reaffirms 'numeric ID or URL-encoded path' for project_id and mentions label_id can be ID or title, but this is mostly restating schema information.

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?

Clearly states 'Get a single label from a project' with a specific verb and resource. It also explicitly distinguishes this from sibling list/search tools ('choose the corresponding list or search tool when you need to discover 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 Guidelines5/5

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

Provides explicit guidance on when to use: 'for a known resource' vs. alternatives ('list or search tool'). Also instructs on required parameters and how to format them ('numeric ID or complete URL-encoded path'), which directly aids tool selection and invocation.

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
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.8/5.0
Behavior4/5

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

Annotations already include `readOnlyHint`, and the description reinforces this by stating 'It is read-only and does not mutate GitLab data.' It also discloses error cases (missing resources, invalid identifiers, insufficient permission, rate limits). While it does not describe the return structure, that is not expected without an output schema. The added error handling goes beyond the annotations, meriting a score above baseline.

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 concise yet informative, with each sentence serving a purpose. It covers purpose, usage, behavior, and parameter hints without redundancy. The structure flows logically from what the tool does, to when to use it, to its side effects and error handling. No unnecessary wording.

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 that there is no output schema, the description adequately fills the context gap. It explains when to use the tool (known resource), the optional parameter's effect, read-only behavior, and error conditions. It also references sibling list/search tools appropriately. This is sufficient for an agent to decide and execute the call correctly.

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

Parameters5/5

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

All four parameters have clear descriptions. `project_id` specifies both ID and URL-encoded path, `source_branch` is identified as a branch name, `include_summaries` explains the consequences of setting it true, and `merge_request_iid` is defined as the IID. Since schema coverage is 100% and descriptions add meaningful context, this fully informs the agent about 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 tool's function: 'Get details of a merge request' (verb + resource). It also explicitly distinguishes it from list/search tools: 'Use this for a known resource or result; choose the corresponding list or search tool when you need to discover resources.' This makes the 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 Guidelines5/5

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

The description provides explicit when-to-use guidance: it tells when to use this tool versus alternatives (known resource vs. discovery). It also explains the optional parameter `include_summaries` and its trade-off, and mentions read-only behavior and error conditions, giving the agent clear direction on invocation.

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
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 already declare readOnlyHint, and the description reinforces that with 'It is read-only'. Beyond annotations, it adds valuable behavioral detail: missing requests, unsupported GitLab versions, and permission failures are reported as errors. It also states the return type ('approval-state response'), which is useful given no output schema. This goes beyond what annotations provide, though it could specify the response structure more concretely.

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: purpose, usage guidance with alternative, and behavioral/error notes. It is concise, front-loaded with the core purpose, and every sentence contributes meaningful information without redundancy.

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

Completeness4/5

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

For a read-only tool with two parameters and no output schema, the description covers purpose, usage context, error handling, and read-only nature. It is mostly complete, but the vague 'returns the approval-state response' leaves the exact shape of the response unspecified. Still, the given information supports correct invocation and decision-making, so it earns a 4.

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 covers 100% of parameters with descriptions for both `project_id` and `merge_request_iid`. The description adds no additional meaning or usage hints for these parameters, so it provides no value beyond what the schema already offers. Baseline for high coverage is 3, and there is no extra contextual clarification.

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 retrieves merge request approval details including approvers. It uses a specific verb 'Get' and resource, and distinguishes itself from the sibling `approve_merge_request` by noting it inspects rather than changes approval state. This makes the 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 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 inspect approval rules and approvers before deciding whether a merge request can be merged, and points to `approve_merge_request` as the alternative for changing state. This gives clear when-to-use and when-not-to-use guidance, directly addressing the decision context.

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
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?

The description aligns with the readOnlyHint annotation by stating 'It is read-only'. It adds value beyond the annotation by explaining error behavior ('returns ... an error when the request cannot be evaluated') and clarifying that conflicts are not resolved. This gives the agent a fuller picture of what 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.

Conciseness5/5

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

The description is two concise sentences that front-load the purpose, then immediately follow with usage and behavioral notes. Every sentence adds meaningful information without redundancy or 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?

Given that this is a simple read-only lookup tool with no output schema, the description covers the essential context: purpose, usage timing, access requirements, and error behavior. The agent has enough to call it correctly 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% — both parameters (`project_id` and `merge_request_iid`) are already clearly described. The tool description adds no further parameter-specific context, so it meets the baseline but does not exceed 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 states a clear verb ('Get') and resource ('conflicts of a merge request'), and immediately distinguishes it from the sibling tool `merge_merge_request` by noting it reports conflicts and does not resolve them. This leaves no ambiguity about the tool's function.

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 instructs to use this tool 'before attempting `merge_merge_request`' and clarifies that it does not resolve conflicts, which guides the agent on when to choose this over the merge tool. It also mentions the requirement of project and merge request access, providing additional context for invocation.

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
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.5/5.0
Behavior4/5

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

Annotations already mark readOnlyHint; the description reinforces read-only behavior and adds useful disclosure that missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. This goes beyond the structured annotations without contradicting them. It does not describe return shape or volume, so it is not a 5.

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 and the description is reasonably short. However, it contains boilerplate like 'use required identifiers and pagination fields exactly as documented' and a read-only restatement that duplicates structured annotations, plus an unsupported group_id mention.

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, error behavior, identifier format, and read-only safety, which is solid for a read-only tool with no output schema. It is less complete because the required-parameter statement conflicts with the schema and the return value shape is left entirely implicit.

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 even without parameter info. The description's extra advice is partly inaccurate: it claims mergeRequestIid or branchName is required, while the schema requires only project_id, and it mentions group_id and pagination fields that are not present. This active mismatch makes the description less useful than 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?

The opening clause names the operation and resource precisely: 'Get the changes/diffs of a merge request'. It also scopes the tool to known resources, which distinguishes it from list/search discovery tools. It never names a specific sibling like get_merge_request_file_diff, so it stops short of 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?

The description explicitly says to use this when the resource is known and to choose a list or search tool for discovery. This provides clear usage context. However, it does not enumerate the closest diff-specific siblings, and some identifier guidance conflicts with the schema, making the guidance not fully reliable.

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
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.4/5.0
Behavior4/5

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

The description states read-only behavior, matching the readOnlyHint annotation, and goes beyond annotations by specifying error outcomes: invalid identifier, missing discussion, or insufficient permission. It does not detail the response shape, but the error semantics add useful operational context.

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

Conciseness5/5

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

Three short sentences: purpose, usage/alternative routing, and behavior/errors. The most important scoping information is front-loaded and 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?

For a simple 3-parameter read-only tool with no output schema, the description covers selection, invocation context, and likely error cases. It does not describe the discussion item structure, but that is not necessary 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 coverage is 100% and each parameter already has a clear description (project ID or encoded path, thread ID, MR IID). The tool description adds little beyond saying the discussion is fetched 'by discussion identifier,' so the schema carries the parameter-meaning 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 opening clause 'Get a single discussion item for a merge request' names a specific verb, resource, and singular scope. It further clarifies the target by contrasting with `mr_discussions` (collection) and `get_merge_request_note` (flat note), making the tool distinguishable 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?

It explicitly says to use this tool for 'one known merge request discussion by discussion identifier' and directs the agent to `mr_discussions` for a collection and `get_merge_request_note` for a flat note. This is direct when/when-not guidance with named alternatives.

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.
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

A4.4/5.0
Behavior5/5

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

Although the annotations already declare readOnlyHint and openWorldHint, the description adds valuable context about error behavior (missing resources, invalid identifiers, insufficient permission, rate limits) and parameter format (numeric ID or URL-encoded path). This goes beyond the annotations and clarifies expected outcomes and edge cases.

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 concise, structured in two sentences, and each clause serves a purpose: purpose, usage guidance, error behavior, and parameter guidance. There is no unnecessary verbosity; it is well-organized and easy to parse.

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 tool's purpose, usage context, error scenarios, and parameter format, which is comprehensive for a typical read-only operation. However, the contradiction regarding required fields slightly reduces completeness, as it may confuse the agent about the exact invocation requirements. Overall, it is nearly complete but not perfect.

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 descriptions cover 100% of parameters, but the description introduces a contradiction: it states 'mergeRequestIid or branchName required' while the schema only marks project_id and file_paths as required. This conflicting guidance could mislead the agent regarding which parameters are mandatory. The general advice about ID/path format adds little beyond the schema, and the contradiction undermines clarity.

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: 'Get diffs for specific files from a merge request.' It also distinguishes it from sibling tools by advising to use this for a known resource and to choose list/search tools for discovery. The verb and resource are specific, and the scope is well-defined.

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 when to use and when not to use the tool: 'Use this for a known resource or result; choose the corresponding list or search tool when you need to discover multiple resources.' This is clear, actionable guidance that differentiates it from alternatives.

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
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 value beyond the annotations by disclosing the return behavior (note object) and error conditions (invalid identifier, missing note, insufficient permission). This gives the agent a realistic picture of outcomes.

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: first states the core action, second gives routing guidance for alternatives, third discloses behavior and failure modes. Every sentence earns its place and the most important selection information 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 simple, read-only single-resource fetch with fully documented parameters and readOnly/openWorld annotations, the description is complete. It covers what the tool does, when to use it, what it returns, and what errors to expect. No output schema exists, but the description adequately describes the result shape.

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 for all three parameters, so the description does not need to restate them. It does add the context that the note is fetched 'by note identifier,' which lightly reinforces note_id, but overall it adds no significant parameter meaning beyond the already-complete 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 verb and resource: getting a specific note for a merge request by identifier. It also differentiates from sibling tools by explicitly naming get_merge_request_notes and mr_discussions, so an agent can quickly disambiguate this tool from its closest 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?

It provides explicit usage guidance: use this tool to fetch one known merge request note, use get_merge_request_notes for a collection, and use mr_discussions for threaded context. This directly tells the agent when to choose this tool versus the alternatives.

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
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 mark readOnlyHint, and the description adds that it 'returns note records' and that errors are reported by GitLab. This gives useful behavioral context beyond the annotation, though it does not detail pagination behavior or output structure.

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 fluff. The first sentence states the core purpose, the second gives usage guidance and behavioral notes. Information is front-loaded and each 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?

For a list operation with 6 parameters, annotations covering read-only, and no output schema, the description covers purpose, alternative selection, and error behavior. It does not describe the exact note record fields, but that is minor given the schema and clear naming. Overall it provides sufficient context 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 six parameters (project_id, merge_request_iid, page, per_page, sort, order_by) are already documented in the schema. The tool description adds no extra parameter-specific meaning, matching the baseline for high 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 'List notes for a merge request' and explicitly distinguishes itself from `mr_discussions` by noting it returns flat notes while the sibling handles thread structure and resolution state. This provides strong differentiation among many note-related 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?

It gives explicit when-to-use guidance: 'Use this to list flat notes on a merge request; use `mr_discussions` when thread structure and resolution state are required.' It also notes the tool is read-only, which is additional usage context.

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.
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.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. The description confirms the read-only nature and also discloses meaningful additional behavioral context: that missing resources, invalid identifiers, insufficient permission, and rate limits surface as errors. This adds auth/permission and rate-limit context well beyond the structured annotations, which is exactly the kind of enrichment the rubric rewards.

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 with each earning its place: purpose, usage, behavior, and parameters. The core function is front-loaded in the first sentence. A minor deduction for the final clause 'use required identifiers and pagination fields exactly as documented' which is vague filler — the schema has no pagination fields — making that sentence do less work than it could.

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 GET with 100% schema coverage and no output schema, the description covers the essentials: it tells the agent the identifier format expectations, confirms the operation is non-mutating, and spells out error conditions. The only gap is the misfiring pagination/group_id language that suggests a template copy-paste, but nothing critical is missing for an agent to call this 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 per the rubric. The description adds useful guidance that project_id can be a 'numeric ID or complete URL-encoded path', which genuinely helps invocation. However, the phrasing 'When project_id or group_id is accepted' references group_id — which is not a parameter in this schema — slightly muddying an otherwise clear instruction. Net value is modest, keeping it at 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 states a specific verb and resource — 'Get a specific version of a merge request' — and reinforces the narrow scope with 'for a known resource or result,' which clearly differentiates it from the discovery-oriented siblings like list_merge_request_versions or get_merge_request. An agent can immediately tell this is the single-version fetch, not the list or the diff tool.

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 when to use this tool — 'for a known resource or result' — and explicitly when not to: 'choose the corresponding list or search tool when you need to discover multiple resources.' This gives the agent a direct decision rule to select between this tool and its siblings without naming a specific one, which fully satisfies the when/when-not criteria.

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
namespace_idYesNamespace ID or full path

TDQS

A4.2/5.0
Behavior4/5

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

Beyond the readOnlyHint annotation, it spells out non-mutation ('does not mutate GitLab data') and enumerates error scenarios: missing resources, invalid identifiers, insufficient permission, and rate limits. This gives the agent a good model of failure behavior, though some of it repeats 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 compact and front-loaded, but contains some boilerplate that is not relevant to this tool, especially the project_id/group_id/pagination sentence. It earns a middle score: no waste overall but not tightly tailored.

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 one-parameter read-only lookup with no output schema, this description covers purpose, target resource, error behavior, and usage context. It doesn't enumerate the returned namespace fields, but 'details' plus existing examples make this 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 covers the only parameter 100%, so baseline is 3. The description adds 'numeric ID or complete URL-encoded path', which is useful, but the generic mention of project_id/group_id and pagination fields is confusing since only namespace_id exists 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?

The description states 'Get details of a namespace (user or group) by ID or path', with a specific verb and resource, and clarifies that groups are namespaces with kind='group'. This distinguishes it from broad list/search 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?

It explicitly says to use this tool for 'a known resource or result' and to choose the 'corresponding list or search tool' for discovery, giving clear when-to-use vs 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.

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
project_idYesProject ID or URL-encoded path

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already mark this read-only, but the description adds that it 'does not mutate GitLab data' and explains that missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. It does not contradict the readOnlyHint or openWorldHint annotations, but it could go further by describing the success response shape.

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 at four sentences, front-loading the core purpose and usage guidance. The final sentence contains boilerplate about 'group_id' and 'pagination fields' that does not apply to this single-parameter tool, a minor defect that prevents 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?

For a simple get-by-ID tool, the description covers purpose, when to use, side effects, and error behavior. The irrelevant mention of pagination fields and group_id is a blemish, but the essential information is present. It is adequate without being exhaustive.

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 project_id as 'Project ID or URL-encoded path' with 100% coverage. The description adds only that the 'numeric ID or complete URL-encoded path' should be provided, which slightly clarifies but essentially restates the schema. No new parameter semantics are added, so a 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 opening sentence 'Get details of a specific project' clearly states the verb and resource. The next sentence distinguishes it from list/search tools, and the sibling list confirms get_project is the singular lookup among list/search peers.

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 known resource or result') and points to alternatives ('choose the corresponding list or search tool when you need to discover multiple resources'). It also clarifies that it is read-only and how errors are surfaced, 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_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
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

A3.8/5.0
Behavior4/5

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

Annotations already provide readOnlyHint and openWorldHint, and the description reinforces that the operation is read-only and non-mutating. It adds value by stating that missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. That is useful behavioral context beyond what the annotations declare.

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, starts with the core purpose, and then layers usage guidance and error behavior in a small number of sentences. There is minor redundancy with the readOnly annotation, but the structure is efficient overall.

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, usage, and error behavior, which is fairly complete given the read-only annotation and parameter-documented schema. However, the group_id reference with no matching schema parameter and the absence of any output-format details for the listed events leave a few ambiguities 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?

The input schema covers all 8 parameters with detailed descriptions, so the schema carries the documentation burden. The description only adds generic reminders about identifiers and pagination. It also mentions group_id, but the schema does not include a group_id parameter, which is a slight inconsistency.

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 starts with a clear verb and object: 'List events for a project'. It adds filtering context with before/after dates and positions this tool as one for a known resource or result. However, it does not distinguish itself from the sibling list_events or search tools by name, so it is clear but not maximally differentiated.

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 tells the agent to use this tool for a known resource or result and to choose a corresponding list/search tool when discovering multiple resources. This is strong usage guidance, but the alternative tools are not named, leaving some inference required.

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
project_idYesProject ID or complete URL-encoded path to project
branch_nameYesName of the protected branch

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 is read-only and does not mutate GitLab data'. It also discloses error conditions ('missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors'), which is valuable context beyond annotations. The only minor gap is absence of detail on response format, but with no output schema and openWorldHint, 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?

Three sentences, each with a distinct purpose: what it does, when to use, and behavior/parameter guidance. It is front-loaded with the core purpose. The parameter guidance sentence is a bit long but necessary. Could be slightly more concise, but overall 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?

Given the tool is a simple read operation with only 2 parameters and annotations cover safety, the description provides sufficient context: purpose, usage boundaries, error behavior, and parameter format. It doesn't meet full 5 because it doesn't specify output structure (e.g., current access levels format), but that is not critical for this 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 both parameters are already documented. The description adds guidance on providing 'numeric ID or complete URL-encoded path' for project_id, which is useful but incremental. It doesn't add new semantics for branch_name 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 tool's purpose: 'Get details of a single protected branch (access levels, force push settings)'. This is a specific verb-resource pair that distinguishes it from sibling tools like 'list_protected_branches' and complements 'protect_branch'/'unprotect_branch'.

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 'Use this for a known resource or result; choose the corresponding list or search tool when you need to discover multiple resources.' This provides clear when-to-use and when-not-to-use guidance and names the alternative class of tools.

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
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

A3.9/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 concrete 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.

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 main purpose is front-loaded, and the description is compact. The sentence about project_id/group_id is somewhat redundant with the schema, but overall the text is well-structured and each sentence contributes to usage or behavior.

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 listing tool, the description covers purpose, usage context, error behavior, and pagination guidance. There is no output schema, so a bit more detail about the success response shape would help, but the schema's pagination field description partially fills 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 description coverage is 100%, so the baseline is 3. The description mostly restates schema guidance about numeric IDs, URL-encoded paths, and pagination. It adds little new parameter-level meaning and even mentions group_id, which is not a parameter in this schema, creating minor ambiguity.

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 and resource ('List files and directories in a repository') and clarifies that it is for a known resource rather than discovery. It distinguishes from list/search tools generically, but does not name a specific sibling, so it is clear but not maximally specific.

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 the corresponding list or search tool when discovering multiple resources. This gives a clear when/when-not boundary, though it does not name concrete alternative tools.

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

TDQS

A3.8/5.0
Behavior4/5

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

Beyond the readOnlyHint annotation, it discloses that missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. This adds concrete behavioral context that the annotation alone does not convey. 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?

Front-loaded with the core purpose, but the latter half includes generic, non-applicable instructions (project_id/group_id, pagination) that bloat the description. It could be more concise by removing irrelevant clauses while retaining the essential error and usage info.

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?

Covers purpose, usage, read-only nature, and error handling, which is largely complete for a single-parameter get tool. However, the incorrect references to non-existent parameters and pagination introduce noise, reducing overall clarity and completeness for the agent.

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 covers user_id with 100% coverage, but the description falsely references `project_id`, `group_id`, and 'pagination fields' that do not exist in this tool's schema. This is misleading and could cause an agent to attempt invalid parameters, outweighing the minor clarification about numeric ID vs. URL-encoded path.

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?

Clearly states the verb-resource pair ('Get user details by ID') and explicitly distinguishes it from list/search tools for discovery. A 'known resource or result' is contrasted with multiple-resource discovery, leaving no ambiguity about its role among 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?

Provides explicit guidance: use for a known resource, choose list/search for discovery, and follow the documented identifiers. However, the misleading clause about 'project_id or group_id is accepted' and 'pagination fields' is inapplicable to this tool (only user_id exists), which introduces slight confusion despite the primary guidance being sound.

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
usernamesYesArray of usernames to search for

TDQS

A4/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 valuable specifics: it confirms read-only behavior, lists error conditions (missing resources, invalid identifiers, insufficient permission, rate limits), and notes that these return as errors. This goes beyond the annotation's boolean by explaining expected 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.

Conciseness3/5

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

The description is front-loaded with purpose and usage, but contains redundant statements (e.g., read-only repeats the annotation) and an entire second half about non-existent parameters. It could be trimmed to the first two sentences; the trailing clause about project_id/group_id is irrelevant and wastes attention.

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 one parameter and read-only annotations, the description covers purpose, usage, and error handling. However, it omits any description of the return payload (no output schema exists), and includes extraneous parameter guidance that detracts from completeness. The irrelevant tail leaves the agent uncertain about actual inputs, so completeness is partial.

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 is 100% covered with 'Array of usernames to search for', which is clear. However, the description references 'project_id'/'group_id' and 'pagination fields' that do not exist in the input schema, introducing misleading information. This actively confuses the agent rather than adding value, so despite high schema coverage the description detracts.

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 ('Get GitLab user details by usernames') and the specific resource type. It differentiates from discovery tools by explicitly directing users to 'list or search tools' when they need to discover multiple resources, which distinguishes this targeted lookup from sibling search/list 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 when-to-use guidance ('Use this for a known resource or result') and when-not-to-use ('choose the corresponding list or search tool when you need to discover multiple resources'). It also instructs on using identifiers and pagination fields exactly as documented, giving clear operational direction.

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

No parameters

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, the description discloses conditional behavior (reports mcp_server_version always, GitLab version only when authenticated), failure tolerance (version lookup failures omit fields without failing the check), and explicitly states it does not mutate GitLab state. This adds significant context about runtime behavior and edge 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 moderately sized but well-structured: purpose first, then concrete behavioral details, usage guidance, and a no-mutation note. Each sentence contributes useful information; the only minor inefficiency is the final sentence partially repeating earlier points about status and version details.

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

Completeness5/5

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

For a zero-parameter health check with no output schema, the description is remarkably complete: it specifies what fields are always returned, what is conditionally returned, how failures are handled, when to use it, and that it is non-mutating. An agent has everything needed to invoke it correctly and interpret results.

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 has zero parameters)Skip and 100% coverage trivially, so the baseline is 4. The description adds no parameter-specific detail because there are none, but it implicitly confirms the tool takes no arguments while explaining what the returned status reports cover.

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 ('Verify') and resource ('server status and authentication'), and explicitly differentiates from sibling `whoami` by noting the health check serves connectivity/auth verification rather than identifying the user. This leaves no ambiguity about the tool's core function.

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 instructs when to use the tool ('before making GitLab requests') and when to prefer the alternative (`whoami` when the authenticated user's identity is the goal). This direct when/when-not guidance is exactly what an agent needs for tool selection.

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
per_pageNoNumber of items per page (max: 100, default: 20)
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?

The description goes beyond the readOnlyHint annotation by explicitly stating the tool does not mutate GitLab data and that missing resources, invalid identifiers, insufficient permission, and rate limits surface as errors. This gives an agent useful expectations without contradicting 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 first two sentences are strong and front-loaded, but the final sentence is boilerplate that largely repeats schema guidance and introduces an irrelevant `group_id` condition. 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?

Given the read-only annotation, the error behavior disclosure, and full schema parameter coverage, the description is mostly complete for invoking the tool correctly. The main gap is the unnecessary group_id wording, but this does not block correct use when the schema is consulted.

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 only generic guidance about numeric IDs or URL-encoded paths and otherwise repeats what the schema says; the mention of `group_id` is potentially confusing since the 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?

The description states a specific verb and resource ('List branches in project') and includes a distinguishing note to use the corresponding get tool for a single known resource. This prevents confusion with 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 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 collection of resources and to choose the matching get tool when inspecting a single resource. However, it does not name the exact sibling tool or mention alternates like list_protected_branches, 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_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
group_idsNoFilter to catalog resources in these group IDs
verification_levelNoFilter by verification level

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, so the read-only claim is partially redundant. However, the description adds genuine value by enumerating error behaviors — missing resources, invalid identifiers, insufficient permission, and rate limits returned as errors — and by scoping results to what is 'visible to the user'. This is 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.

Conciseness4/5

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

Four sentences, front-loaded with the primary purpose and selection logic before behavioral and parameter notes. The final sentence is mild boilerplate but not wasteful; nothing essential is buried or padded.

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 an all-optional, 8-parameter list tool with no output schema, the description covers purpose, sibling routing, safety profile, error semantics, and parameter format guidance. The absence of return-shape details is excusable given no output schema exists; the openWorldHint and readOnlyHint annotations fill remaining gaps.

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 fully documents all 8 parameters and the baseline is 3. The description attempts to add guidance about numeric IDs vs URL-encoded paths, but references project_id and group_id which are not actual parameters in this schema (only group_ids exists), slightly diluting the value. The instruction to follow pagination fields 'as documented' adds little 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') and explicitly contrasts itself with the single-resource 'get tool', which in context is get_ci_catalog_resource. An agent can immediately tell this is the collection-list counterpart and distinguish it from its 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?

It gives explicit selection guidance: use this for a collection of resources, and 'choose the corresponding get tool when you already know the single resource to inspect.' This names the alternative and the decision condition, leaving little to inference.

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
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?

Although readOnlyHint already covers safety, the description adds useful error behavior: missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. Restating read-only is redundant, but the error disclosure 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 compact and front-loads purpose and selection guidance. The final sentence is somewhat boilerplate and the group_id mention adds noise, but overall the length is appropriate for the tool's complexity.

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 rich 100%-covered schema and readOnlyHint annotation, the description provides sufficient selection and error context. Minor gaps remain: no explicit return shape and the inaccurate group_id reference keep it from being 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 schema already documents every parameter. The description mostly restates the project_id guidance and adds a generic directive about pagination, but it also references `group_id`, which is not present in the schema; this is potentially misleading rather than additive.

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') and directly distinguishes the collection-style tool from the matching single-resource get tool. The phrase 'with filtering options' also situates it as a queryable list operation.

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 the tool for a collection of resources and to choose the corresponding get tool when a single resource is already known. This gives an agent a clear selection rule relative to siblings like get_commit.

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
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.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 and adds error conditions (missing resources, invalid identifiers, insufficient permission, rate limits). This adds context beyond the annotation 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.

Conciseness4/5

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

The description is concise, front-loads the purpose, and then gives usage guidance and error behavior. It avoids unnecessary verbosity, though the phrase 'use required identifiers and pagination fields exactly as documented' is slightly redundant with 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 list tool with 11 parameters and no output schema, the description covers the main usage decisions, error handling, and read-only nature. It does not describe the return format, but that is not critical for a list operation, and the schema documents all parameters.

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 well documented in the schema. The description adds only generic advice about providing numeric IDs or URL-encoded paths (already in schema) and using pagination fields, which does not significantly enhance 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 clearly states the tool lists commit statuses, which is a specific verb+resource. It distinguishes from single-resource get tools by saying 'choose the corresponding get tool when you already know the single resource to inspect,' providing a clear boundary with 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?

The description explicitly says when to use this tool versus a get tool, and gives guidance on required identifiers and pagination fields. This makes it easy for an agent to decide between this and alternatives.

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
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 adds that it is read-only, does not mutate data, and specifies error behaviors (missing resources, invalid identifiers, insufficient permission, rate limits). This adds context beyond 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 multi-sentence but each sentence serves a purpose: purpose, usage distinction, behavioral notes, and parameter guidance. It is structured and not overly verbose, though slightly long for only two parameters.

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 schema with full parameter descriptions and annotations covering safety, the description fully addresses purpose, usage, error handling, and parameter formatting. It does not specify return format, but that is acceptable for a list operation.

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 both parameters fully with descriptions, so the baseline is 3. The description adds guidance on formatting project_id as numeric ID or URL-encoded path and mentions using required identifiers and pagination fields, which is slightly redundant but offers a little extra clarity.

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 'List draft notes for a merge request' with a clear verb and resource. It explicitly distinguishes from get_draft_note by advising to choose the get tool when a single resource is known, which effectively differentiates it from a key 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?

It explicitly says 'Use this for a collection of resources; choose the corresponding get tool when you already know the single resource to inspect.' This provides clear when-to-use and when-not-to-use guidance, plus an alternative tool.

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
per_pageNoNumber of results per page. Default: 20
target_typeNoIf defined, returns events with the specified target type

TDQS

A4.3/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 data, which matches the readOnlyHint annotation, but it adds value by enumerating error conditions (missing resources, invalid identifiers, insufficient permission, rate limits). This goes beyond the annotation but does not describe return format, which is less critical.

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, with the purpose stated upfront. It includes necessary usage guidance but also contains a somewhat generic identifier instruction that may not be essential. Overall, it is well-structured and not overly verbose.

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 list operation with 8 parameters and no output schema, the description is sufficiently complete. It covers usage, error behavior, and parameter handling, though it could benefit from explicitly stating the return format (e.g., an array of events). The combination of schema and description provides enough context for an agent.

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 covers all parameters with detailed descriptions and enums (100% coverage). The description adds a generic note about providing project_id or group_id as numeric IDs or URL-encoded paths, but these parameters are not present in the schema, making the note potentially confusing. It adds minimal 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 description clearly states the tool lists events for the authenticated user with before/after date filters. It distinguishes itself by specifying it handles a collection of resources, contrasting with the corresponding get tool for a single resource. This makes the 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 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 get tool when a single resource is known. It also provides guidance on providing project or group IDs and pagination fields, giving clear when-to-use and when-not-to-use instructions.

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
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.3/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, the description explicitly states that it performs no mutation of GitLab data and enumerates the error conditions: missing resources, invalid identifiers, insufficient permission, and rate limits. This is exactly the behavioral context an agent needs before calling a list-type tool.

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, followed by supportive read-only and error context. The last sentence is somewhat generic boilerplate, but it doesn't add real bloat.

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 schema covers the parameters fully, there is no output schema, and the description supplies the essential usage distinction, safety guarantee, and error behavior. It does not describe the exact shape of the returned iteration objects, but that omission is acceptable 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 coverage is 100%, so the schema already documents all parameter behavior in detail. The description adds some identifier and pagination guidance, but it doesn't meaningfully enrich the filter semantics; the conditional mention of project_id is also slightly ambiguous for a tool whose schema accepts only group_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?

The description clearly names the operation ('List group iterations') and the resource type, and immediately frames it as the collection-oriented tool versus a single-resource get tool. This makes the tool easy to distinguish from the surrounding mutation and single-resource tools.

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 collection and to switch to the corresponding get tool when a single resource is known. However, it refers to the alternative generically rather than naming it, and no get_group_iterations tool appears among the visible siblings, making the routing slightly less actionable.

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
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.1/5.0
Behavior4/5

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

Explicitly states read-only behavior (reinforcing readOnlyHint) and enumerates error conditions: missing resources, invalid identifiers, insufficient permission, and rate limits. This adds useful behavioral 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?

Three sentences with the purpose front-loaded. The only minor bloat is a generic reference to project_id when only group_id exists, but it does not significantly distract.

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 read-only hint, schema, and error disclosure, the description covers what an agent needs to call the tool correctly. Return format isn't described, but no output schema exists and it's a list operation, so 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 covers all 7 parameters with descriptions (100% coverage), so the baseline is 3. The description adds little new info, only restating that IDs should be provided as numeric or URL-encoded per schema; the query param is already 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?

The description states a specific verb ('List'), a specific resource ('members of a GitLab group'), and mentions optional name/username search. It explicitly contrasts with 'get' tools for single-resource inspection, making it clearly distinguishable 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 Guidelines4/5

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

Provides an explicit usage rule: use for collections, choose the corresponding get tool when you already know the single resource to inspect. This gives clear context, though it does not name a specific sibling tool.

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
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/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 it while adding useful error behavior: missing resources, invalid identifiers, insufficient permission, and rate limits return errors. This goes beyond the structured 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.

Conciseness3/5

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

The description is front-loaded with purpose and overall reasonably sized. However, it contains some redundancy ('read-only' and 'does not mutate') and a generic closing sentence that mentions project_id even though the schema only exposes group_id, which slightly muddies 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 complex 27-parameter tool with no output schema, the description covers the key operational context: group/subgroup scope, collection-vs-single selection, read-only safety, error behavior, and identifier format. The remaining gaps are mostly covered by the detailed 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 coverage is 100%, so the schema already documents all 27 parameters. The description adds only generic guidance about numeric IDs/URL-encoded paths and using pagination fields exactly as documented, which is consistent with the schema but adds little 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?

Opens with a specific verb-resource-scope statement: 'List merge requests across all projects of a group and its subgroups.' This clearly identifies the operation and distinguishes it from single-resource retrieval tools by instructing to use the corresponding get tool when a single resource is known.

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 for a collection and to choose the corresponding get tool for a single known resource. It does not name the exact sibling tool (e.g., get_merge_request) or mention project-level list_merge_requests, so the guidance is clear 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_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
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

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 non-mutation with 'does not mutate GitLab data.' It adds useful error-behavior disclosure: missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. This goes beyond what the annotations alone 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?

Three sentences, each earning its place: purpose, usage differentiation, and important identifier/pagination behavior. It is front-loaded with the core purpose and contains no filler 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 18 parameters and no output schema, the description still covers the essential decision factors: what the tool lists, when to prefer it, safety profile, error behavior, and identifier format. All parameter details are already in the schema, so nothing critical 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 baseline is 3. The description adds meaningful guidance on the accepted form for identifiers ('numeric ID or complete URL-encoded path described by the schema') and directs correct use of pagination fields, which augments the schema's plain property 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 begins with a specific verb and resource: 'List projects in a group.' It distinguishes itself from the corresponding get tool explicitly ('choose the corresponding get tool when you already know the single resource to inspect'), making its scope clear relative to 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?

It provides explicit guidance to use this tool for a collection of resources and to switch to the get tool for a single known resource. It doesn't mention list_projects or other sibling listing tools, but the group scoping in the name and first sentence gives enough context to choose it over general project listing.

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)
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.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 stating it is read-only. It adds value beyond annotations by clarifying that invalid identifiers, missing issues, and permission failures are surfaced as errors, and that it returns discussion items.

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 first sentence immediately states the action and resource, and the second provides usage alternatives and behavior 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 read-only list tool with full schema documentation and annotations already covering safety, the description provides the necessary differentiation from siblings, return content, and error behavior. No critical information 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 schema fully documents all four parameters. The description adds no extra meaning about parameters beyond saying the tool returns discussion items, which is acceptable given the schema's completeness.

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 discussions for an issue.' It also distinguishes itself from sibling tools by explicitly naming `list_issues` and `get_issue`, making the tool's scope clear 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?

Provides explicit when-to-use guidance: use this for threaded discussions, `list_issues` for issue records, and `get_issue` for a single issue's fields. This gives an agent clear routing among related tools.

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
issue_iidYesThe IID of an issue
project_idYesProject ID or complete URL-encoded path to project

TDQS

A4.5/5.0
Behavior4/5

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

The description adds error semantics (missing resources, invalid identifiers, insufficient permission, rate limits) and emphasizes read-only behavior, which goes beyond the annotations. It does not describe the response structure, but that might not be critical for a list endpoint and the description sufficiently conveys the tool's non-mutating nature.

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 main action, then provides usage context, error behavior, and parameter details in a logical order. It is not overly verbose, though it could be tightened by removing the conditional `group_id` reference.

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 with two parameters and no output schema, the description covers purpose, usage, errors, and parameter format. It doesn't detail return values, but given the simplicity and that the tool name implies a list, it 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?

The schema covers 100% of parameters, so the baseline is 3. The description adds value by explaining the format for identifiers ('numeric ID or complete URL-encoded path') and mentioning pagination fields. However, it references `group_id` which is not in the schema, potentially causing slight confusion, hence not a 5.

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 ('List') and resource ('emoji reactions on an issue'), clearly stating what the tool does. It also differentiates from sibling get tools by explicitly saying to use the collection tool for a list and the get tool for a known single resource, which aligns with the sibling list and helps avoid confusion.

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 guidance: 'Use this for a collection of resources; choose the corresponding get tool when you already know the single resource to inspect.' This clearly communicates when to use this tool vs. alternatives, which are the get tools among the siblings.

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)
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 annotations already supply readOnlyHint=true and openWorldHint=true, and the description reinforces them by explicitly stating the tool 'does not mutate GitLab data.' It also goes beyond the annotations to disclose error semantics — missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. This meaningfully exceeds what the structured fields convey.

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 clause, but the remainder is one dense run-on paragraph blending several distinct ideas: discussion_id usage, collection-vs-single guidance, read-only safety, error behavior, and parameter-format boilerplate. It earns its sentences, but the tail end ('use required identifiers and pagination fields exactly as documented') reads as low-value filler that adds length without actionable content.

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 tool with 100% schema coverage and no output schema, the description covers the essentials: purpose, read-only safety, error/rate-limit behavior, and the key conditional (discussion_id for replies). The only meaningful gap is that no return shape or count is mentioned, but per the rubric the absence of an output schema puts the description in a stronger position and it largely delivers what's needed to call 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 schema documents all four parameters and the description doesn't have to carry that burden. The description's parameter-related additions are thin and partially circular — 'provide the numeric ID or complete URL-encoded path described by the schema' mostly restates the project_id schema description, and the instruction to 'use required identifiers and pagination fields exactly as documented' is boilerplate that references pagination params that don't exist in this 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?

'List all emoji reactions on an issue note' clearly states a specific verb and resource, correctly scoped to issue notes versus the many issue/merge-request emoji siblings. The scope is precise enough that an agent can disambiguate it from list_issue_emoji_reactions, list_merge_request_note_emoji_reactions, and the create/delete variants, even though no sibling is explicitly named.

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

Usage Guidelines3/5

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

Provides genuine usage context: 'Pass discussion_id for discussion thread replies' is a concrete conditional, and the collection-vs-single-resource contrast ('choose the corresponding get tool') offers some routing guidance. However, the alternative is generic ('the corresponding get tool') rather than naming a specific sibling, and there is no when-not-to-use or prerequisite guidance such as confirming the note exists first.

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
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.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 does not contradict that. It adds extra useful behavioral context: the tool is paginated, requires issue read permission, and describes error outcomes such as invalid identifiers, missing resources, and rate limits. This goes beyond what the annotations alone provide.

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

Conciseness5/5

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

All three sentences are information-dense and no filler: default behavior, sibling routing, and behavioral caveats are each front-loaded. It avoids repeating schema field docs and stays appropriately compact for a tool with a large parameter list.

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 list tool with 21 optional params and no output schema, the description covers the most important invocation concerns: read-only guarantee, pagination, permission requirement, return type, and failure modes. It does not abbreviate the output record shape or note the subtle overlap between `scope=assigned_to_me` and the `my_issues` tool, but these are minor given the schema already documents filters.

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 meaningful interpretation of the defaults and scope behavior: it clarifies that the default is 'created by current user' and that `project_id` is optional, which helps the agent choose initial parameters without diving into each of the 21 properties.

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 clear verb and resource ('List GitLab issues') and immediately explains the default behavior and scope variants. It explicitly differentiates this tool from siblings `get_issue` and `my_issues`, making it unambiguous which tool to pick without inspecting their 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 gives explicit routing conditions: use `get_issue` when the iid is already known, and `my_issues` for issues assigned to the current user. It also notes the optional `project_id` scoping and the default scope, providing actionable guidance for when to call this tool instead of alternatives.

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
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.3/5.0
Behavior4/5

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

It explicitly states the tool is read-only and 'does not mutate GitLab data,' matching the readOnlyHint annotation while adding value. It also discloses how errors are surfaced for missing resources, invalid identifiers, insufficient permission, and rate limits, which is useful beyond the annotations.

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

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. The final sentence contains some generic boilerplate about 'project_id or group_id' and 'exactly as documented' that slightly dilutes the tool-specific value, but it 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?

For a straightforward list operation with a fully documented schema, the description covers purpose, usage context, read-only behavior, error behavior, and identifier handling. There is no output schema, but the return type is reasonably inferable from the tool name and siblings; omitting an explicit response shape 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 only generic guidance about using numeric IDs or URL-encoded paths and following documented pagination fields, which is helpful but not detailed enough to raise the score above 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?

The description clearly states the tool's verb and scope: 'List labels for a project.' It also distinguishes itself from the corresponding single-resource get tool by explaining the collection-vs-single-resource distinction, which differentiates it from siblings like get_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 a collection of resources' and to choose the corresponding get tool when a single resource is already known. This gives an agent clear, actionable routing guidance relative to sibling tools.

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
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/5.0
Behavior4/5

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

The description adds behavior details beyond the readOnlyHint annotation: it lists error conditions (missing resources, invalid identifiers, insufficient permission, rate limits) and explicitly states no mutation. This is useful, though the read-only claim is redundant with 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 moderately concise, contained in two sentences with clear structure. It avoids excessive verbosity, though some repetition occurs (e.g., 'read-only' emphasized twice). Overall it is 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?

Given the schema fully documents parameters and no output schema is present, the description appropriately clarifies the return payload ('without diff content') and mentions error handling. It also hints at pagination ('use pagination fields exactly as documented'), though actual pagination parameters are not shown in the schema, leaving a minor 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?

While the schema already provides descriptions for all parameters (100% coverage), the description introduces incorrect expectations: it mentions 'mergeRequestIid or branchName required' and references 'group_id' though neither is reflected in the schema. This adds confusing, non-factual guidance that may mislead an agent.

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 action: 'List changed file paths in a merge request without diff content', and identifies it as a collection-oriented tool. This distinguishes it from sibling tools like get_merge_request_file_diff or list_merge_request_diffs by explicitly excluding diff content.

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 usage guidance by contrasting 'use for a collection' with 'choose the corresponding get tool when you already know the single resource', and mentions read-only behavior. However, the statement 'mergeRequestIid or branchName required' conflicts with the schema, which marks these parameters as optional, causing potential confusion.

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.
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

A4.1/5.0
Behavior3/5

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

Annotations provide readOnlyHint=true and openWorldHint=true, so the description's claim that it is read-only and does not mutate data aligns but adds little beyond the annotation. It does add that errors include rate limits and permission issues, which is useful context beyond annotations. However, it doesn't disclose specific behaviors like pagination defaults (though schema covers that) or potential side effects. Since annotations cover safety, a 3 is appropriate.

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 the core purpose and key usage guidance front-loaded. It uses two sentences to cover purpose, usage, and error handling. Could be slightly tighter but efficient overall.

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 list tool with read-only annotation, the description covers key usage, error signaling, and distinction from get tool. There is no output schema, but for a list operation the agent can infer pagination behavior from schema. It might benefit from noting common filter combinations but is otherwise complete for a list tool.

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

Parameters3/5

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

Schema has 100% coverage for 6 parameters, so the description adds limited parameter-level meaning. It does mention that project_id or group_id should be numeric or URL-encoded as per schema, which reinforces but doesn't add much new. Baseline for 100% coverage is 3, and the description does not provide substantial extra info beyond what schema already says.

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 'List' and the resource 'merge request diffs with pagination'. It names required identifiers (mergeRequestIid or branchName required) and explicitly distinguishes from the corresponding 'get' tool for single resources. This distinguishes it from siblings like get_merge_request_diffs and get_branch_diffs.

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 for a collection and to use the 'get' tool when you know the single resource. It also states that missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors, which guides usage and error handling.

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
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 states it is read-only and covers common error cases (missing resources, invalid identifiers, insufficient permission, rate limits). It does not detail the response structure, but this is less critical given its read-only nature.

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 well-structured, with no redundant filler. It includes necessary usage and behavioral notes, though some phrases like 'use required identifiers and pagination fields exactly as documented' are slightly generic.

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 handling. It does not explicitly mention the response type (list of emoji reactions), but given the absence of an output schema and the simplicity of the tool, it is reasonably complete for an agent to use 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 description adds guidance on the format for project_id (numeric ID or URL-encoded path) and mentions pagination, but it also references 'group_id' which is not a parameter of this tool, potentially causing confusion. It does not significantly clarify 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 clearly states the tool lists all emoji reactions on a merge request and distinguishes it from a get tool for a single resource, 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 Guidelines5/5

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

It explicitly advises using this tool for collections and points to the corresponding get tool for single resources. It also mentions pagination fields, providing clear usage guidance.

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)
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.8/5.0
Behavior4/5

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

Annotations already indicate readOnly and openWorld, but the description adds specific error handling details (missing resources, invalid identifiers, insufficient permission, rate limits) which go beyond the annotations, though it does not describe pagination or response format.

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 concise, consisting of two clear sentences plus a brief note on discussion_id, with no redundant information or padding.

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 simple nature of the tool (no output schema, no nested objects), the description covers purpose, usage, parameter behavior, and error handling, making it complete for an agent to decide when and how to invoke it.

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

Parameters5/5

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

Schema descriptions cover all parameters (100% coverage), and the description adds extra meaning by explaining when discussion_id is required, supplementing the schema with usage context.

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 action (List all emoji reactions) on a specific resource (merge request note), and distinguishes it from related tools like list_merge_request_emoji_reactions by specifying 'on a 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?

It explicitly instructs to use this tool for a collection and contrasts with the corresponding 'get' tool for a single resource, providing clear selection criteria. It also notes when to include discussion_id for thread replies.

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)
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.7/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 by stating 'It is read-only and paginated.' More importantly, it adds substantive behavioral context beyond annotations: access requirements ('requires project access') and error semantics ('GitLab errors for invalid identifiers, missing resources, or rate limits'). This gives the agent a clear picture of failure modes and preconditions.

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 in sentence one, routing guidance follows, and behavioral/error details close it out. Every sentence earns its place, and the total length is appropriate for the tool's complexity.

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 there is no output schema, the description compensates by stating what is returned ('pipeline records or GitLab errors') and the error categories. With only 4 simple scalar parameters, no nested objects, and read-only annotations covering the safety profile, nothing essential 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 all four parameters (project_id, merge_request_iid, page, per_page) are already documented in the schema. The description mentions pagination, which thematically maps to page/per_page, but adds no format or syntax details beyond what the schema provides. Baseline 3 is appropriate when the schema carries the documentation load.

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 pipelines for a merge request with pagination' — making the operation unambiguous. It further distinguishes scope by contrasting with `list_pipelines` for project-wide filtering, which differentiates it from sibling merge-request tools. The purpose is immediately clear and distinct.

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 routing guidance: 'Use this to inspect pipelines associated with one merge request; use `list_pipelines` for project-wide pipeline filtering.' This names the alternative and the exact condition that selects it. The only minor caveat is that `list_pipelines` is not among the visible sibling tools, but openWorldHint=true makes this acceptable.

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
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

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, so the read-only nature is known. The description adds value by listing error conditions (missing resources, invalid identifiers, insufficient permission, rate limits) and clarifying the scoping behavior (user vs project MRs). It doesn't contradict any annotation, but it restates the read-only aspect partially.

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 fluff. The primary purpose and scoping is front-loaded, then usage guidance and error handling are packed in a second sentence. Every clause adds information; nothing is redundant.

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 25 parameters and no output schema, the description provides the essential usage context (collection vs single), error behavior, and parameter format guidance. It doesn't need to enumerate every parameter since schema covers them. The only minor gap is not explaining the return format, but for a list tool this is typically obvious and not critical.

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 every parameter already has a description. The tool description adds a high-level note about using identifiers and pagination exactly as documented, but doesn't deep-dive into specific parameters. With full schema coverage, the baseline is 3, and the description's added value is minimal.

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 'List' and the resource 'merge requests', then explicitly distinguishes the two modes (user-level vs project-level) based on presence of project_id. It also names the sibling get tool and when to use it, making it unambiguous which tool 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 Guidelines5/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 and to choose the corresponding get tool for a single known resource. It also gives error-handling guidance (missing resources, invalid IDs, permission, rate limits) and instructs on ID formats (numeric or URL-encoded path) and pagination parameters. This is precise, actionable 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_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
project_idYesProject ID or complete URL-encoded path to project
merge_request_iidYesThe internal ID of the merge request

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 openWorldHint, and the description adds concrete error behavior: missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. This goes beyond the annotations, though it also restates the read-only nature already covered.

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 the final sentence contains boilerplate about group_id and pagination fields that are not part of this tool's input schema. It is not overly long, but the extra generic instructions reduce precision.

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 listing tool, the description covers purpose, when to use it, error behavior, and identifier format. It does not fully describe return formatting, but the absence of an output schema makes that less critical here.

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

Parameters3/5

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

Schema coverage is 100%, so the baseline is 3. The description mostly restates the schema's project_id guidance and adds no new meaning for merge_request_iid. The mention of group_id and pagination fields is generic and not directly reflected in 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 opens with a specific verb and resource: "List all versions of a merge request." It also distinguishes this tool from a singular get tool by pointing to the collection-versus-single-resource case.

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 collection of resources and to choose the corresponding get tool when a single resource is already known. This gives an agent clear decision criteria without having to inspect siblings.

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
per_pageNoNumber of items per page (max: 100, default: 20)

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, but the description adds context: "It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors." This goes beyond the annotation by disclosing error behavior. The mention of 'kind' that isn't in the schema slightly undermines confidence, but 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.

Conciseness3/5

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

The first two sentences are effective, but the latter half includes generic boilerplate like "When `project_id` or `group_id` is accepted..." and "use required identifiers and pagination fields exactly as documented" — which are irrelevant to this schema and add noise. The message could be delivered in two tight sentences.

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?

No output schema exists, so the description carries the return-value burden. It does disclose read-only behavior and error conditions, which is helpful. However, it introduces nonexistent parameters (kind, project_id, group_id) and fails to explain pagination behavior beyond a generic directive. For a simple list tool, it is mostly comprehensive but contains enough mismatched guidance to lower completeness.

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 doesn't meaningfully expand on page, owned, search, or per_page; instead, it mentions filtering by 'kind' and IDs (project_id/group_id) that do not appear in the schema, adding potential confusion rather than 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 verb and resource: "List all namespaces (users and groups) available to the current user." It also differentiates from sibling get tools by framing this as a collection-level listing, so the agent can distinguish it from get_namespace 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: "Use this for a collection of resources; choose the corresponding get tool when you already know the single resource to inspect." It also gives a filtering hint for groups only, which helps select the right call behavior.

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
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 description explicitly states that it is read-only and does not mutate data, reinforcing the readOnlyHint. It also discloses that missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors, adding value beyond annotations. The description doesn't cover pagination behavior details beyond what schema provides, but the error disclosure is valuable.

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 with three sentences, front-loaded with the primary purpose, then usage guidance, then behavioral notes. The third sentence about parameter usage is somewhat redundant with the schema, but not excessive. 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 read-only list tool with a comprehensive schema (100% coverage) and clear error-handling disclosure, the description is adequately complete. It covers collection vs single resource, read-only safety, error conditions, and parameter usage. Pagination isn't detailed, but schema covers it, and no output schema exists. The description could mention the lack of project-level inheritance details, but that's parameter-specific and already in 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 documents all 7 parameters. The description reinforces the need to use numeric ID or URL-encoded path for project_id and to use required identifiers and pagination fields, but it doesn't add new semantics beyond what schema descriptions already provide. Thus 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 'List members of a GitLab project' with a specific verb and resource. It distinguishes itself from sibling tools like 'get_project' and 'list_group_members' by explicitly mentioning project vs group context and collection vs single 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?

The description advises using the get tool for a single resource versus the list tool for a collection, providing clear usage context. It doesn't explicitly mention when not to use this tool or alternatives like list_group_members, but the collection vs single distinction is sufficient guidance.

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
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.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so stating 'does not mutate GitLab data' adds no new value. However, the description adds useful behavioral context: error cases such as missing resources, invalid identifiers, insufficient permissions, and rate limits are disclosed. This goes beyond what annotations alone 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?

The description is organized with purpose upfront, followed by usage guidance and then edge-case behavior. It is somewhat longer than necessary because the read-only claim duplicates the annotation, but every sentence delivers useful information and the structure is easy to parse.

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 list tool with fully documented parameter definitions in the schema, the description covers the key operational details an agent needs: when to use it, what data is returned as errors, and how to treat identifiers and pagination. No critical gap remains.

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 a baseline of 3 is appropriate. The description references identifier and pagination fields but does not help distinguish among the 15 parameters beyond what the schema already documents. The mention of project_id/group_id is generic and not present in the schema, so it does not add meaningful parameter-level insight.

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 projects accessible by the current user'), the resource (projects), and the scope (current user). It also differentiates this collection-oriented tool from single-resource 'get' tools, making it easy for an agent to distinguish purpose without consulting sibling definitions.

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 ('for a collection of resources') and when not to ('choose the corresponding get tool when you already know the single resource'). This provides a clear decision rule for the agent, even without naming every sibling.

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
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=true and openWorldHint=true. The description reinforces read-only behavior and adds specific error conditions (missing resources, invalid identifiers, insufficient permission, rate limits) that go beyond the annotation. It does not contradict annotations, and the added error detail is valuable.

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

Conciseness4/5

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

Two sentences, purpose front-loaded, but contains some redundancy ('read-only and does not mutate') and an off-topic group_id mention. Slightly looser than ideal but still 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?

Covers purpose, alternative, error behavior, and identifier format. Missing output schema is acceptable for a list operation. The only notable gap is the inaccurate group_id reference, which slightly detracts from completeness. Overall adequate 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 coverage is 100%, so parameters are fully documented. The description repeats the project_id format advice ('numeric ID or complete URL-encoded path') and mentions 'group_id' even though the schema has no group_id property, which is confusing. Minimal added 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?

States a clear verb and resource: 'List protected branches in a project' with a search filter. It distinguishes itself from the single-resource get tool by explicitly contrasting collection vs. single resource inspection, matching the sibling get_protected_branch.

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 direct guidance: use when you want a collection; choose the corresponding get tool when you know the specific branch. Also instructs on required identifier format and pagination fields, which is actionable context for selecting 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.

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
per_pageNoNumber of items per page (max: 100, default: 20)
author_idNoFilter by author ID
project_idNoFilter by project ID

TDQS

A4.7/5.0
Behavior4/5

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

The annotations already declare readOnlyHint=true and openWorldHint=true. The description adds value by explicitly stating it is read-only, does not mutate data, and that errors (missing resources, invalid identifiers, insufficient permission, rate limits) are returned as errors. This expands on 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?

The description is four sentences, front-loaded with purpose, and each sentence contributes a distinct piece: purpose, alternative usage, behavioral guarantees, and parameter guidance. No redundancy or fluff.

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 an 8-parameter optional-tool with no output schema, the description covers purpose, usage, error behavior, and parameter format. It implies a list return value and mentions pagination. Combined with 100% schema coverage and readable annotations, nothing essential 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 baseline is 3. The description adds guidance on passing project_id or group_id (numeric ID or URL-encoded path) and instructs to use pagination fields exactly as documented. This clarifies parameter format beyond the schema's basic 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 action ('List GitLab to-do items for the current user') and the resource (to-dos). It explicitly distinguishes from 'get' tools, saying to use those for a single known resource, which differentiates it from the many 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?

It explicitly says to use this for a collection of resources and to use the corresponding get tool when you know a single resource. This gives clear selection criteria relative to siblings. It also mentions error conditions and parameter usage, covering when and how to invoke it.

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

mark_all_todos_doneC

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

No parameters

TDQS

C2.8/5.0
Behavior3/5

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

The description explicitly states 'It changes remote GitLab state' and requires 'the necessary project or group permission,' which are important behavioral facts beyond the annotation 'openWorldHint: true.' It also lists possible error types (validation, conflict, permission, rate-limit). However, it does not disclose what happens to already-done items, whether the operation is atomic, or any side effects. The mention of project_id/group_id that are not in the schema introduces confusion rather than clarity.

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 description is verbose and padded with generic phrases like 'choose a sibling tool when you need a different resource or lifecycle action' and 'retains to the schema.' The first sentence is focused, but the rest repeats boilerplate that could apply to any tool. The mention of parameters not in the schema adds unnecessary length. It would be more concise if it simply stated the action, the permission requirement, and the error behavior without the filler.

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 no parameters and no output schema, the description covers the core action, the fact that it mutates state, permission needs, and error response types. However, it includes irrelevant references to `project_id` and `group_id` that are not in the schema, and it omits details like whether 'all pending' includes items across all projects or only those accessible to the user. The mention of pagination fields is also nonsensical given no input parameters. These gaps reduce completeness.

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 has zero parameters, so there is nothing to describe. However, the description references 'project_id' and 'group_id' that are not present in the schema, which is misleading. It also says 'use required identifiers and pagination fields exactly as documented' when no identifiers or pagination fields exist. This actively confuses the agent instead of adding value, so it falls well below the baseline for a zero-parameter tool.

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 clearly states the action: 'Mark all pending GitLab to-do items as done for the current user.' This distinguishes from the sibling 'mark_todo_done' by using 'all pending' and covers the resource and scope. However, the purpose is slightly diluted by later generic boilerplate that doesn't add specificity, but the core purpose is unmistakable.

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 description provides only a generic directive to 'choose a sibling tool when you need a different resource or lifecycle action.' It does not mention the alternative 'mark_todo_done' for a single item, nor does it state when this tool should be preferred over that one. No specific triggers, prerequisites, or exclusions are given, so the guidance is essentially absent.

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

TDQS

B3.2/5.0
Behavior4/5

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

Beyond the `openWorldHint` annotation, the description discloses that the call mutates remote GitLab state, requires project or group permissions, and surfaces GitLab's error semantics (validation, conflict, permission, rate-limit) rather than silently succeeding. This is useful behavior context consistent with the annotation — 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.

Conciseness2/5

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

The description is dominated by generic template language that could be pasted into any tool — the `project_id`/`group_id` guidance is actively misleading since this tool takes only an `id`. The useful content ('Mark a GitLab to-do item as done' plus the side-effect sentence) could fit in two concise sentences.

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 a single parameter and no output schema, the description covers the key aspects an agent needs: the operation, the side effects, permission requirements, and error behavior. The only deduction is for the presence of irrelevant boilerplate that slightly muddies otherwise adequate 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% and the description adds nothing about the single `id` parameter beyond what the schema already provides. In fact, the sentence about `project_id` or `group_id` references parameters that do not exist in this tool's schema, which is confusing even if intended as generic template text. The baseline of 3 for fully covered schema is correct here.

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?

'Mark a GitLab to-do item as done' is a specific verb + resource phrase that unambiguously states the core function. However, the description does nothing to distinguish this from sibling `mark_all_todos_done`, and the generic sentence 'choose a sibling tool when you need a different resource or lifecycle action' reads as boilerplate rather than targeted differentiation.

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 instruction to 'choose a sibling tool when you need a different resource or lifecycle action' is tautological — it provides no actionable decision boundary. For example, it never tells the agent when to prefer `mark_all_todos_done` over this tool. No specific alternatives, exclusions, or conditions are given.

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
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

A5/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true, but the description adds substantial concreteness: 'may squash commits, schedule auto-merge, or delete the source branch,' requires merge permission, and 'returns GitLab's merge result or a mergeability error.' It also discloses the GitLab version-specific `sha` requirement, which the annotation does not convey. There is no contradiction 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.

Conciseness5/5

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

The description is four dense sentences, each earning its place: purpose, usage conditions and alternative, side effects and permission, then the `sha` tip. No filler or redundancy; material is front-loaded with the core action 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?

For a destructive tool with 9 parameters and no output schema, the description covers the essential decision factors: preconditions (approval/conflict/pipeline checks), the alternative tool, behavioral consequences, permission requirements, return type (result or error), and a parameter-source hint. Nothing an agent needs to call this tool safely is missing.

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

Parameters5/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 enriches parameter understanding far beyond the schema. It tells the agent to source `sha` from `get_merge_request` (`sha` or `diff_refs.head_sha`), explains why GitLab 19.2+ groups may require it, and clarifies that `merge_when_pipeline_succeeds` is deprecated in favor of `auto_merge`. This is meaningful cross-parameter guidance the schema does not provide.

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 'Merge a merge request,' a clear verb+resource pairing. It explicitly distinguishes itself from `approve_merge_request`, telling agents to use that tool for approval instead, and names the state checks (approval, conflict, pipeline) that precede merging, making its scope unambiguous relative to the many merge-request 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?

It gives precise when-to-use guidance: 'Use this only after checking the merge request approval, conflict, and pipeline state' and explicitly routes to `approve_merge_request` for approvals. It also calls out the merge-permission prerequisite and instructs to pass `sha` from `get_merge_request`, covering both sequencing and alternatives.

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)
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.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, so the description doesn't need to repeat that. It adds that invalid identifiers, missing resources, and permission failures are reported as errors, which is useful behavioral context beyond the annotations. It doesn't describe the return format or pagination details, but the annotations cover the safety profile.

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 waste. It front-loads the core purpose, then adds the sibling differentiation and error behavior. 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?

For a read-only list tool with full schema coverage and annotations declaring read-only and open-world hints, the description is complete. It covers the purpose, the alternative, and error conditions. The only minor gap is not describing the return structure, but since there's no output schema and the tool is a list 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 four parameters. The description doesn't add additional parameter-level meaning beyond what the schema provides. Baseline 3 is appropriate since the schema does the heavy lifting.

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 discussion items for a merge request, distinguishing it from get_merge_request_notes which returns flat notes. It specifies the resource (merge request) and the action (list discussions), making it 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 says to use this tool for complete discussion threads and to use get_merge_request_notes when only flat notes are needed. This provides clear when-to-use and when-not-to-use guidance, directly addressing the alternative tool.

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
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/5.0
Behavior4/5

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

Explicitly states it is read-only (consistent with readOnlyHint=true annotation), paginated, requires authentication, and returns permission/rate-limit errors. Goes beyond the annotation to disclose pagination, auth, and failure behavior.

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

Conciseness3/5

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

Front-loaded with the key verb phrase around 4 words in. However, it redundantly repeats 'List issues assigned to the authenticated user' in the second sentence ('Use this for issue management: list issues assigned to the authenticated user'), wasting tokens.

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 an 11-parameter read-only tool with fully documented schema, the description covers authentication, pagination, and error behavior. It does not describe the response record shape (no output schema exists), but the scope and invocation context are 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?

The schema already covers all 11 parameters with descriptions (100% coverage), so the description is not required to explain parameters. It does add a general hint about pagination, but no parameter-level detail 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 a specific verb+resource+scope combo: 'List issues assigned to the authenticated user,' and explicitly differentiates from sibling tools `list_issues` and `get_issue`. An agent can immediately tell what this tool does and what it does not do.

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?

Names alternative siblings (`list_issues` for project-wide/author-scoped, `get_issue` for a single issue) and clarifies that this tool is specifically for the authenticated user's assigned issues. Slightly generic 'Use this for issue management' filler, but the routing guidance is clear.

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
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.5/5.0
Behavior5/5

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

Annotations carry openWorldHint and destructiveHint, but the description adds substantial context beyond them: what exactly changes ('who may push, merge, or unprotect'), side effects ('may enable force-push or code-owner settings'), the permission gate ('requires maintainer-level permission'), and the return/error shape ('returns the protection rule or a validation/permission error').

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 purpose, followed by usage guidance and behavioral disclosure. Each sentence earns its place, though there is slight redundancy between 'set push/merge/unprotect access levels' (sentence 1) and 'changes who may push, merge, or unprotect' (sentence 3).

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, the description correctly carries return-value information ('returns the protection rule or a validation/permission error'), and it covers permissions, effects, and usage. Minor gaps remain, such as interaction between existing and new rules on the same branch, but nothing an agent critically needs to call it correctly is missing.

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

Parameters3/5

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

Schema coverage is 100%, with every parameter already documented including access-level enum values and defaults, so the baseline of 3 applies. The description's references to 'push/merge/unprotect access levels' and 'force-push or code-owner settings' conceptually map to the parameters but add no syntax or format detail 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 a specific verb+resource pair ('Protect a repository branch') and specifies the concrete meaning of protection ('set push/merge/unprotect access levels'). It also mentions wildcard branch patterns, distinguishing it from related siblings like get_protected_branch, unprotect_branch, and create_branch.

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 ('Use this to create or update protection rules for a branch or wildcard') and names the sibling to use beforehand ('use get_protected_branch to inspect existing rules first'). This is direct, actionable routing that leaves little to inference.

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
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
Behavior5/5

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

Annotations are minimal, so the description carries the full burden. It clearly states 'It changes remote GitLab state' (mutation), 'requires the necessary project or group permission' (auth), and explains error behavior: 'GitLab returns validation, conflict, permission, or rate-limit errors instead of silently applying an invalid request.' This provides substantial behavioral 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 and covers purpose, behavior, and parameter usage. It is front-loaded with the specific operation and each sentence adds value, though some phrasing like 'use this for the specific operation described' is somewhat redundant. It is efficient without being overly terse.

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 purpose, side effects, permissions, and error handling. It does not explicitly state what a successful response contains, such as the published draft note, but that omission is somewhat excused by the lack of an output schema. The tool is simple (three required parameters) and the description is reasonably 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%, and the schema already defines all parameters. The description adds guidance on project_id formatting and says to use required identifiers as documented, which is useful but redundant with the schema. It also mentions 'group_id' when the schema only has 'project_id,' which could cause slight confusion. Overall, the description adds minimal 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 opens with 'Publish a single draft note,' which is a specific verb and resource. It explicitly distinguishes this from other operations by saying 'choose a sibling tool when you need a different resource or lifecycle action,' reinforcing that this tool is for publishing a single draft note only.

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 includes 'Use this for the specific operation described; choose a sibling tool when you need a different resource or lifecycle action,' which tells the agent when to use this tool versus alternatives. However, it does not name the specific sibling for bulk publishing (bulk_publish_draft_notes) or other draft note operations, so the guidance is clear 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.

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
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 only carry openWorldHint and destructiveHint, so the description carries most of the behavioral burden and carries it well. It discloses that the operation writes repository history, requires repository write permission, and returns either the commit result or validation/conflict/protected-branch errors — concrete behavioral and failure-mode context well beyond the annotations. Nothing contradicts the annotations; destructiveHint aligns with the described history-writing side effect.

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?

Four sentences, each earning its place: core purpose first, then routing guidance, then per-file defaults and constraints, then side effects and error behavior. The most decision-relevant information (what it does, when to use it) is front-loaded, and there is no filler or repetition of schema 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?

For a multi-file mutation tool with no output schema, the description covers everything an agent needs: scope, when to choose the sibling, per-file action/encoding behavior, permission-mode limitations, required permissions, and the expected return/error shape. The per-file field details are thoroughly handled by the 100%-coverage schema, so the description need not repeat them.

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 the schema already describes defaults, encodings, and previous_path, so the baseline is 3. The description adds genuine value on top: the atomic single-commit semantics, the default-to-create behavior, and especially the GITLAB_PERMISSION_MODE interaction that rejects delete/move — a constraint not present anywhere 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?

The opening sentence, 'Push multiple files in a single commit,' states a specific verb, resource, and atomicity guarantee. It explicitly distinguishes itself from create_or_update_file by naming the sibling and the condition that selects it. An agent can identify what this tool does and what it is not 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?

The description gives an explicit when-to-use ('commit several file changes atomically'), an explicit when-not-to-use ('use create_or_update_file when only one path is involved'), and names the alternative tool. It further adds an environment-conditional constraint (GITLAB_PERMISSION_MODE=modify rejects delete and move), which is unmissable usage guidance beyond the schema.

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
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 only provide openWorldHint, so the description carries the full behavioral disclosure burden. It clearly states that the operation changes review state, requires permission to resolve discussions, and returns either the updated discussion or missing-thread/permission errors. This is exactly the safety and outcome context an agent needs for a state-changing call.

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, alternative routing, and behavioral/error expectations. The key usage guidance is front-loaded, and there is no 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?

For a 4-parameter, no-output-schema tool with minimal annotations, the description covers purpose, usage boundaries, permission requirements, state change, and error cases. An agent has enough information to invoke it correctly and interpret the outcome.

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 fully describes all four parameters with 100% coverage, so the baseline is 3. The description does not add meaning beyond the schema for individual parameters; it only characterizes the operation overall. No additional parameter-specific guidance is needed, but none is provided.

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 ('Resolve') and resource ('thread on a merge request'), and explicitly distinguishes itself from update_merge_request_discussion_note. It also adds 'review thread' to clarify exactly what kind of thread, which prevents confusion with note-level 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?

It explicitly states when to use this tool ('mark an existing merge request review thread resolved') and names the alternative with the condition for using it ('use update_merge_request_discussion_note when the note text itself must change'). This gives the agent clear selection criteria without further inference.

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
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 include readOnlyHint=true and openWorldHint=true, so the safety profile is already known. The description adds that it is read-only and does not mutate GitLab data, reinforcing but not contradicting annotations. It also discloses that missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors, which is valuable beyond annotations. It doesn't describe the response format or pagination details, but the output schema is absent. Given the annotations cover read-only nature, the description adds meaningful error-handling context, warranting a 4.

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 moderately concise with three sentences. The first sentence clearly states the purpose, the second adds usage and safety context, and the third covers parameter usage. It is informative without excessive length. Slightly could be trimmed, but it is front-loaded with the core purpose. No redundant wording, though the error disclosure could be considered a bit verbose.

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 no output schema and only four simple parameters all described in the schema, the description covers the purpose, usage distinction, safety profile, and error behavior. It doesn't cover the structure of the search results, but since there is no output schema and the tool is a discovery search, the description is reasonably complete. The missing explicit exclusions for alternatives is a minor gap, but overall adequate.

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 documents all parameters (page, query, search, per_page). The description adds value by explaining the relationship: 'query' is an alias for 'search', and it clarifies that identifiers should be numeric IDs or URL-encoded paths when project_id or group_id are accepted (though those are not parameters in the schema). It also reminds to use required identifiers and pagination fields exactly as documented. This goes beyond the schema's terse descriptions, especially the alias clarification.

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 searches for GitLab projects with a specific verb (Search) and resource (GitLab projects). It distinguishes itself from siblings by explicitly mentioning 'typed get or list tool when the target identifier is already known', which contrasts with get_project, list_projects, and other typed tools. However, it doesn't name a specific sibling tool that competes for the same search role (such as a hypothetical search_issues), so it doesn't fully differentiate from all 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?

Provides clear guidance: use this for discovery when the target identifier is unknown, and choose a typed get or list tool when the identifier is already known. It also instructs on using project_id/group_id with numeric IDs or URL-encoded paths. However, it doesn't explicitly mention when not to use this tool in favor of specific alternatives like list_projects or get_project, nor does it address pagination when to use page/per_page beyond noting they exist.

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
project_idYesProject ID or complete URL-encoded path to project
merge_request_iidYesThe IID of the merge request to unapprove

TDQS

A4.7/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 operation changes review state, requires approval permission, and returns either the updated result or an error when the request or approval is unavailable. This is valuable behavioral context for a mutating operation, covering permission requirements 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.

Conciseness5/5

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

Three short sentences, each earning their place: the first states the action, the second clarifies usage vs. the merge sibling, and the third covers behavior and errors. It is front-loaded with the core purpose and contains 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 simple two-parameter operation with no nested objects and full schema coverage, the description covers purpose, when to use it, permission requirements, and expected outcomes. Even without an output schema, the agent has enough information to select and 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 coverage for the two parameters is 100%, so the schema already documents meaning. The description adds only the contextual detail that it removes the current user's approval, which clarifies the operation but does not significantly deepen 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 a specific verb and resource ('Unapprove a merge request') and immediately clarifies the exact scope: removing the current user's approval. It also distinguishes itself from merge_merge_request, which is the sibling most likely to be confused with it, 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 states when to use this tool ('to remove the current user's approval from an existing merge request') and provides an alternative condition ('use merge_merge_request only when you intend to merge'). This gives an agent a clear decision rule without needing to infer usage from the tool name.

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
project_idYesProject ID or complete URL-encoded path to project
branch_nameYesName of the protected branch to unprotect

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true, and the description adds meaningful context: it changes repository security controls, requires permission to manage protected branches, and returns an error when the branch is missing or policy forbids the change. This goes beyond the annotation by explaining the permission requirement and error conditions.

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. The core action is front-loaded, the sibling distinction comes second, and the behavioral/error context is packed efficiently into the final sentence.

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-parameter tool with full schema coverage and a destructiveHint annotation, the description covers the action, the alternative, the permission requirement, and error conditions. It doesn't describe the return value format, but with no output schema and a simple operation, 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 both parameters. The description adds no new parameter-level detail beyond what the schema provides, so the 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 ('Remove protection') and resource ('previously protected branch'), and explicitly distinguishes itself from protect_branch. It clearly identifies what the tool does and how it differs from the sibling that changes access levels.

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 ('remove protection from an existing branch') and when not to ('use protect_branch to change access levels without removing the rule'). This gives an agent clear routing guidance between the two related tools.

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
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?

Beyond the destructiveHint and openWorldHint annotations, the description discloses real behavioral consequences: it changes project settings and may affect clone, merge request, and CI defaults. It also states permission requirements and the possible return outcome, giving the agent important context that annotations alone do not provide.

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

Conciseness5/5

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

The description is concise and front-loaded with the primary purpose, followed by usage guidance, effects, permissions, and return behavior. Every sentence adds useful information without redundancy or fluff.

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 two-parameter mutation tool, the description covers when to use it, what it changes, side effects, permissions required, and the return type/error behavior. No output schema exists, so this description carries the full burden well and leaves no critical 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 both project_id and default_branch. The description does not add significant parameter-level detail, but with full schema coverage 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 states a specific verb and resource ('Change the default branch of a project') and clearly defines what GitLab treats as the project default. It also explicitly distinguishes itself from create_branch, making it easy for an agent to select the correct tool.

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 and names the alternative: 'use create_branch to create a branch rather than changing project defaults.' This provides clear routing guidance without requiring the agent to infer usage.

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
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

A3.9/5.0
Behavior4/5

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

The description states the side effect ('Changes remote GitLab state') and error semantics ('GitLab returns validation, permission, conflict, or rate-limit errors instead of silently applying an invalid request'), which is exactly the kind of behavioral information that helps an agent anticipate side effects and failure modes beyond a basic 'updates a draft' description. It also specifies input acceptance behavior for `project_id` (accepts numeric ID or URL-encoded path). However, it doesn't address idempotency, whether the action is repeatable, or whether the draft is published atomically, leaving some behavioral questions unanswered.

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 two sentences are concise, but the rest of the description devolves into a wall of text with critical warnings (line_code, line numbers) that should be reformatted into a list or moved entirely into the schema. The description is long and run-on, with the most important implementation details (critical for line_code) buried in the middle of a paragraph. It ultimately reduces clarity due to lack of concision.

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 request/response aspects well, covering side effects, error semantics, and input constraints, but it does not address the response contract or pagination, and gives no hints about what the `draft_note` or the API should return. This is a meaningful gap, but the absence of an output schema is addressed, and the description adequately covers input correctness rather than response interpretation.

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

Parameters5/5

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

The schema is 100% covered, and the description correctly defers to it ('use required identifiers and pagination fields exactly as documented'), making the schema the authoritative source. The description adds minimal duplicate information about requiring the permission or the position of the request in the URL, which is a good signpost to the schema's own authoritative details.

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 in the first sentence with a focus on 'existing' vs. 'new' and 'discussion-only text'. This clearly distinguishes it from the create and note variants, naming the sibling tools explicitly to avoid confusion. The specific language 'use a note tool for discussion-only text' precisely targets the correct sibling for non-draft discussions.

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 differentiates when to use this tool versus its two closest siblings (create for new, note for discussion-only) in the very first sentence, giving the model clear selection criteria without needing to parse any sibling names. It also warns about the API returning validation/rate-limit errors instead of silently failing, which helps the model anticipate failure modes and react accordingly. This is strong guidance for the primary decision an agent must make (when to invoke this vs. alternatives), though it omits the broader draft lifecycle (e.g., when to use drafts vs. published notes).

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)
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.4/5.0
Behavior4/5

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

Annotations only contain openWorldHint=true, which doesn't cover safety. The description discloses that it mutates issue state, requires issue-edit permission, and that errors are validation/permission/conflict - all beyond what annotations provide. It doesn't mention reversibility or specific side effects beyond state mutation, but for an update operation with these disclosures, a 4 is appropriate. 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, front-loaded with the primary action and return behavior, then alternatives, then mutation/safety context. Every sentence earns its place, and the structure is efficient given the 14-parameter surface area.

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 14-param mutation tool with no output schema but complete schema descriptions, the description covers the key context: what it does, when to use alternatives, what it returns, and its error modes. It doesn't enumerate which fields can be changed together or detail specific validation rules, but the schema provides field-level descriptions. A 4 is reasonable - it's complete enough for an agent to call correctly, with minor gaps on combined-field constraints.

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 fully documents all 14 parameters. The description doesn't add much to parameter meaning beyond noting full_response for the complete object. Following the calibration rule, baseline is 3 when schema covers everything - the description adds only minimal extra context, so 3 is correct.

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 clear verb ('Update an issue') plus the primary resource, and explicitly differentiates from siblings by naming update_issue_description_patch, create_issue_note, and delete_issue. An agent can tell exactly what this tool does compared to related 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 provides explicit when-to-use guidance: 'Use this to change fields on an existing issue', and explicitly lists alternatives with conditions ('use update_issue_description_patch for a targeted description edit... use create_issue_note for discussion'). It also implies when not to use it. This is strong 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
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.4/5.0
Behavior5/5

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

The description clearly states the mutating side effect ('changes the issue description when not dry-running'), the required permission ('issue-edit permission'), and the possible failure modes (mismatch/validation/permission error). Since annotations only provide openWorldHint and no safety flags, this disclosure carries the full weight and does so strongly.

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 information-dense yet compact, front-loading what the tool does, then usage guidance, then behavior and errors. Every sentence contributes distinct value with no filler or repetition.

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 side effects, permissions, error classes, dry-run behavior, and note creation, which is substantial for a 7-parameter tool with no output schema. It stops short of specifying the exact patch syntax or the structure of the returned patch result, but those are reasonably inferable and not essential for selection/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 parameters. The description adds context for dry_run and create_note beyond their schema descriptions, but it doesn't materially elaborate parameter syntax or relationships beyond what the schema provides, matching 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?

The description uses a specific verb-resource pair ('Apply a patch to an issue description') and immediately clarifies the two patch formats, search/replace and unified diff. It distinguishes this tool from the sibling update_issue by noting it avoids sending the full description, so an agent can 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 Guidelines4/5

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

Explicitly says to use this for a targeted search/replace or unified-diff change and tells when to enable dry_run and create_note. It implies the alternative (full description update) through the token-saving rationale, but does not name update_issue as the sibling to use for wholesale rewrites.

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
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

A4.2/5.0
Behavior4/5

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

The description discloses that the tool mutates remote GitLab state, requires project or group permission, and returns validation, conflict, permission, or rate-limit errors instead of silently applying invalid requests. With only openWorldHint=true in annotations, this behavioral context is valuable 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 description is reasonably front-loaded and has useful early sentences about purpose and usage. However, it includes generic boilerplate such as 'pagination fields exactly as documented' even though this tool has no pagination parameters, and it mentions group_id even though the schema only accepts project_id. This reduces precision and earns its length less effectively.

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 sparse annotations and no output schema, the description covers the essential invocation context: what it modifies, when to choose it, permission requirements, and error behavior. It does not describe the return value, but for a straightforward update operation this is not a critical 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 parameter descriptions already carry the semantic weight. The description adds only generic identifier guidance about numeric IDs or URL-encoded paths and tells agents to use required identifiers as documented, but it does not add meaning beyond what the schema already 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 opens with a specific verb and resource: 'Modify an existing issue thread note.' It also clarifies what the tool is not for by distinguishing existing resources (this tool) from new resources (create tool) and discussion-only text (note tool), which differentiates it from siblings like create_issue_note and create_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 states when to use the tool: for an existing issue thread note. It also gives clear when-not guidance by directing agents to the corresponding create tool for new resources and to a note tool for discussion-only text. This is concrete usage guidance that does not rely on inference.

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
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.6/5.0
Behavior4/5

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

Annotations only include openWorldHint=true, which is low-signal for behavior. The description compensates by disclosing that the tool changes remote GitLab state, requires permissions, and that GitLab returns validation/conflict/permission/rate-limit errors instead of silently applying invalid requests. This adds behavioral context beyond the annotation. A small deduction for not detailing reversibility or partial updates, but it covers the main operational safety and error 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?

The description is three sentences, tightly packed with essential operational details: what it updates, when to use it, permissions, error behavior, and parameter conventions. No redundancy, and the key purpose is front-loaded. Every 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?

For a mutation tool with 6 parameters and no output schema, the description covers usage boundaries, permissions, error responses, and parameter conventions. It lacks details on the response format (which the output schema would otherwise provide) and doesn't describe the return behavior of the updated label, but given the absence of an output schema, the error-handling and permission guidance are strong. A 4 is justified since a tool this complex could benefit from a note on side effects or idempotency, but the core agent needs are met.

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 parameters. The description adds the distinction between accepting numeric ID or URL-encoded path for project_id/group_id, and warns to use required identifiers and pagination fields exactly as documented. This adds a small layer of semantic guidance on top of the schema, but most meaning is already in the schema. Baseline 3, with a bump for the ID/path and pagination note.

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 existing label in a project'), which distinguishes it clearly from sibling tools like create_label and delete_label. It also clarifies the difference between labels and notes, which helps select the right tool among similar update/create/delete 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 on when to use this tool: for an existing resource, choosing the create tool for new resources and a note tool for discussion-only text. It also mentions permission requirements and how GitLab returns errors, which informs the agent when to expect failure. This is explicit when/when-not guidance.

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
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.5/5.0
Behavior5/5

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

The description goes beyond the openWorldHint annotation by explicitly stating it changes remote GitLab state, requires permissions, and returns validation/conflict/permission/rate-limit errors instead of silently ignoring invalid requests. This gives the agent a clear picture of side effects and error behavior.

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

Conciseness4/5

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

The description is four sentences with the core purpose front-loaded. It efficiently covers usage, behavior, and identifier handling, but the last sentence about pagination fields is slightly redundant given the schema and adds minor bloat.

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 14 parameters and no output schema, the description covers purpose, usage, side effects, and identifier semantics. It does not enumerate all updatable fields but those are already documented in the schema, so the high coverage lets the description focus on higher-level context. The 'branchName' inaccuracy 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 a baseline of 3 is appropriate. The description adds guidance on providing project_id/group_id as numeric ID or URL-encoded path, but it introduces a misleading statement: 'mergeRequestIid or branchName required' conflicts with the schema which only requires project_id and has source_branch instead of branchName. This ambiguity reduces the 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 description clearly states the tool updates a merge request, distinguishing it from create and note tools. It names the specific resource and action, and explicitly differentiates from siblings by mentioning the corresponding create tool and note tool for other purposes.

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 usage guidance: use for existing resources, choose create for new ones, and note tools for discussion-only text. It also implies that this tool is for updating MR attributes, not merging or approving, which clarifies when to use it vs. siblings like merge_merge_request or approve_merge_request.

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
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.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 the transparency burden. It explicitly states that the tool changes remote GitLab state, requires permissions, and returns errors instead of silently applying invalid requests. This is useful behavioral 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?

The description is concise and front-loaded with the purpose, then covers usage, side effects, and parameter notes. Some boilerplate about group_id and pagination is unnecessary and slightly distracts, but the overall structure is readable and useful.

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 GitLab tool with minimal annotations and no output schema, the description covers what the tool does, when to use it, its side effects, permission requirements, and error behavior. It does not describe the return value, but an agent can still invoke it correctly with the provided 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 all six parameters. The description adds only general ID-format guidance that largely restates the project_id schema entry, and it mentions group_id and pagination fields that do not actually appear in 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 names a specific verb and resource: 'Update a discussion note on a merge request.' It also distinguishes itself from sibling tools by explicitly saying to use this tool for an existing resource and to choose create tools for new resources and note tools 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 gives clear when-to-use guidance: existing resource vs. create vs. note-only text. It also warns about the necessary project/group permission and the possibility of validation, conflict, permission, or rate-limit errors, which helps the agent decide whether 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.

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
project_idYesProject ID or complete URL-encoded path to project
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 openWorldHint annotation, the description discloses that the tool 'changes remote GitLab state', requires 'the necessary project or group permission', and details error behavior ('returns validation, conflict, permission, or rate-limit errors instead of silently applying an invalid request'). This significantly adds to the annotation's minimal information.

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 and front-loads the core purpose. The third sentence is long and packs multiple pieces of guidance (permission, errors, parameter usage), making it slightly dense but still efficient. Overall, it is well-structured without unnecessary repetition.

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 that there is no output schema, the description covers the essential aspects: mutation side effects, permission requirements, error types, and parameter formatting. It does not describe a success response, but that is not strictly necessary. The differentiation from siblings and the mention of potential errors make it sufficiently complete for an update 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 repeats the schema's guidance on project_id (numeric ID or URL-encoded path) without adding new meaning. It also mentions 'group_id' which is not in the schema, potentially causing confusion. The generic advice to use identifiers 'exactly as documented' adds little 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 description clearly states the tool's purpose: 'Modify an existing merge request note.' It uses a specific verb (Modify) and resource (merge request note), and explicitly distinguishes it from create and note tools for new or discussion-only resources. This differentiates it from sibling tools like create_merge_request_note and update_merge_request_discussion_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 when to use this tool: for an existing resource, and when not to use it: for a new resource (use create tool) and for discussion-only text (use note tool). It also mentions the requirement for project/group permission, providing context for appropriate invocation.

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
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.3/5.0
Behavior5/5

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

With only openWorldHint in annotations and no read-only/destructive hints, the description carries the disclosure burden. It clearly states the tool mutates remote GitLab state, requires project/group permission, and surfaces validation, conflict, permission, or rate-limit errors instead of silently accepting invalid requests.

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, but the final sentence contains redundant identifier guidance and inaccurate references to group_id and pagination. Not 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?

For a 23-parameter mutation tool with no output schema and minimal annotations, the description covers the critical operational context: existing-resource usage, permission needs, state mutation, and error behavior. The inaccurate group_id/pagination references and lack of partial-update semantics keep it from being 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 no useful parameter meaning and introduces inaccuracies: it mentions group_id and pagination fields that do not exist in the schema. The identifier-format advice merely repeats what the schema already says.

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: 'Update project settings such as description, visibility, default branch, and feature access levels.' This clearly identifies the tool's scope and distinguishes it from issue, merge request, and branch update siblings.

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

Usage 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 an existing resource, to choose the corresponding create tool for a new resource, and to use a note tool for discussion-only text. This gives the agent concrete routing guidance and permission requirements.

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

upload_markdownC

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
file_pathYesPath to the file to upload
project_idYesProject ID or URL-encoded path of the project

TDQS

C2.7/5.0
Behavior3/5

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

Annotations only include openWorldHint=true, which is weak. The description adds useful behavioral info: it changes remote GitLab state, requires project/group permission, and returns validation/conflict/permission/rate-limit errors instead of silently applying invalid requests. This is genuinely helpful and goes beyond the thin annotation. However, it doesn't describe what the response is, whether uploads can overwrite, or special constraints beyond errors. Slight credit for adding error semantics, but not deeply rich behavioral disclosure.

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 a single paragraph but contains boilerplate filler ('Use this for the specific operation described; choose a sibling tool when you need a different resource or lifecycle action') that is generic and contributes little. It does front-load the core purpose in the first sentence, and the rest is moderately useful (permission, error behavior, identifier guidance), but there is redundancy and padding that could be tightened. It is not aggressively wordy but not lean either.

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

Completeness2/5

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

The tool has no output schema and only a weak openWorldHint annotation, so the description must carry more weight. It covers permissions and error handling, but missing key context: what the response contains (does it return a markdown link? a file reference?), whether content is required (the schema has no content param—so the API likely expects content in the body), how it relates to 'markdown content' specifically (does it produce an upload URL for markdown?), and whether file_path is local or remote. For a mutation tool with no output schema, this is 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?

Schema description coverage is 100% and the schema documents both parameters clearly (file_path: 'Path to the file to upload', project_id: 'Project ID or URL-encoded path of the project'). The description adds minor value by repeating the instruction to provide numeric ID or URL-encoded path and to use identifiers as documented, but it doesn't add new meaning. It touches on required identifiers and pagination fields ('use required identifiers and pagination fields exactly as documented') which is somewhat generic. Baseline 3 is appropriate because schema carries the burden.

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

Purpose3/5

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

The description starts with 'Upload a file for use in markdown content' which gives a clear verb and resource, but it does not distinguish this from siblings like download_attachment or create_or_update_file. The generic guidance 'choose a sibling tool when you need a different resource or lifecycle action' is template-like and fails to specify what makes this tool unique. It says what it does but not against the specific siblings it competes with.

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 description provides only generic boilerplate ('choose a sibling tool when you need a different resource or lifecycle action') and requirements like permission needs and error behavior. It never states when to use upload_markdown instead of create_or_update_file, push_files, or download_attachment. There is no explicit condition or example of the use case. The guidance is vague and does not help the agent select between closely related tools.

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
project_idYesProject ID or URL-encoded path
include_jobsNoInclude jobs in the lint response

TDQS

A4/5.0
Behavior5/5

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

Annotations already provide readOnlyHint=true, but the description adds meaningful behavioral detail by enumerating specific error conditions (missing resources, invalid identifiers, insufficient permission, rate limits) and confirming no mutation. This goes beyond what annotations convey and helps agents 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 four sentences with front-loaded purpose and no fluff. The parameter guidance sentence is slightly verbose and includes a misreferenced group_id, but overall it remains compact 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?

For a 5-parameter tool with no output schema, the description covers purpose, usage, behavior, and parameter format well. However, it does not describe what a successful validation response looks like, and the group_id inaccuracy plus lack of differentiation from the sibling validator leaves gaps an agent must resolve elsewhere.

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 baseline is 3. The description adds guidance on providing numeric ID or URL-encoded path for project_id, but it also references group_id which does not exist in the schema, introducing a potential misunderstanding. This prevents it from scoring higher.

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 validates GitLab CI/CD YAML content for a project, using a specific verb and resource. It distinguishes from create/update tools by noting it checks without applying, but it does not explicitly differentiate from the similarly named sibling validate_project_ci_lint, 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 explicit guidance to use this tool for validation before applying changes, and says to choose a create or update tool only after validation succeeds. However, it does not mention the sibling validate_project_ci_lint or any exclusion criteria, leaving some ambiguity about when to pick one validator over the other.

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
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.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', aligning with the readOnlyHint annotation. It additionally mentions error conditions: 'missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors.' This goes beyond the annotation but does not describe the success response format, which would be expected without an output 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?

The description is somewhat verbose, containing multiple sentences with some redundancy (e.g., 'read-only' and 'does not mutate' are repeated). However, it is still concise enough and well-structured, covering purpose, usage, and error behavior in a logical order. It could be tightened but is not excessively long.

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 lacks information about the success response format. Since there is no output schema, the user is left unaware of what the tool returns on a successful validation. It mentions error cases but not the successful result structure. This is a clear gap, especially for a tool that is intended to be used before mutations. It could be improved by specifying the response contains validation status and any errors.

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 provides 100% description coverage for all parameters. The description adds a note: 'When `project_id` or `group_id` is accepted, provide the numeric ID or complete URL-encoded path described by the schema', which gives formatting guidance. However, it references 'group_id' which is not in the schema, creating a minor inconsistency. Overall, the parameter meaning is well covered by the schema plus the added context.

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: 'Validate an existing .gitlab-ci.yml configuration for a project.' It also distinguishes it from mutation tools by stating 'Use this to check configuration without applying it; choose a create or update tool only after validation succeeds.' This is specific and 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?

The description explicitly tells when to use the tool: 'Use this to check configuration without applying it; choose a create or update tool only after validation succeeds.' It also notes that it is read-only, implying safe use. However, it does not contrast with the sibling tool 'validate_ci_lint', which might be a project-agnostic variant. Nevertheless, the provided guidance is clear for the primary use case.

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
parent_idNoParent namespace ID; required to correctly resolve paths in nested namespaces where the same path may exist under different parents

TDQS

A4.3/5.0
Behavior4/5

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

The read-only annotations already indicate this is a safe read operation. The description adds useful behavioral context about path ambiguity in nested namespaces, explaining why parent_id matters and how resolution behaves in that scenario.

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 compact sentences. The primary purpose is front-loaded, and the parent_id guidance is included only where it adds necessary operational context. No wasted words.

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 existence-check tool with two fully documented parameters and read-only annotations, the description covers everything needed to call it correctly. The ambiguity handling for nested namespaces is addressed, and no critical usage information 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 schema already documents both parameters thoroughly, with 100% coverage. The description restates parent_id's role in resolving nested namespaces, but does not add significant meaning beyond what the schema already 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 states a specific verb and resource: verifying whether a namespace path exists. It clearly identifies the tool's unique purpose and distinguishes it from sibling tools like get_namespace or list_namespaces by focusing on existence checking.

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 guidance on when to use parent_id, explaining that it is needed for nested namespaces where the same path may exist under different parents. It does not discuss alternatives explicitly, but the usage context is clear enough for correct invocation.

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

No parameters

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and openWorldHint. The description adds useful context about error reporting (missing credentials or GitLab permission failures are reported as errors), which is not covered by 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.

Conciseness5/5

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

Two concise sentences, front-loaded with the core purpose, then usage guidance and error context. No filler 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?

For a simple getter with no parameters and no output schema, the description covers what it does, when to use it, what it returns (current user profile), and how errors behave. Nothing needed 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?

The tool has zero parameters, so schema coverage is trivially 100% and the baseline is 4. No parameter documentation is needed, and the description does not attempt to add anything beyond what applies to a parameterless call.

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 'Get current authenticated user details' with a specific verb and resource. It explicitly contrasts with get_user and get_users for other user lookups, making it clear how to distinguish this tool from its 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?

It provides explicit usage direction: 'Use this to identify the authenticated GitLab user; use get_user or get_users when looking up another user.' This fully specifies when and when not to use it, with named alternatives.

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. 1 tool updatev2.1.63
    • Addedget_merge_request_discussion
  2. 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
  3. 1 tool updatev2.1.57
    • Addedlist_group_merge_requests
  4. 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"
        +]
  5. 1 tool updatev2.1.46
    • Addedlist_group_members
  6. 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
  7. 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
  8. 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"
        +}
  9. 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"
        -  }
        -]
  10. 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
  11. 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"
        +}
  12. 2 tool updatesv2.1.24
    • Changedlist_labels1 field changed
      • changedInput schema / properties / with_counts / description
        Previous value: -"Whether or not to include issue and merge request counts"New value: +"Whether to include issue and merge request counts"
    • Changedmerge_merge_request1 field changed
      • changedInput schema / properties / merge_when_pipeline_succeeds / description
        Previous value: -"If true, the merge request merges when the pipeline succeeds.in GitLab 17.11. Use"New value: +"If true, the merge request merges when the pipeline succeeds. Deprecated in GitLab 17.11. Use `auto_merge` instead."
  13. 6 tool updatesv2.1.21
    • Addedget_protected_branch
    • Changedlist_issues4 fields changed
      • changedInput schema / properties / assignee_id / description
        Previous value: -"Return issues assigned to the given user ID. user id or none or any"New value: +"Return issues assigned to the given user ID (user id, none, or any). Mutually exclusive with assignee_username."
      • changedInput schema / properties / assignee_username / description
        Previous value: -"Return issues assigned to the given username"New value: +"Return issues assigned to the given username. Mutually exclusive with assignee_id."
      • changedInput schema / properties / author_id / description
        Previous value: -"Return issues created by the given user ID"New value: +"Return issues created by the given user ID. Mutually exclusive with author_username."
      • changedInput schema / properties / author_username / description
        Previous value: -"Return issues created by the given username"New value: +"Return issues created by the given username. Mutually exclusive with author_id."
    • Addedlist_protected_branches
    • Addedprotect_branch
    • Addedunprotect_branch
    • Addedupdate_default_branch

TDQS

B3.3/5.0

Scored across 118 tools

Disambiguation2/5

The set contains several clusters of nearly interchangeable tools, especially around notes/discussions (create_note, create_issue_note, create_merge_request_note, create_merge_request_thread, create_merge_request_discussion_note) and diffs (get_merge_request_diffs, list_merge_request_diffs, get_merge_request_file_diff, get_branch_diffs). Descriptions add cross-references, but with 118 tools the boundaries are easy to miss and some pairs remain easy to confuse.

Naming Consistency4/5

Most tools follow a clear snake_case verb_noun pattern (get_commit, create_branch, delete_label, update_issue). Minor deviations like mr_discussions, whoami, health_check, and my_issues break the pattern but are few and still readable.

Tool Count1/5

118 tools is far beyond the well-scoped range and exceeds the 50+ extreme threshold. Even for a broad GitLab API, exposing this many tools at once overwhelms an agent, and discover_tools hints that even more categories can be activated.

Completeness3/5

Core GitLab workflows are well covered: issues, merge requests, branches, files, labels, projects, users, and CI validation. However, several notable lifecycle gaps remain, such as no update/delete for groups, no project deletion, no member mutation, and no pipeline/milestone/release tools in the active set, though discover_tools can activate some of these.

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
    39 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.
    403 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
    37
    MIT