Skip to main content
Glama

GitLab MCP Server

English | 한국어 | 简体中文

New Feature: Dynamic GitLab API URL support with connection pooling! See Dynamic API URL Documentation for details.

Star History Chart

@zereight/mcp-gitlab

A comprehensive GitLab MCP server for AI clients. 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?

  • Broad GitLab coverage — projects, repository browsing, merge requests, issues, pipelines, wiki, releases, tags, labels, milestones, and more

  • 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

Quick start: choose either Personal Access Token or OAuth2 setup below 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.

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": "npx",
      "args": [
        "-y",
        "@zereight/mcp-gitlab",
        "--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)

  • --use-wiki=true - Enable wiki API (replaces USE_GITLAB_WIKI)

  • --use-milestone=true - Enable milestone API (replaces USE_MILESTONE)

  • --use-pipeline=true - Enable pipeline API (replaces USE_PIPELINE)

CLI arguments take precedence over 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_READ_ONLY_MODE=true \
  -e USE_GITLAB_WIKI=true \
  -e USE_MILESTONE=true \
  -e USE_PIPELINE=true \
  -e SSE=true \
  -p 3333:3002 \
  zereight050/gitlab-mcp
{
  "mcpServers": {
    "gitlab": {
      "type": "sse",
      "url": "http://localhost:3333/sse"
    }
  }
}
  • 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_READ_ONLY_MODE=true \
  -e USE_GITLAB_WIKI=true \
  -e USE_MILESTONE=true \
  -e USE_PIPELINE=true \
  -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)

When STREAMABLE_HTTP=true, server-side GITLAB_PERSONAL_ACCESS_TOKEN or GITLAB_JOB_TOKEN require REMOTE_AUTHORIZATION=true or GITLAB_MCP_OAUTH=true.

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

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, HOST, PORT

  • 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

  • GITLAB_MCP_OAUTH

  • GITLAB_OAUTH_CALLBACK_PROXY

  • 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_READ_ONLY_MODE=true \
  -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: Each session is limited to MAX_REQUESTS_PER_MINUTE requests per minute (default 60)

  • 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

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.

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)

  • 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, and pipelines

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 in a GitLab project

  2. create_or_update_file - Create or update a single file in a GitLab project

  3. search_repositories - Search for GitLab projects

  4. create_repository - Create a new GitLab project

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

  6. push_files - Push multiple files to a GitLab project in a single commit

  7. create_issue - Create a new issue in a GitLab project

  8. create_merge_request - Create a new merge request in a GitLab project

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

  10. create_branch - Create a new branch in a GitLab project

  11. get_merge_request - Get details of a merge request with compact deployment summary, behind-count, commit addition summary, and approval summary (Either mergeRequestIid or branchName must be provided)

  12. get_merge_request_diffs - Get the changes/diffs of a merge request (Either mergeRequestIid or branchName must be provided)

  13. list_merge_request_diffs - List merge request diffs with pagination support (Either mergeRequestIid or branchName must be provided)

  14. get_merge_request_conflicts - Get the conflicts of a merge request in a GitLab project

  15. list_merge_request_changed_files - STEP 1 of code review workflow. Returns ONLY the list of changed file paths in a merge request — WITHOUT diff content. Call this first to get file paths, then call get_merge_request_file_diff with multiple files in a single batched call (recommended 3-5 files per call). Supports excluded_file_patterns filtering using regex. (Either mergeRequestIid or branchName must be provided)

  16. get_merge_request_file_diff - STEP 2 of code review workflow. Get diffs for one or more files from a merge request. Call list_merge_request_changed_files first, then pass them as an array to fetch diffs efficiently. Batching multiple files (recommended 3-5) is supported. (Either mergeRequestIid or branchName must be provided)

  17. list_merge_request_versions - List all versions of a merge request

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

  19. get_branch_diffs - Get the changes/diffs between two branches or commits in a GitLab project

  20. update_merge_request - Update a merge request (Either mergeRequestIid or branchName must be provided)

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

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

  23. mr_discussions - List discussion items for a merge request

  24. resolve_merge_request_thread - Resolve a thread on a merge request

  25. update_merge_request_note - Modify an existing merge request thread note

  26. create_merge_request_note - Add a new note to an existing merge request thread

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

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

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

  30. delete_merge_request_note - Delete an existing merge request note

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

  32. get_merge_request_notes - List notes for a merge request

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

  34. list_draft_notes - List draft notes for a merge request

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

  36. update_draft_note - Update an existing draft note

  37. delete_draft_note - Delete a draft note

  38. publish_draft_note - Publish a single draft note

  39. bulk_publish_draft_notes - Publish all draft notes for a merge request

  40. list_merge_requests - List merge requests globally or in a specific GitLab project with filtering options (project_id is now optional)

  41. approve_merge_request - Approve a merge request (requires appropriate permissions)

  42. unapprove_merge_request - Unapprove a previously approved merge request

  43. get_merge_request_approval_state - Get merge request approval details including approvers (uses approval_state when available, otherwise falls back to approvals)

  44. update_issue_note - Modify an existing issue thread note

  45. create_issue_note - Add a new note to an existing issue thread

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

  47. my_issues - List issues assigned to the authenticated user (defaults to open issues)

  48. get_issue - Get details of a specific issue in a GitLab project

  49. update_issue - Update an issue in a GitLab project

  50. delete_issue - Delete an issue from a GitLab project

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

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

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

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

  55. list_issue_discussions - List discussions for an issue in a GitLab project

  56. get_issue_link - Get a specific issue link

  57. create_issue_link - Create an issue link between two issues

  58. delete_issue_link - Delete an issue link

  59. list_namespaces - List all namespaces available to the current user

  60. get_namespace - Get details of a namespace by ID or path

  61. verify_namespace - Verify if a namespace path exists

  62. get_project - Get details of a specific project

  63. list_projects - List projects accessible by the current user

  64. list_project_members - List members of a GitLab project

  65. list_group_projects - List projects in a GitLab group with filtering options

  66. list_group_iterations - List group iterations with filtering options

  67. list_labels - List labels for a project

  68. get_label - Get a single label from a project

  69. create_label - Create a new label in a project

  70. update_label - Update an existing label in a project

  71. delete_label - Delete a label from a project

  72. list_pipelines - List pipelines in a GitLab project with filtering options

  73. get_pipeline - Get details of a specific pipeline in a GitLab project

  74. list_pipeline_jobs - List all jobs in a specific pipeline

  75. list_pipeline_trigger_jobs - List all trigger jobs (bridges) in a specific pipeline that trigger downstream pipelines

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

  77. get_pipeline_job_output - Get the output/trace of a GitLab pipeline job with optional pagination to limit context window usage

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

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

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

  81. retry_pipeline - Retry a failed or canceled pipeline

  82. cancel_pipeline - Cancel a running pipeline

  83. play_pipeline_job - Run a manual pipeline job

  84. retry_pipeline_job - Retry a failed or canceled pipeline job

  85. cancel_pipeline_job - Cancel a running pipeline job

  86. list_deployments - List deployments in a GitLab project with filtering options

  87. get_deployment - Get details of a specific deployment in a GitLab project

  88. list_environments - List environments in a GitLab project

  89. get_environment - Get details of a specific environment in a GitLab project

  90. list_job_artifacts - List artifact files in a job's artifacts archive. Returns file names, paths, types, and sizes

  91. download_job_artifacts - Download the entire artifact archive (zip) for a job to a local path. Returns the saved file path

  92. get_job_artifact_file - Get the content of a single file from a job's artifacts by its path within the archive

  93. list_milestones - List milestones in a GitLab project with filtering options

  94. get_milestone - Get details of a specific milestone

  95. create_milestone - Create a new milestone in a GitLab project

  96. edit_milestone - Edit an existing milestone in a GitLab project

  97. delete_milestone - Delete a milestone from a GitLab project

  98. get_milestone_issue - Get issues associated with a specific milestone

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

  100. promote_milestone - Promote a milestone to the next stage

  101. get_milestone_burndown_events - Get burndown events for a specific milestone

  102. list_wiki_pages - List wiki pages in a GitLab project

  103. get_wiki_page - Get details of a specific wiki page

  104. create_wiki_page - Create a new wiki page in a GitLab project

  105. update_wiki_page - Update an existing wiki page in a GitLab project

  106. delete_wiki_page - Delete a wiki page from a GitLab project

  107. list_group_wiki_pages - List wiki pages in a GitLab group

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

  109. create_group_wiki_page - Create a new wiki page in a GitLab group

  110. update_group_wiki_page - Update an existing wiki page in a GitLab group

  111. delete_group_wiki_page - Delete a wiki page from a GitLab group

  112. get_repository_tree - Get the repository tree for a GitLab project (list files and directories)

  113. list_commits - List repository commits with filtering options

  114. get_commit - Get details of a specific commit

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

  116. list_commit_statuses - List statuses for a specific commit

  117. create_commit_status - Create or update the status of a specific commit

  118. list_releases - List all releases for a project

  119. get_release - Get a release by tag name

  120. create_release - Create a new release in a GitLab project

  121. update_release - Update an existing release in a GitLab project

  122. delete_release - Delete a release from a GitLab project (does not delete the associated tag)

  123. create_release_evidence - Create release evidence for an existing release (GitLab Premium/Ultimate only)

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

  125. list_tags - List repository tags with filtering and pagination support

  126. get_tag - Get details of a specific repository tag

  127. create_tag - Create a new tag in the repository

  128. delete_tag - Delete a tag from the repository

  129. get_tag_signature - Get the signature of a signed tag

  130. get_users - Get GitLab user details by usernames

  131. list_events - List all events for the currently authenticated user

  132. get_project_events - List all visible events for a specified project

  133. upload_markdown - Upload a file to a GitLab project for use in markdown content

  134. download_attachment - Download an uploaded file from a GitLab project by secret and filename

  135. get_work_item - Get a single work item with full details including status, hierarchy (parent/children), type, labels, assignees, and all widgets

  136. list_work_items - List work items in a project with filters (type, state, search, assignees, labels). Returns items with status and hierarchy info

  137. create_work_item - Create a new work item (issue, task, incident, test_case, epic, key_result, objective, requirement, ticket). Supports setting title, description, labels, assignees, weight, parent, health status, start/due dates, milestone, and confidentiality

  138. update_work_item - Update a work item. Can modify title, description, labels, assignees, weight, state, status, parent hierarchy, children, health status, start/due dates, milestone, confidentiality, linked items, and custom fields

  139. convert_work_item_type - Convert a work item to a different type (e.g. issue to task, task to incident)

  140. list_work_item_statuses - List available statuses for a work item type in a project. Requires GitLab Premium/Ultimate with configurable statuses

  141. list_custom_field_definitions - List available custom field definitions for a work item type in a project. Returns field names, types, and IDs needed for setting custom fields via update_work_item

  142. move_work_item - Move a work item (issue, task, etc.) to a different project. Uses GitLab GraphQL issueMove mutation

  143. list_work_item_notes - List notes and discussions on a work item. Returns threaded discussions with author, body, timestamps, and system/internal flags

  144. create_work_item_note - Add a note/comment to a work item. Supports Markdown, internal notes, and threaded replies

  145. get_timeline_events - List timeline events for an incident. Returns chronological events with notes, timestamps, and tags

  146. create_timeline_event - Create a timeline event on an incident. Supports tags: 'Start time', 'End time', 'Impact detected', 'Response initiated', 'Impact mitigated', 'Cause identified'

  147. list_webhooks - List all configured webhooks for a GitLab project or group. Provide either project_id or group_id

  148. list_webhook_events - List recent webhook events (past 7 days) for a project or group webhook. Use summary mode for overview, then get_webhook_event for full details

  149. get_webhook_event - Get full details of a specific webhook event by ID, including request/response payloads

  150. search_code - Search for code across all projects on the GitLab instance (requires advanced search or exact code search to be enabled)

  151. search_project_code - Search for code within a specific GitLab project (requires advanced search or exact code search to be enabled)

  152. search_group_code - Search for code within a specific GitLab group (requires advanced search or exact code search to be enabled)

  153. execute_graphql - Execute a GitLab GraphQL query

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

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

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

The description discloses that the operation changes remote state and requires branch-creation permission, and lists possible errors. However, the readOnlyHint is not present in annotations; the openWorldHint doesn't contradict anything. The description adds behavioral context beyond annotations, but doesn't detail side effects beyond errors. With minimal annotations, it could do slightly more, but it does mention mutation and permission requirements.

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 two sentences, information-dense, front-loaded with purpose and usage. The parameter details are appended at the end but do not bloat. Slight redundancy with schema descriptions for parameters, 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 3 simple parameters, full schema coverage, and no output schema, the description covers purpose, usage alternatives, side effects, permissions, and errors. It lacks explicit mention of return value format, but error list and typical behavior suffice. No output schema means some return detail might be useful, but is 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 coverage is 100%, so the schema documents all three parameters. The description adds minimal extra meaning: it explains that project_id accepts numeric ID or URL-encoded path, branch is the new name, and ref selects the starting revision. This matches schema descriptions, so adds small value but does not exceed baseline.

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

Purpose5/5

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

States a specific verb (create) and resource (branch) and distinguishes from siblings by naming alternatives and noting branch creation is distinct from inspecting or protecting. Clearly identifies the operation's scope.

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

Usage Guidelines5/5

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

Explicitly says when to use and provides alternatives: use get_branch or list_branches to inspect, protect_branch for protection afterward. Also implies when not to use (for inspection). Provides clear context.

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

A4.5/5.0
Behavior4/5

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

Annotations only carry openWorldHint=true, which is minimal. The description adds meaningful behavior details: it changes remote GitLab state, requires permissions, and GitLab returns specific validation/conflict/permission/rate-limit errors rather than silently applying invalid requests. It also notes identifier encoding requirements. It doesn't contradict annotations.

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

Conciseness4/5

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

The description is a single dense block of four sentences, front-loaded with the core action. It's moderately concise but packs a lot of guidance into one paragraph. Could be slightly tighter, but every sentence contributes meaningful routing or behavioral info.

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 10 params (3 required), no output schema, and only openWorldHint annotation, the description covers mutation behavior, error handling, permission needs, and identifier formatting. It doesn't mention return values but that's minor for a state-changing tool. It's reasonably complete for the tool's complexity.

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 describes all 10 parameters with detailed descriptions (100% coverage), so the bar is lower. Still, the description adds useful guidance on project_id/group_id formats and the name/context alias relationship, which supplements the schema. It could go deeper on state values, but the enum handles that.

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 action ('Create or update the status of a commit') with a specific resource ('commit status'), and explicitly contrasts with update/edit tools. It distinguishes from the sibling list_commit_statuses by its mutation-focused wording.

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.' This provides both when-to-use and when-not-to-use guidance, plus a mention of required permissions and covered error cases.

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

A3.7/5.0
Behavior4/5

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

The annotations only include openWorldHint, so the description carries most of the behavioral disclosure burden. It clearly states that this tool changes remote GitLab state, requires project or group permissions, and surfaces validation, conflict, permission, or rate-limit errors instead of silently applying invalid requests. This is useful beyond the structured annotation data, though it doesn't clarify the draft note's unpublished/pending state and its relationship to publishing workflows.

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

Conciseness3/5

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

The description is relatively short and contains only a few sentences, but the final sentence is verbose and introduces references to 'group_id' and 'pagination fields' that are not immediately relevant to this schema. It front-loads the main purpose well, but some content could be tightened for clarity.

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

Completeness3/5

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

The description covers permissions, state mutation, and common error behavior, which is helpful given that no output schema exists. However, for a complex tool with a nested position object, it does not explain the conceptual difference between a draft note and a published merge request note, nor how this tool fits with publish_draft_note and list_draft_notes. It is sufficient for a basic create attempt but incomplete for an agent deciding whether to use this or a sibling 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?

The input schema covers 100% of parameters and already provides detailed descriptions, including strong guidance for nested fields like line_range and line_code. The description only adds a generic instruction about providing numeric IDs or URL-encoded paths, which mostly repeats the schema's project_id description. It does not add meaningful semantics for the other 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?

The description clearly states that this tool creates a draft note for a merge request and explicitly contrasts it with update or edit tools for existing resources. However, it does not differentiate from sibling creation tools like create_merge_request_note or create_merge_request_discussion_note, relying mainly on the word 'draft' in the tool name.

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 a direct usage rule: use this for new resources/actions and switch to an update or edit tool when the resource already exists. It also notes that the operation changes remote GitLab state and requires permissions, but it does not give guidance on when a regular merge request note or a published note would be more appropriate than a draft.

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?

Annotations are sparse (only `openWorldHint`), so the description carries the burden. It states that the operation 'creates remote project data', requires permission, and lists error types (validation, permission, duplicate-related). This goes beyond what the schema or annotations reveal, giving the agent realistic expectations. It could mention reversibility or idempotency, but for a create operation, this is sufficient 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?

The description is two sentences, front-loaded with the purpose ('Create a new issue.'), followed by usage guidance and behavioral notes. Every word earns its place; no filler. The structure makes it easy to scan and act on.

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 complexity (8 params, all schema-documented) and absence of an output schema, the description covers what an agent needs: the action, when to use it (vs. alternatives), a permission prerequisite, and the possible error modes. There is no missing piece that would prevent 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 fully documents all 8 parameters. The description adds no extra parameter-level detail, which matches the baseline of 3. It does not reference any parameter by name, so it provides no additional 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 the crisp statement 'Create a new issue.' and immediately differentiates it from `update_issue` and `create_issue_note` by naming them. The verb-resource pair is exact, and the sibling contrast removes any ambiguity about which tool does what.

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 to open a new issue; use `update_issue` for an existing issue and `create_issue_note` to add discussion without changing issue fields.' This is a clear when-to-use with named alternatives and the condition that selects each. No inference is required.

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

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

Annotations only include openWorldHint: true, which is sparse. The description compensates by disclosing that it changes remote GitLab state, requires permissions, and returns errors instead of silently applying invalid requests. This adds value beyond annotations. However, it doesn't detail side effects like duplicate reactions or rate limits specifics, but it mentions rate-limit errors. With minimal annotation, 3 is fair.

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 packs useful guidance: usage context, permissions, error behavior, and identifier handling. It front-loads the purpose and usage instruction. Could be slightly more concise but each sentence contributes 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 complexity (3 params, all required, no output schema), the description covers usage, permissions, error cases, and parameter details. It lacks explicit examples beyond emoji names and doesn't mention pagination (not applicable here). The sibling list shows many similar emoji tools, but the description helps distinguish by saying 'new resource' vs 'update/edit'. Overall complete for safe 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 three parameters (name, issue_iid, project_id) are documented in the schema. The description adds clarity for name ('e.g. thumbsup') and project_id ('numeric ID or complete URL-encoded path'), but that is already in the schema. It emphasizes providing identifiers as documented, which is marginal. Baseline is 3 because 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?

Description clearly states the action: add an emoji reaction to an issue, with verb 'Add' and specific resource 'emoji reaction to an issue'. It explicitly differentiates from siblings by contrasting with 'create' versus 'update/edit' tools, especially emoji-related tools like list_issue_emoji_reactions and delete_issue_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 Guidelines4/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 for a new resource or action; choose the corresponding update or edit tool when the resource already exists'. It gives context about permission requirements and error handling, but does not explicitly name sibling alternatives or provide exclusions for other create tools like create_merge_request_emoji_reaction. Still clear enough.

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

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

The description discloses that the operation creates remote discussion content, requires note permission, and returns either the note or specific missing-issue/thread/permission errors. Since annotations only include `openWorldHint: true`, this behavioral detail adds meaningful transparency beyond structured data.

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 at three sentences and front-loads the core purpose, but the second sentence partially repeats the first ('Add a note to an issue' vs 'add a note to an existing issue'). Minor redundancy keeps it from being maximally concise.

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

Completeness4/5

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

For a straightforward 5-parameter create operation with no output schema, the description covers the operation's effect, permission requirement, error returns, and alternatives. It does not elaborate on `created_at` behavior, but the schema already describes the parameter.

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

Parameters4/5

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

Schema coverage is 100%, so the schema already documents parameters clearly. The description adds semantic value by tying `discussion_id` to the optional-reply behavior and clarifying the topic of notes versus generic notes, which enriches parameter understanding without repeating 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 verb-resource pair: 'Add a note to an issue,' with an important qualifier, 'optionally replying to a discussion thread.' It distinguishes itself from nearby siblings by explicitly calling out `update_issue` for issue fields and `create_note` for the generic endpoint.

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 and names alternatives: use this for notes on issues, use `update_issue` for issue fields, and use `create_note` only when the generic endpoint is required. This is clear and actionable routing.

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

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

The description transparently notes that the operation changes remote GitLab state and requires appropriate permissions. It also mentions that errors like validation or rate-limit are returned rather than silent failures. This goes beyond the sparse 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.

Conciseness2/5

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

The description is overly verbose with boilerplate about 'use required identifiers and pagination fields exactly as documented,' which is irrelevant since there are no pagination fields. The key purpose is stated first, but the rest contains filler that reduces 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?

It covers the essential aspects: purpose, usage nuance, state change, permissions, and error handling. However, it omits details about the response format and includes irrelevant pagination advice. Given the schema's completeness, the description is adequate but not exhaustive.

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 describes each parameter in detail (e.g., emoji name without colons, IDs). The description only restates the discussion_id condition already present in the schema, adding little new meaning. It also includes generic advice about providing IDs that duplicates 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 function: adding an emoji reaction to an issue note. It also clarifies the nuance about discussion_id for thread replies, 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 Guidelines4/5

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

It provides basic usage guidance, such as using this tool for new reactions and preferring an update tool for existing ones. It also explains when to include discussion_id, which aids in correct invocation. However, it doesn't explicitly distinguish from sibling tools like listing or deleting reactions, but the primary use case is evident.

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

A3.9/5.0
Behavior4/5

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

With annotations present (openWorldHint: true), the description goes beyond by noting that it changes remote GitLab state, requires permissions, and returns specific error types instead of silently applying invalid requests. This is useful context. It does not mention idempotency or reversibility, but given the annotation, the bar is lower. The description adds value.

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

Conciseness4/5

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

The description is a single paragraph but covers multiple aspects: purpose, usage distinction, permissions, errors, and ID handling. It is not overly long, but the sentence structure could be tighter. It front-loads the purpose and usage distinction, which is good. Slight redundancy in mentioning permissions and errors twice, but overall concise enough.

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 create operation with 5 parameters, 100% schema coverage, and no output schema, the description adequately covers purpose, usage, permissions, and error behavior. It does not explain the return value, but since there is no output schema, that is expected. It also does not list prerequisites like existing project existence, but that is implicit. Overall, it is complete 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 each parameter is already documented. The description adds guidance on how to format project_id (numeric ID or URL-encoded path) and emphasizes using exactly as documented for identifiers and pagination fields, but it doesn't add new semantic 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.

Purpose4/5

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

The description states the verb 'Create', the resource 'label', and the container 'project', which is clear. It distinguishes from update/edit tools by indicating when to use the create version. It could be slightly sharper about whether group labels are supported (the description mentions group permission, but the schema only has project_id), but overall the purpose is clear.

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

Usage 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 for a new resource and to choose the update/edit tool when the resource already exists. It also mentions permissions and errors, and provides guidance on how to provide identifiers. However, it does not elaborate on when to use a group path versus a project ID, despite mentioning group permission. This is a minor gap.

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?

The description discloses meaningful behavioral context beyond the sparse `openWorldHint` annotation: it creates remote review state, requires project access, and returns either the new merge request or a validation/permission/branch/duplicate-related error. It does not go into exhaustive detail like reversibility or rate limits, but it gives an agent a clear picture of the operation's side effects and failure modes.

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

Conciseness5/5

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

The description is compact and front-loaded: purpose, usage, then behavioral notes. Every sentence earns its place, and the most decision-relevant information—what the tool does and when to use it—appears first.

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 13 parameters and no output schema, the description provides sufficient context: what the tool does, when to use it, required access, and likely error categories. It does not detail the response structure beyond 'returns the new merge request', but that is still enough for an agent to understand the primary outcome. Minor gaps like exact permission scopes and response fields prevent a perfect score.

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 well. The description adds only a small amount of semantic framing around branches ('existing source branch' and 'target branch'), but it does not meaningfully improve on the property descriptions already present in the input 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: 'Create a new merge request' and specifies the exact operation scope: opening a merge request from an existing source branch to a target branch. It also explicitly differentiates from the sibling `update_merge_request`, so an agent can distinguish it from 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?

It gives direct usage guidance: use this tool to open a new merge request, and use `update_merge_request` after the request exists. This explicit when-to-use and when-to-use-alternative guidance leaves little room for confusion.

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?

With only a minimal `openWorldHint` annotation, the description carries the burden of disclosing side effects. It explicitly states that the operation 'creates remote review content', requires note permission, and can return errors for missing discussion/position/permission. This goes beyond a simple 'creates a note' by specifying permission and failure modes. A slight gap is the lack of mention of reversibility or notification side effects, but the core mutation behavior is clear.

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 extraneous words. It front-loads the core action, then provides sibling differentiation and side-effect/error information. Every sentence earns its place, and the structure 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 tool's moderate complexity (5 params, all required ones documented), the description covers the essential aspects: what it does, when to use it, permission requirements, and return/error behavior. It does not have an output schema, so mentioning the return value is helpful. It could arguably include more about the `created_at` parameter, but the schema covers that. Overall, an agent has enough context 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 all parameters have descriptive text. The description does not add extra meaning beyond the schema, such as explaining the relationship between discussion_id and merge_request_iid. However, since the schema already covers parameter semantics, a baseline of 3 is appropriate—the description simply doesn't need to repeat it.

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

Purpose5/5

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

The description clearly states the action ('Add a new discussion note to an existing merge request thread') and differentiates it from siblings by explicitly naming `create_merge_request_thread` and `create_merge_request_note` with their distinct purposes. This removes any ambiguity about which tool to use.

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 and when-not-to-use guidance by stating 'Use this to reply inside an existing merge request discussion' and contrasting it with starting a new thread or a top-level note. It also mentions permission requirements and possible errors, giving the agent a clear decision frame.

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

create_merge_request_emoji_reactionA

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

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

TDQS

A4.8/5.0
Behavior5/5

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

Annotations provide only openWorldHint=true, which is a minimal signal. The description compensates strongly by stating 'It changes remote GitLab state', requiring permissions, and listing possible error types (validation, conflict, permission, rate-limit). This discloses side effects and failure modes beyond what annotations 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.

Conciseness4/5

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

The description is longer than typical but every sentence adds value: purpose, usage, behavior, error handling, and parameter guidance. It is front-loaded with the core action and example. Slightly verbose in the final sentence about pagination, which isn't relevant to this tool, but overall it is well-structured and not redundant.

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

Completeness5/5

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

Given the tool's simplicity (3 params, no output schema), the description covers all necessary aspects: purpose, usage distinctions, side effects, permissions, error behavior, and parameter format. An agent has everything needed to call this tool correctly without further inference. The mention of pagination is a minor irrelevant addition, but completeness is high.

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% (all 3 parameters have descriptions). The description adds context on how to supply project_id ('numeric ID or complete URL-encoded path') and emphasizes using required identifiers exactly as documented. While schema already covers parameter meaning, the description reinforces format nuances, providing marginal added value above 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 ('Add an emoji reaction') and resource ('merge request') with concrete examples ('thumbsup, rocket, eyes'). It clearly distinguishes from related tools by noting when to use update/edit tools instead, so an agent can differentiate it from siblings like create_merge_request_note_emoji_reaction or update_merge_request without needing to inspect schemas.

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

Usage Guidelines5/5

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

The description explicitly provides usage context: 'Use this for a new resource or action; choose the corresponding update or edit tool when the resource already exists.' It also mentions permission requirements and error behavior, giving clear guidance on when and how to invoke this tool versus alternatives. No ambiguity remains.

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

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

The description discloses several important behavioral aspects that go beyond the single annotation `openWorldHint: true`. It notes that the operation 'changes remote GitLab state', which implies it is not a read-only operation, and it warns that GitLab returns validation, conflict, permission, or rate-limit errors instead of silently applying an invalid request. It also mentions required permissions ('requires the necessary project or group permission'). The annotation `openWorldHint` is vague, but the description adds concrete behavioral transparency about state change and error handling. There is no contradiction; the description does not contradict 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 a single paragraph of moderate length, but it is dense with useful information. It front-loads the primary purpose ('Add a new note to a merge request') and then provides usage, behavior, and parameter guidance. There is no redundancy; every sentence contributes to the agent's understanding. It loses one point because it is not as tightly structured as a two-sentence description could be, and it mixes several pieces of guidance in one run-on sentence, 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 that the tool has only three parameters, all required, with 100% schema coverage, and no output schema, the description covers the essential usage, behavior, and parameter directives. It does not explicitly state the return value (e.g., the created note object), but since there is no output schema, the description could have mentioned that it returns the note, but it does not. However, the description is sufficient for an agent to call the tool correctly: it knows what it does, when to use it, what parameters to provide, and what errors to expect. The lack of return-type disclosure is a minor gap, but the overall completeness is high.

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 description adds meaningful parameter guidance beyond the schema. For `project_id` and `group_id`, it explicitly instructs to 'provide the numeric ID or complete URL-encoded path described by the schema', which reinforces the schema but adds usage nuance. It also says 'use required identifiers and pagination fields exactly as documented,' adding a caution. However, the description doesn't explain the meaning of each parameter beyond what the schema already says (e.g., `body` is the content, `merge_request_iid` is the IID). Given that schema coverage is 100%, the description supplements it with usage directives, so a score of 4 is appropriate.

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

Purpose4/5

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

The description clearly states the verb ('Add') and resource ('new note to a merge request'), which distinguishes it from update/edit tools that modify an existing resource. It also explicitly names its sibling purpose by pointing to the 'update or edit tool when the resource already exists.' However, the distinction from `create_merge_request_note` versus `create_merge_request_discussion_note` or `create_draft_note` is not directly addressed, though the 'new note' language and the mention of `merge_request_iid` suggest a direct note rather than a thread or draft.

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

Usage Guidelines4/5

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

The description provides explicit when-to-use guidance: 'Use this for a new resource or action; choose the corresponding update or edit tool when the resource already exists.' This clearly routes the agent away from update scenarios, but it does not explicitly list alternative tools (like `create_merge_request_discussion_note` or `create_draft_note`) where a note might also be created. The guidance is clear but not exhaustive regarding sibling alternatives, so it earns a 4 rather than a 5.

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

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

Annotations only include openWorldHint: true, which indicates the tool may have side effects. The description goes beyond this by stating 'It changes remote GitLab state and requires the necessary project or group permission' and that GitLab returns errors for invalid requests. This adds useful context about side effects and error behavior, but it does not detail specific error types or rate limits, and the description does not contradict annotations, so 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 a single paragraph of about 3 sentences. It is focused and avoids fluff. The key purpose is front-loaded. However, it packs a lot of information into a long first sentence that could be broken up for readability, so it's a 4 rather than a 5.

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 context, permission requirements, and error behavior. It also mentions discussion_id handling and identifier formats. However, it lacks details on what the response looks like (though no output schema is provided) and how the tool behaves regarding idempotency or rate limits. Given the complexity of the GitLab API, a bit more detail would improve completeness, so it's a 3.

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 for all 5 parameters, so the schema already documents each parameter. The description adds some context about using discussion_id for thread replies and mentions using numeric IDs or URL-encoded paths for project_id, but these are already partially in the schema descriptions. Since coverage is high, baseline is 3, and the description provides minimal extra value beyond what the schema says.

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 'Add an emoji reaction to a merge request note', specifying the verb (add), resource (emoji reaction), and target (merge request note). It distinguishes from sibling tools by mentioning discussion_id for thread replies, but there are many closely related sibling tools (create_merge_request_emoji_reaction) that are not explicitly differentiated, so it loses a point.

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 on when to use this tool: 'Use this for a new resource or action; choose the corresponding update or edit tool when the resource already exists.' It also mentions the need for discussion_id for thread replies and correct identifiers. However, it does not explicitly name alternative sibling tools or list conditions for when not to use it, so it's a 4 not a 5.

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

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

The annotations only provide `openWorldHint: true`, so the description carries the burden of behavioral disclosure. It states that the operation creates remote review content, requires note permission, and returns the discussion or a position/permission/validation error. This gives useful side-effect and failure-mode context, though it does not cover 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?

The description is three sentences with no filler: purpose first, sibling routing second, and behavioral disclosure third. Every sentence earns its place and the structure supports quick scanning by an agent.

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

Completeness4/5

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

The tool has a complex nested `position` schema and no output schema, so the description reasonably covers the action, permission requirement, and return/error behavior. A minor gap is that it does not mention that `position` is optional for MR-level discussions, though this is inferable from the required field list in the schema.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema fully documents the parameters, including the nested `position` object. The description adds no per-parameter meaning beyond what the schema already provides, which is acceptable at the baseline for full coverage.

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

Purpose5/5

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

The description clearly states a specific action ('Create a new thread') and a specific resource ('on a merge request'). It also differentiates itself from the sibling tools `create_merge_request_note` and `create_merge_request_discussion_note`, so an agent can select it over alternatives 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 explicitly says when to use this tool: to start a review thread on a merge request. It also names the sibling tools for the alternative cases — unthreaded notes and replies to existing threads — leaving no ambiguity about routing.

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

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

Annotations only include openWorldHint, which provides no behavioral safety info. The description fills this gap by disclosing that the operation creates remote discussion content, requires note permission, and returns the created note or errors. This is more than typical and covers key behavioral aspects though not exhaustive details like rate limits or reversibility.

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 the core purpose in the first and usage guidance in the second. Nothing extraneous; front-loaded with the key information. Highly efficient and clear.

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 no output schema and minimal annotations, the description covers purpose, usage distinction, permission requirement, and return behavior. It doesn't mention potential side effects or edge cases, but it's sufficiently complete for an agent to use 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 all parameters are already well-described. The description doesn't add significant semantics beyond the schema, but it does hint at the permission requirement and return behavior, which is a minor addition. Baseline of 3 is appropriate when schema carries the 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?

Description clearly states the action ('Create a new note (comment)') and specifies the target resources (issue or merge request). It also distinguishes from siblings by naming alternatives for threaded replies, making its scope 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 states when to use this tool (top-level comment) and when not to (threaded replies), naming the two sibling tools that should be used instead. This leaves no ambiguity about selection.

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

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

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

Beyond the minimal `openWorldHint` annotation, the description discloses the requirement for repository write permission and the possible outcomes ('returns the commit result or a conflict/validation error'). This adds meaningful behavioral context not present in 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 compact and well-structured: it opens with the core functionality, then provides usage guidance, encoding details, and permission/error expectations in a logical order without superfluous text.

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

Completeness4/5

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

Given the schema richness and the presence of sibling tools, the description covers the essential usage context (single file vs multi-file, permission requirement, error behavior). It does not mention the file move/rename capability via `previous_path`, but that is adequately described in the schema, so the description remains sufficiently complete for effective selection and invocation.

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

Parameters3/5

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

The input schema already provides comprehensive descriptions for all parameters (100% coverage), including the encoding default and the purpose of commit_id/last_commit_id. The tool description adds little beyond repeating the encoding default, so it 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 states a specific verb and resource: 'Create or update a file in a GitLab project.' It also differentiates from the sibling tool `push_files` by explicitly mentioning when to use each, 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 clearly instructs when to use this tool versus `push_files': 'Use this for a single repository file... use `push_files` for a multi-file commit.' This provides explicit selection criteria among alternatives.

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

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

Annotations only include openWorldHint, with no readOnly or destructive hints, so the description carries the burden. The description discloses that the tool changes remote GitLab state, requires permissions, and returns validation/conflict/permission/rate-limit errors rather than silently failing. It does not describe the return payload, but no output schema is present.

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 useful and front-loaded with purpose and behavior, but the third sentence is boilerplate referencing nonexistent parameters and pagination. The description is longer than necessary for a create tool whose schema already documents every parameter.

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

Completeness4/5

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

The description covers what the tool does, when to use it, its side effects, and error handling, which is sufficient given the fully described schema. It omits return format, but since there is no output schema and errors are explicitly addressed, no critical context 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?

Input schema descriptions cover 100% of parameters with clear meanings, so the baseline is 3. The description's third sentence references project_id/group_id and pagination fields that are not in the schema, adding no value and potentially distracting from 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 opens with the imperative 'Create a new GitLab project,' clearly stating the verb and resource. It explicitly contrasts with update/edit tools for existing resources, making selection unambiguous among 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 gives an explicit condition: use this tool for a new resource, and choose the corresponding update or edit tool when the resource already exists. It also states permission requirements and error outcomes, providing clear when-to-use guidance.

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

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

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

Annotations already declare destructiveHint=true, so the description extends that by detailing the permanent nature ('permanently removes a remote branch'), the permission requirement ('requires branch-delete permission'), and the possible error cases (protected-branch, missing-resource, or permission error). This adds meaningful context beyond the structured 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 a single, information-dense sentence that front-loads the purpose ('Delete branch from project') and then provides usage and behavioral details. It is somewhat long but every clause earns its place, avoiding 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 destructive tool with no output schema, the description covers the return type (deletion result or errors), permission requirements, and pre-condition checks (confirm branch, use get/list first). Nothing essential is missing for an agent to call it correctly.

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

Parameters3/5

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

Schema coverage is 100% with both parameters documented. The description does not add extra semantic detail about the parameters themselves beyond what the schema 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?

The description clearly states 'Delete branch from project' with a specific verb and resource. It distinguishes itself from sibling tools like get_branch and list_branches by focusing on deletion, leaving no ambiguity about its purpose.

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

Usage Guidelines5/5

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

Explicit usage guidance is provided: '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.' This gives clear when-to-use and when-not-to-use instructions, naming alternatives directly.

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

A3.5/5.0
Behavior1/5

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

The description contradicts the annotation readOnlyHint: true. The description claims the tool 'changes only the session's tool registry' which is a state-changing action, whereas readOnlyHint indicates a read-only operation. This conflict undermines trust.

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 somewhat verbose, repeating the category list and the idea of changing the registry. It could be tightened without loss of meaning, but it 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 covers the main functionality and how to invoke it. However, the contradiction with readOnlyHint creates confusion about side effects, and there is no mention of the response format. Overall it is mostly complete but not fully reliable.

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 description covers 100% of the parameter (category), and the description adds examples of valid values. While this is helpful, it does not significantly enhance the schema's explanation, so a 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 tool's purpose: to discover and activate additional tool categories. It lists the available categories and distinguishes between listing and activating, providing a clear verb-resource relationship.

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 the tool: 'Use this when a needed opt-in category is not currently exposed.' It also explains the two modes (omit category to list, provide category to activate), leaving no ambiguity.

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

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 valuable behavior: "missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors." This goes beyond the structured hints 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 concise at three sentences and front-loads the core purpose. However, the final sentence contains generic parameter/pagination guidance that is not tool-specific, adding slight noise.

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

Completeness4/5

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

For a simple 2-parameter read-only getter with full schema coverage and helpful annotations, the description covers usage, error behavior, and return payload highlights. The only minor gap is the lack of a concrete response shape, but the description's high-level return details are sufficient 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 description coverage is 100% and both parameters already have clear descriptions. The description's parameter sentence is generic boilerplate ("When `project_id` or `group_id` is accepted...") and adds little beyond the schema, especially since `group_id` is not even a parameter of this tool.

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 begins with a specific verb and resource: "Get branch details (commit, protection status)". It also distinguishes itself from discovery tools by stating "Use this for a known resource or result; choose the corresponding list or search tool when you need to discover multiple 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?

Explicitly states when to use the tool (known resource) and when to use alternatives (discovering multiple resources). It also adds contextual constraints like read-only behavior and error conditions, giving an agent clear routing guidance.

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

get_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

A4.5/5.0
Behavior4/5

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

The description discloses it is read-only and does not mutate data, and explicitly lists error conditions: missing resources, invalid identifiers, insufficient permission, and rate limits. While annotations already provide readOnlyHint, the description adds the error behavior specifics which is genuinely useful beyond the annotations. 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?

Three sentences, no redundancy. It front-loads the purpose, then routes alternatives, then disclaimers and identifier guidance. Every sentence adds distinct value; could be slightly trimmed but 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?

For a diff tool with 5 params and no output schema, the description covers usage discrimination, error behavior, and parameter use. It doesn't describe return format, which is implied by the tool name, and annotations cover read-only and open-world hints. Slightly short of a 5 because it doesn't hint at what the diff result contains (e.g., files changed, patches), but strong overall.

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

Parameters4/5

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

Schema coverage is 100%, so this is the baseline 3. The description adds value by noting 'provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented' — reinforcing correct identifier format and emphasizing exact documentation for required/pagination fields. This is useful guidance beyond the schema alone.

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

Purpose5/5

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

The description clearly states 'Get diffs between two branches or commits' — a specific verb and resource. It differentiates from siblings by explicitly contrasting with list/search tools for discovery, and its name distinguishes it from get_merge_request_diffs and related MR diff 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?

Explicitly instructs when to use this tool ('Use this for a known resource or result') versus alternatives ('choose the corresponding list or search tool when you need to discover multiple resources'). This is 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.

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.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, and the description reinforces that reading does not mutate GitLab data. It additionally documents error behavior for missing resources, invalid identifiers, insufficient permission, and rate limits, which is useful context beyond the annotations. It stops short of fully describing the success return shape, but the safety and error profile is well covered.

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 well-structured: it leads with purpose, gives usage guidance, then states safety and error semantics. Each sentence contributes useful information without wasted 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?

The description is sufficiently complete for a simple, read-only 3-parameter tool: it covers intended use, error behavior, and identifier requirements. The absence of an output schema means the return shape is not explicitly described, but the tool name and 'Get details of a specific commit' provide enough context for selection and invocation.

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

Parameters3/5

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

The schema documents all 3 parameters, so the description does not need to repeat their semantics. It only adds generic ID/path guidance and mentions 'project_id or group_id' even though only project_id appears in this schema, plus a generic pagination reference. Schema coverage is sufficient, so the baseline score 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?

The description states a clear verb+resource combination: 'Get details of a specific commit.' It also communicates that the tool is for a known commit or result rather than for discovery, which distinguishes it from sibling 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?

The description gives explicit guidance: use this tool when you have a known resource or result, and use the corresponding list or search tool when you need to discover multiple resources. This clearly routes an agent between get_commit and discovery-oriented siblings like list_commits.

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

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

Beyond the readOnlyHint annotation, the description discloses error behavior: 'missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors.' It also reaffirms read-only status and adds context about pagination fields. This goes beyond the annotation by specifying failure modes, which is valuable for an agent.

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

Conciseness5/5

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

The description is compact: a purpose statement, a usage guideline, a behavioral/error note, and a parameter format note. It is front-loaded with the core action and no unnecessary fluff. Each sentence earns its place, though the group_id reference could be seen as extraneous, it doesn't bloat length.

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

Completeness4/5

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

For a read-only getter with no output schema, the description covers purpose, usage, error conditions, and parameter format. It doesn't describe the return shape, but that's not required when no output schema exists. The mention of pagination fields implies some control over result size. The group_id off-schema reference is a minor completeness gap, but overall it's sufficient.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all parameters. The description adds a note about providing 'numeric ID or complete URL-encoded path' for project_id, which reinforces schema but adds little new meaning. It also mentions group_id, which is not in this schema, potentially confusing. Overall, marginal value beyond 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 function: 'Get changes/diffs of a specific commit.' It uses a specific verb and resource, and differentiates from discovery tools by saying to use list/search tools for multiple resources. This distinguishes it from siblings like list_commits or 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?

Explicitly and concisely directs usage: '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, though it doesn't name specific sibling tools, the principle is unambiguous.

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

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

Annotations indicate read-only and open world. Description adds detail on output structure (each entry maps a range to commit with id, author, authored_date, message), which is beyond schema.

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

Conciseness5/5

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

Two sentences, front-loaded with purpose and key detail, no extraneous information.

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

Completeness5/5

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

For a read-only tool with no output schema, the description adequately explains return values and parameter behavior, making it 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%. Description reinforces range parameter usage but does not add significant new meaning beyond 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 retrieves git blame for a file at a given ref, and distinguishes it from file-content tools by specifying it returns commit mappings for line ranges.

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

Usage Guidelines3/5

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

The description mentions using range_start/range_end to limit blame, but does not explicitly guide when to use this tool over siblings like get_file_contents or get_commit.

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

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

The readOnlyHint annotation already covers the read-only nature, and the description reinforces it without contradiction. It adds useful behavioral context beyond annotations by describing the slim response default, the full_response toggle, and the fact that missing resources, invalid identifiers, insufficient permissions, and rate limits surface as errors. The 'slim milestone' phrasing is slightly ambiguous and keeps this from 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 and response behavior are front-loaded in the first two sentences, which is good. However, the later sentences include redundant read-only reinforcement and generic parameter boilerplate that do not earn their place for this specific tool. It reads somewhat like a template rather than a tightly scoped definition.

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?

There is no output schema, so the description correctly explains the default slim response and the full_response option, which is the key missing information. It also covers error behavior and read-only semantics. The ambiguity around 'slim milestone' versus the actual issue object leaves a small gap in 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 schema already documents all three parameters well. The description mostly restates what the schema says about project_id and full_response, and it adds generic boilerplate about group_id and pagination that does not directly apply to this tool. No meaningful semantic value is added 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: 'Get details of a specific issue.' It also differentiates from sibling discovery tools by stating it is for a known resource or result, while list/search tools are for discovering multiple resources. This is sufficient for an agent to distinguish get_issue from list_issues and related mutation 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?

The description explicitly says to use this tool when you already know the resource or result, and to choose the corresponding list or search tool when discovery is needed. It does not name specific sibling tools, but the guidance is clear enough to route the agent correctly. A named alternative would have made it fully explicit.

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_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 provide readOnlyHint=true and openWorldHint=true, but the description adds valuable behavioral context: it confirms no mutation of GitLab data and enumerates error conditions (missing resources, invalid identifiers, insufficient permission, rate limits). This goes beyond the annotation signal.

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

Conciseness4/5

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

The description is front-loaded with purpose and usage, and each sentence earns its place. It loses a point for boilerplate phrases like 'when project_id or group_id is accepted' and 'use required identifiers and pagination fields exactly as documented', which are not tailored to this specific tool.

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

Completeness4/5

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

For a simple two-parameter read-only tool without an output schema, the description covers purpose, when to use it, read-only behavior, error cases, and identifier format. It does not describe the response shape, but the stated output ('access levels, force push settings') partially compensates.

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 and branch_name. The description adds some format guidance ('numeric ID or complete URL-encoded path'), but the 'group_id' and 'pagination fields' references are generic and not applicable to this tool's 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 opens with a specific verb and resource, 'Get details of a single protected branch', and names the distinguishing content (access levels, force push settings). It clearly differentiates from the sibling list_protected_branches by emphasizing 'single' and directing discovery to 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?

Explicitly states when to use this tool: 'Use this for a known resource or result', and names the alternative: 'choose the corresponding list or search tool when you need to discover multiple resources.' This is direct, actionable routing guidance.

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

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

Annotations already declare readOnlyHint and openWorldHint, so safety is covered. The description adds valuable context beyond that: it states that version lookup failures do not fail the health check and those fields are omitted, and it clarifies it does not mutate state. It does not contradict the annotations.

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

Conciseness4/5

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

The description is moderately lengthy but well-structured: it leads with the primary purpose, explains version behavior, provides usage guidance, and closes with non-mutation. Each sentence adds information; no filler. It could be tightened slightly but is certainly 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 parameterless tool with no output schema, the description covers what the tool returns ('server/authentication status plus GitLab version details when available') and its failure semantics. An agent has enough to call it correctly. It does not specify exact response structure, but that is not required given the absence of an output schema.

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 no parameters (schema coverage 100%), so the baseline is 4. The description correctly notes that it accepts no input and focuses on what the call does. It doesn't need to add parameter details since none exist.

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 verifies server connectivity and authentication, and also reports GitLab version details. It uses specific verbs and resources (server status, authentication, version) and distinguishes itself from whoami by contrasting the goal (server status vs user identity). This makes 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 says 'Use this to verify server connectivity and authentication before making GitLab requests; use `whoami` when the authenticated user's identity is the goal.' This provides direct when-to-use and when-not-to-use guidance, naming the alternative tool. 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.

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

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

The description explicitly states 'It is read-only and does not mutate GitLab data' and lists error conditions ('missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors'). This goes beyond the readOnlyHint annotation and provides 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.

Conciseness2/5

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

The description is verbose and repetitive. For example, it states 'It is read-only and does not mutate GitLab data' and later repeats similar guidance about identifiers. It could be shortened to the core purpose and a brief usage note. The lack of conciseness reduces 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?

It covers the key aspects: purpose, usage distinction, read-only nature, error behavior, and parameter handling. It does not explain the return format, but since no output schema is provided, that's acceptable. It is relatively complete given the tool's scope.

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

Parameters3/5

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

The schema covers 100% of parameters with descriptions, so the baseline is 3. The description adds only a generic reminder about project_id/group_id and pagination, which is largely redundant with the schema. It does not clarify any parameter semantics 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 clearly states 'List statuses for a commit' – a specific verb, resource, and scope. It also explicitly contrasts with a 'get tool' for a single resource, distinguishing it from potential sibling tools like get_commit or get_merge_request_status.

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

Usage Guidelines4/5

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

It provides direct guidance: 'Use this for a collection of resources; choose the corresponding get tool when you already know the single resource to inspect.' This is helpful, though it doesn't name a specific alternative tool. It also mentions pagination and required identifiers, but in a generic way.

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 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)
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.3/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, so the 'does not mutate GitLab data' sentence aligns and adds value beyond the annotation. Additionally, it discloses the error behavior for missing resources, invalid identifiers, insufficient permission, and rate limits, which is valuable context not present in annotations. It also notes that when project_id or group_id is accepted, the caller must provide numeric ID or URL-encoded path as per schema. This goes beyond annotations. No contradiction: the description says read-only, and annotation says readOnlyHint=true. This is consistent and transparent.

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

Conciseness4/5

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

The description is a single paragraph of moderate length but packs essential information: primary purpose, default scope, usage guidance, read-only nature, error behavior, and parameter clarification. It front-loads the most important info (default scope, collection vs single) and then covers safety and parameter details. It could be broken into two sentences for readability, but it is not overly verbose. Every sentence adds value. Slightly long but acceptable for 21 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 that the tool has 21 parameters with 100% schema coverage, the description doesn't need to explain each parameter, and the schema already does that. The description covers the critical usage distinctions (collection vs single, scope default, error behavior, identifier format) that are not in the schema. It doesn't describe return format or pagination specifics, but with no output schema, the description could have mentioned typical response structure, but the error behavior and scope guidance cover the main operational needs. Missing explicit rate-limit handling beyond 'returned as errors', but that is a minor gap. Overall, well-covered for a complex list tool.

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?

Since schema coverage is 100%, the baseline is 3, and the description adds value by explaining the default scope and the use of required identifiers and pagination fields. It also explains the context for project_id and group_id acceptance, which clarifies the semantics beyond the schema descriptions. The description highlights the mutual exclusivity of author_id/author_username and assignee_id/assignee_username, which is already in the schema but reinforces it. It also mentions the pagination fields 'as documented', which adds a hint. This goes beyond the bare schema, so a 4 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 ('List') and a resource ('issues'), and immediately clarifies the default scope (created by current user) and the key scope distinction ('all'). It also differentiates itself from the corresponding get tool, and given siblings like list_merge_requests, get_issue, my_issues, this is a clear collection-style listing tool for issues. The name 'list_issues' is directly explained and the main variation (scope) is called out.

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 for collections and to choose the corresponding get tool when a single resource is already known, which directly guides the selection between this and get_issue. It also explains that missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors, which sets expectation for error handling. However, it doesn't explicitly enumerate all alternative tools or conditions—like when to use my_issues versus this—but the scope parameter and the mention of project_id/group_id covering cross-project listing provide adequate context. No explicit 'when not to use' beyond the single-resource example, but the guidance is strong.

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.4/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 statement is redundant. However, the description adds valuable behavioral details beyond annotations: it is paginated, returns pipeline records or specific GitLab errors (invalid identifiers, missing resources, rate limits), and implies a safe operation. This goes beyond the structured annotations.

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

Conciseness5/5

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

Two concise sentences with no filler. The purpose and primary differentiator are front-loaded, and the alternative tool is named up front. Every sentence carries meaningful 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 list endpoint with no output schema, the description adequately states what is returned ('pipeline records or GitLab errors') and covers key behaviors (pagination, access requirement). It does not mention ordering or response format details, but for a straightforward list tool, this is sufficient.

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

Parameters3/5

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

Schema description coverage is 100%, so all parameters are already documented in the schema. The description does not add extra semantics for individual parameters beyond what the schema provides. The mention of pagination and project access reinforces existing schema info but doesn't provide new parameter-specific details, 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 clearly states the action ('List') and the resource ('pipelines for a merge request'), and explicitly distinguishes it from the project-wide alternative `list_pipelines`. It is unambiguous about the scope (one MR) and includes pagination, making it easy to select among the many merge-request-related siblings.

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

Usage Guidelines5/5

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

It explicitly tells the agent when to use this tool vs. `list_pipelines` ('for project-wide pipeline filtering') and states the prerequisite 'requires project access'. This gives direct, actionable guidance on alternative selection and preconditions.

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_issuesB
Read-only

List issues assigned to the authenticated user. Use this for the specific operation described; choose a sibling tool when you need a different resource or lifecycle action. 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 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

B3.4/5.0
Behavior4/5

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

The description explicitly states the tool is read-only and does not mutate GitLab data, aligning with the readOnlyHint annotation. It also details error scenarios (missing resources, invalid identifiers, insufficient permission, rate limits) that are not covered by the annotations alone. This adds valuable 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 is wordy, with repetitive phrases like 'use this for the specific operation described' and 'use required identifiers and pagination fields exactly as documented.' It could be more concise while retaining essential information. The structure is linear but not particularly streamlined.

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?

While the description mentions read-only behavior and error types, it lacks information about the expected output format or structure, especially given there is no output schema. It also does not clarify pagination behavior beyond a vague reference. This leaves the agent with incomplete context for handling the response.

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 provides full coverage and descriptions for all 11 parameters, so the description adds little beyond mentioning that project_id can be omitted to search across all accessible projects, which is already in the schema. The reference to 'group_id' in the description is not present in the schema, slightly reducing clarity. Since schema coverage is 100%, the baseline of 3 is appropriate.

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

Purpose4/5

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

The description clearly states the tool's purpose: listing issues assigned to the authenticated user. This distinguishes it from general issue-listing tools like 'list_issues' by focusing on the current user's assignments. The phrase 'the specific operation described' is somewhat redundant but does not obscure the core functionality.

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

Usage Guidelines3/5

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

The description advises to use this tool for the specified operation and to select a sibling tool for different resources or lifecycle actions. While this is explicit, it lacks concrete distinction from closely related tools like 'list_issues' or 'get_issue'. The guidance is somewhat generic and could benefit from specifying when 'my_issues' is preferred over alternatives.

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

protect_branchA
Destructive

Protect a repository branch (set push/merge/unprotect access levels). Use this to create or update protection rules for a branch or wildcard; use get_protected_branch to inspect existing rules first. The operation changes who may push, merge, or unprotect, may enable force-push or code-owner settings, requires maintainer-level permission, and returns the protection rule or a validation/permission error.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoDeprecated alias for branch_name; prefer branch_name for consistency
project_idNoProject 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.2/5.0
Behavior4/5

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

Annotations already disclose destructiveHint=true and openWorldHint=true, so the bar is lowered. The description adds value beyond annotations by disclosing that 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'. This is meaningful operational context on top of the structured annotations. No contradiction found.

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 efficiently structured sentences with zero filler. Purpose is front-loaded, succeeded by usage direction, then behavioral notes. Every clause earns its place; permission requirement and return/error behavior are packed into the final sentence without 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 complex 8-parameter mutation tool with no output schema, the description covers the essentials: the operation's scope, the permission prerequisite, force-push/code-owner side effects, and the return type or error. The 'inspect first' guidance rounds out the workflow. Minor gap: it does not enumerate all side-effect flags or clarify the deprecation relationship between `name` and `branch_name`, but the schema covers 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 the schema already documents all 8 parameters in detail (including access-level integer meanings and defaults). The description adds only a high-level mention of 'push/merge/unprotect access levels' and 'force-push or code-owner settings', which restates rather than extends the schema. Baseline 3 is appropriate when the schema carries the 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?

States a specific verb and resource ('Protect a repository branch') with a concrete description of the effect ('set push/merge/unprotect access levels'). Explicitly names the sibling `get_protected_branch` to distinguish inspection from mutation, and the existence of `unprotect_branch` in the sibling list provides further contrast. An agent can clearly tell this tool from related ones without opening schemas.

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

Usage Guidelines4/5

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

Gives explicit when-to-use guidance ('Use this to create or update protection rules for a branch or wildcard') and instructs the agent to inspect first ('use `get_protected_branch` to inspect existing rules first'). Also states the prerequisite permission ('requires maintainer-level permission'). It does not explicitly contrast with `unprotect_branch`, but the directional guidance to the sibling is strong and actionable.

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

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

The description discloses that the tool writes repository history, requires repository write permission, and returns validation/conflict/protected-branch errors — behavior that complements the `destructiveHint: true` annotation. It clarifies the permission mode quirk where delete/move are rejected, which adds real context beyond the annotation booleans. However, it does not elaborate on the recoverability/irreversibility of the write.

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 around five sentences and stays dense without fluff. The purpose is front-loaded, the sibling reference comes early, and the operational details are grouped at the end. Minor gains remain possible by trimming the permission-mode detail that is already in the schema.

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

Completeness5/5

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

With no output schema present, the description properly states the return shape ('commit result or a validation, conflict, or protected-branch error'). It covers prerequisites (write permission, selected branch) and edge cases (permission-mode restrictions) — nothing critical is missing for an agent 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 is 3. The description restates the per-file `action` default and the permission-mode interaction, but that exact information already appears in the `files` parameter's description. It adds no new meaning beyond the schema.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Push multiple files in a single commit.' It clearly distinguishes this tool from its sibling `create_or_update_file` by stating the condition for using one over the other (single path vs. multiple files), so an agent can select it correctly without inspecting the schema.

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

Usage Guidelines5/5

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

Directs the agent to use `create_or_update_file` when only one path is involved, which is explicit when-to-use vs. when-not-to-use guidance. The atomicity and batch semantics are also stated, so the selection criteria between the two siblings are fully transparent.

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

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

Annotations already flag destructive and open-world behavior, but the description goes further by specifying the nature of the change ('changes repository security controls'), the permission requirement, and error scenarios ('missing branch or policy forbids the change'). This adds value beyond the annotations and fully prepares the agent for side effects and failure modes.

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

Conciseness4/5

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

The description is compact at three sentences, front-loaded with the core action. However, there is minor redundancy: the first and second sentences both express 'remove protection from a previously/existing branch.' This slight repetition could be tightened without losing meaning, but it remains 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 simple two-parameter tool with no output schema, the description covers key aspects: the operation's purpose, permission requirements, and possible failure outcomes. It does not specify the exact success return value, but the mention of 'returns the result or an error' is adequate for an agent to call it correctly. The description is sufficiently complete for this tool's complexity.

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

Parameters3/5

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

Schema description coverage is 100%, with both parameters (project_id and branch_name) already well-documented. The description adds no additional parameter semantics, but per the baseline rule for high schema coverage, a score of 3 is appropriate. The description does not need to repeat what the schema already states.

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

Purpose5/5

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

The description clearly states the action: 'Remove protection from a previously protected branch.' It distinguishes from the sibling 'protect_branch' by explicitly noting that protect_branch changes access levels rather than removing the rule. This gives an agent a precise mental model of what the tool does 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?

The description explicitly instructs when to use it ('Use this to remove protection from an existing branch') and when not to ('use protect_branch to change access levels without removing the rule'). It also warns that permission to manage protected branches is required, providing clear preconditions for invocation.

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

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

Beyond the annotations (destructiveHint, openWorldHint), the description discloses side effects on clone/MR/CI defaults, permission requirements (project-maintainer), and expected returns (updated project or validation/permission error). This adds meaningful behavioral 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.

Conciseness4/5

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

The description is two sentences, with the core purpose and alternative front-loaded. The second sentence packs multiple clauses (side effects, permissions, returns) into a single long sentence, but it remains efficient and contains no filler. Slight density prevents a 5.

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 with no output schema, the description covers all essential operational details: the action, the alternative tool, side effects, permission requirements, and expected outcomes. Nothing an agent 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?

The input schema describes both parameters with 100% coverage (project_id and default_branch). The description adds no parameter-specific detail beyond what the schema already states, 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 states a specific verb (change) and resource (the default branch of a project), and explicitly contrasts it with the sibling create_branch tool. This makes the tool's purpose unambiguous and easily distinguished from alternatives without consulting 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?

It explicitly instructs when to use this tool versus create_branch, and provides context about the operation's effect on project defaults. The guidance is direct and leaves no ambiguity about which sibling to select.

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

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

The description discloses the critical behavioral facts: it modifies the issue description when not dry-running, requires issue-edit permission, and returns either a patch result or a mismatch/validation/permission error. It also explains dry_run's preview behavior. Since annotations carry only openWorldHint (with no readOnly or destructive hints), the description correctly assumes the burden of disclosure. It could add details about reversibility, but the main side effects are covered.

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

Conciseness5/5

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

The description is front-loaded with the core verb and resource, then moves to purpose, usage guidance, and finally behavioral notes. Every sentence serves a distinct purpose without redundancy. It's a compact paragraph that an agent can parse quickly and without ambiguity.

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?

Because there is no output schema, the description dutifully explains the return value ('patch result or a mismatch/validation/permission error'). It covers the primary use case, key options, and permission requirements. It could explicitly name update_issue as the alternative for full updates and elaborate on when to use each patch_type, but the core information an agent needs to call it correctly is present.

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

Parameters4/5

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

Schema coverage is 100%, so the parameters are already documented, giving a baseline of 3. The description adds value by explaining the role of dry_run and create_note, and how patch_type maps to 'search/replace or unified diff'. It also mentions token reduction, which contextualizes the tool's purpose. The allow_multiple parameter is not highlighted, but the schema explains it; overall the description goes 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 precise verb 'Apply' and resource 'patch to an issue description', and explicitly names the two patch formats (search/replace, unified diff). It also states the intended benefit (token reduction) and clearly differentiates this from full-description replacement tools like update_issue. This is far from a tautology and gives an agent an unambiguous understanding of 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?

The description gives explicit strategical guidance: use dry_run for uncertain patches, create_note when an audit summary is wanted, and positions the tool for targeted changes. Though it doesn't explicitly mention update_issue as an alternative, the phrase 'targeted' implies that larger or full changes are handled elsewhere. This is sufficient to route an agent to the right action.

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_idNoThe ID of a thread note
resolvedNoResolve or unresolve the note
issue_iidNoThe IID of an issue
project_idNoProject ID or complete URL-encoded path to project
discussion_idNoThe ID of a thread

TDQS

A4.5/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 specific permissions, and returns validation/conflict/permission/rate-limit errors rather than silently failing. This goes beyond the sparse openWorldHint annotation and gives agents realistic expectations of side effects and failure modes.

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

Conciseness4/5

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

Three sentences with clear flow: purpose, usage alternative, and key constraints. The conditional phrasing for project/group IDs is slightly verbose but acceptable. It is well-paced and not 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?

For a 6-parameter mutation tool with no output schema, the description covers purpose, when to use, side effects, permissions, and parameter formatting. It does not detail param interdependencies, but that is not critical given the schema's 100% coverage and the tool's straightforward nature.

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 instructing how to provide project_id/group_id (numeric ID or URL-encoded path) and reminding agents to follow schema documentation for required identifiers and pagination. This is helpful over the raw 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 'Modify an existing issue thread note' — a specific verb and resource. It explicitly differentiates from create and discussion-only note tools, so an agent can select this tool 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?

It explicitly states when to use this tool (existing resource) versus alternatives ('choose the corresponding create tool for a new resource and a note tool for discussion-only text'). It also adds permission and error-handling context, making usage boundaries clear.

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_idNoThe ID of a thread note
resolvedNoResolve or unresolve the note
project_idNoProject ID or complete URL-encoded path to project
discussion_idNoThe ID of a thread
merge_request_iidNoThe IID of a merge request

TDQS

A4.5/5.0
Behavior4/5

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

The description goes beyond the sparse annotations (only openWorldHint: true) by disclosing that the tool mutates state, requires project or group permissions, and lists possible error types ('validation, conflict, permission, or rate-limit errors'). It also explains that invalid requests are not silently applied. This adds meaningful behavioral context, though it does not mention idempotency, side effects on threads, or the expected 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.

Conciseness4/5

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

The description is four sentences, each serving a purpose: purpose, usage guidance, behavioral context, and parameter tips. It is front-loaded with the core purpose and avoids redundancy. It could be slightly more concise, but the information density is high 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 mutation tool with six parameters and no output schema, the description covers purpose, usage, behavior, and parameter format. It lacks explicit mention of the return value or specific effects like the 'resolved' parameter, but the schema already covers that. Given the complexity, it is reasonably complete, though a brief note on expected response would strengthen it.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3. The description adds value by explaining how to provide identifiers: 'provide the numeric ID or complete URL-encoded path described by the schema' and advises to 'use required identifiers and pagination fields exactly as documented.' This helps clarify parameter syntax beyond the schema's simple descriptions, though it does not elaborate on all six parameters individually.

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: 'Update a discussion note on a merge request.' It clearly differentiates from create and note tools by saying 'Use this for an existing resource; choose the corresponding create tool for a new resource and a note tool for discussion-only text.' This is a precise and unambiguous purpose that distinguishes it from many similar siblings like update_merge_request_note and create_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?

Explicitly provides when-to-use guidance: 'Use this for an existing resource; choose the corresponding create tool for a new resource and a note tool for discussion-only text.' It also mentions that it 'changes remote GitLab state' and requires permissions, and advises on error behavior. This is clear and actionable for selecting the correct tool among many note-related siblings.

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

A3.5/5.0
Behavior4/5

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

The description discloses that it changes remote state, requires permissions, and may return specific error types (validation, conflict, permission, rate-limit). This adds value beyond the openWorldHint annotation and sets expectations for 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.

Conciseness3/5

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

The description is moderately concise but has some redundancy (e.g., 'use required identifiers and pagination fields exactly as documented' adds little). It front-loads the core purpose, but the latter half is somewhat generic. Could be tightened.

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, but description covers error behavior (validation/conflict/permission/rate-limit). However, it doesn't clarify what 'modify' does (e.g., replaces body only, supports replies?), and note_id semantics are vague ('The ID of a thread note' doesn't explain how to obtain it). Mixed 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 descriptions already cover all parameters (100% coverage), so baseline is 3. The description adds a note about numeric ID or URL-encoded path, which is helpful but only partially matches schema (mentions group_id which isn't in schema). No additional semantic value for body, note_id, or merge_request_iid.

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 'Modify an existing merge request note' with a specific verb and resource, which immediately conveys the tool's purpose. It also distinguishes from create tools by explicitly mentioning 'existing' vs. new resources, though some siblings like update_merge_request thread notes exist.

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

Usage Guidelines3/5

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

The description says to use this for existing resources and to choose a create tool instead for new notes, which provides some differentiation. However, it doesn't explicitly exclude other related tools like get_merge_request_note or delete_merge_request_note, leaving the 'when not to use' partly ambiguous.

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

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

The openWorldHint annotation is thin, so the description carries the burden — and it delivers. It discloses remote state mutation, the permission prerequisite, and a specific error taxonomy (validation, conflict, permission, rate-limit) rather than silent application of invalid requests. This side-effect and failure-mode disclosure goes well beyond what the annotation provides.

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 compact and front-loads purpose before usage and behavior. However, the clause 'use required identifiers and pagination fields exactly as documented' is template noise here, since this tool has zero required parameters and no pagination fields. A tight edit removing that filler would earn a higher 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 23-parameter mutation tool with only openWorldHint set, the description covers purpose, when to use it, side effects, permissions, and error behavior — a lot of ground. The main gap is no mention of the response shape, which is more noticeable in absence of an output schema. Overall it's well matched to the tool's complexity.

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

Parameters3/5

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

Schema coverage is 100%, so the baseline is 3, and the description adds genuinely useful guidance on the project_id format (numeric ID or complete URL-encoded path). However, it references group_id and pagination fields that don't exist in this 23-parameter schema, slightly muddying the otherwise clean support. The correct baseline plus the small inconsistency balance out to a 3.

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

Purpose4/5

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

The description names a specific verb (update) and resource (project settings) and enumerates concrete settings (description, visibility, default branch, feature access levels), making the purpose immediately clear. It differentiates from create and note tools, though not by a specific sibling name. This slightly generic reference to 'the corresponding create tool' keeps it from 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 Guidelines5/5

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

Explicitly states when to use the tool ('for an existing resource') and names the alternative categories ('choose the corresponding create tool for a new resource and a note tool for discussion-only text'). It also warns about permissions and error conditions, giving the agent full decision context. This is exactly the level of routing guidance needed for a 100+ sibling toolset.

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

A3.9/5.0
Behavior4/5

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

Beyond the readOnlyHint annotation, the description adds concrete error behavior: missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. It also asserts that the tool 'does not mutate GitLab data,' which is consistent with and reinforces the readOnlyHint rather than 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?

Three sentences with the core purpose front-loaded in the first sentence. The text is compact and useful overall, though the final sentence introduces redundancy and a slightly distracting group_id/pagination 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 five-parameter, read-only validation tool with no output schema, the description covers the essential context: the validation workflow, error behavior, read-only semantics, and identifier usage. The main gap is that it does not describe the shape of a successful validation response, but the purpose of the tool makes the return role largely inferable.

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

Parameters3/5

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

Schema coverage is 100%, so every parameter is already documented and the baseline is 3. The description's advice about numeric IDs or URL-encoded project paths largely repeats the schema's project_id description, and the mentions of group_id and pagination fields are confusing because neither appears in this input 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?

States a specific verb and resource: it validates GitLab CI/CD YAML content for a project. The description clearly distinguishes this from create/update tools by emphasizing validation without applying, but it does not explicitly differentiate it from the closely named sibling 'validate_project_ci_lint', so an agent must infer the difference from the 'content' parameter.

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 provides a validation-first workflow: 'Use this to check configuration without applying it; choose a create or update tool only after validation succeeds.' This tells the agent when the tool fits in the sequence. However, it does not give exclusions or explicitly compare against the sibling validate_project_ci_lint, so the routing guidance is strong 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.

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

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

Annotations already indicate readOnlyHint=true and openWorldHint=true, so the description is not required to restate safety. However, it does not describe the return value (e.g., boolean or status) which would be helpful given the absence of 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.

Conciseness5/5

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

Two sentences, no redundant information, front-loads the main purpose and then adds the scoping guidance efficiently.

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 simple and annotated with readOnlyHint/openWorldHint, the description is sufficient. It could mention the return format but overall it provides needed context for correct usage.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3. The description adds value by explaining why parent_id is needed for nested namespaces, going beyond the schema description.

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

Purpose5/5

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

The description clearly states 'Verify if a namespace path exists' with a specific verb and resource, distinguishing it from siblings like get_namespace that retrieve details rather than check existence.

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 parent_id ('required for nested namespaces where the same path may exist under different parents'), providing clear context though it does not explicitly state when not to use the tool.

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

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. Dates show when Glama detected each change.

  1. 1 tool updatev2.1.57
    • Addedlist_group_merge_requests
  2. 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"
        +]
  3. 1 tool updatev2.1.46
    • Addedlist_group_members
  4. 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
  5. 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
  6. 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"
        +}
  7. 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"
        -  }
        -]
  8. 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
  9. 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"
        +}
  10. 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."
  11. 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
  12. 107 tool updatesv2.1.18
    • Addedapprove_merge_request
    • Addedbulk_publish_draft_notes
    • Addedcreate_branch
    • Addedcreate_commit_status
    • Addedcreate_draft_note
    • Addedcreate_group
    • Addedcreate_issue
    • Addedcreate_issue_emoji_reaction
    • Addedcreate_issue_link
    • Addedcreate_issue_note
    • Addedcreate_issue_note_emoji_reaction
    • Addedcreate_label
    • Addedcreate_merge_request
    • Addedcreate_merge_request_discussion_note
    • Addedcreate_merge_request_emoji_reaction
    • Addedcreate_merge_request_note
    • Addedcreate_merge_request_note_emoji_reaction
    • Addedcreate_merge_request_thread
    • Addedcreate_note
    • Addedcreate_or_update_file
    • Addedcreate_repository
    • Addeddelete_branch
    • Addeddelete_draft_note
    • Addeddelete_issue
    • Addeddelete_issue_emoji_reaction
    • Addeddelete_issue_link
    • Addeddelete_issue_note_emoji_reaction
    • Addeddelete_label
    • Addeddelete_merge_request_discussion_note
    • Addeddelete_merge_request_emoji_reaction
    • Addeddelete_merge_request_note
    • Addeddelete_merge_request_note_emoji_reaction
    • Addeddiscover_tools
    • Addeddownload_attachment
    • Addedfork_repository
    • Addedget_branch
    • Addedget_branch_diffs
    • Addedget_commit
    • Addedget_commit_diff
    • Addedget_draft_note
    • Addedget_file_blame
    • Addedget_file_contents
    • Addedget_issue
    • Addedget_issue_link
    • Addedget_label
    • Addedget_merge_request
    • Addedget_merge_request_approval_state
    • Addedget_merge_request_conflicts
    • Addedget_merge_request_diffs
    • Addedget_merge_request_file_diff
    • Addedget_merge_request_note
    • Addedget_merge_request_notes
    • Addedget_merge_request_version
    • Addedget_namespace
    • Addedget_project
    • Addedget_project_events
    • Addedget_repository_tree
    • Addedget_user
    • Addedget_users
    • Addedhealth_check
    • Addedlist_branches
    • Addedlist_commit_statuses
    • Addedlist_commits
    • Addedlist_draft_notes
    • Addedlist_events
    • Addedlist_group_iterations
    • Addedlist_group_projects
    • Addedlist_issue_discussions
    • Addedlist_issue_emoji_reactions
    • Addedlist_issue_links
    • Addedlist_issue_note_emoji_reactions
    • Addedlist_issues
    • Addedlist_labels
    • Addedlist_merge_request_changed_files
    • Addedlist_merge_request_diffs
    • Addedlist_merge_request_emoji_reactions
    • Addedlist_merge_request_note_emoji_reactions
    • Addedlist_merge_request_pipelines
    • Addedlist_merge_request_versions
    • Addedlist_merge_requests
    • Addedlist_namespaces
    • Addedlist_project_members
    • Addedlist_projects
    • Addedlist_todos
    • Addedmark_all_todos_done
    • Addedmark_todo_done
    • Addedmerge_merge_request
    • Addedmr_discussions
    • Addedmy_issues
    • Addedpublish_draft_note
    • Addedpush_files
    • Addedresolve_merge_request_thread
    • Addedsearch_repositories
    • Addedunapprove_merge_request
    • Addedupdate_draft_note
    • Addedupdate_issue
    • Addedupdate_issue_description_patch
    • Addedupdate_issue_note
    • Addedupdate_label
    • Addedupdate_merge_request
    • Addedupdate_merge_request_discussion_note
    • Addedupdate_merge_request_note
    • Addedupload_markdown
    • Addedvalidate_ci_lint
    • Addedvalidate_project_ci_lint
    • Addedverify_namespace
    • Addedwhoami
  13. 107 tool updatesv2.1.14
    • Removedapprove_merge_request
    • Removedbulk_publish_draft_notes
    • Removedcreate_branch
    • Removedcreate_commit_status
    • Removedcreate_draft_note
    • Removedcreate_group
    • Removedcreate_issue
    • Removedcreate_issue_emoji_reaction
    • Removedcreate_issue_link
    • Removedcreate_issue_note
    • Removedcreate_issue_note_emoji_reaction
    • Removedcreate_label
    • Removedcreate_merge_request
    • Removedcreate_merge_request_discussion_note
    • Removedcreate_merge_request_emoji_reaction
    • Removedcreate_merge_request_note
    • Removedcreate_merge_request_note_emoji_reaction
    • Removedcreate_merge_request_thread
    • Removedcreate_note
    • Removedcreate_or_update_file
    • Removedcreate_repository
    • Removeddelete_branch
    • Removeddelete_draft_note
    • Removeddelete_issue
    • Removeddelete_issue_emoji_reaction
    • Removeddelete_issue_link
    • Removeddelete_issue_note_emoji_reaction
    • Removeddelete_label
    • Removeddelete_merge_request_discussion_note
    • Removeddelete_merge_request_emoji_reaction
    • Removeddelete_merge_request_note
    • Removeddelete_merge_request_note_emoji_reaction
    • Removeddiscover_tools
    • Removeddownload_attachment
    • Removedfork_repository
    • Removedget_branch
    • Removedget_branch_diffs
    • Removedget_commit
    • Removedget_commit_diff
    • Removedget_draft_note
    • Removedget_file_blame
    • Removedget_file_contents
    • Removedget_issue
    • Removedget_issue_link
    • Removedget_label
    • Removedget_merge_request
    • Removedget_merge_request_approval_state
    • Removedget_merge_request_conflicts
    • Removedget_merge_request_diffs
    • Removedget_merge_request_file_diff
    • Removedget_merge_request_note
    • Removedget_merge_request_notes
    • Removedget_merge_request_version
    • Removedget_namespace
    • Removedget_project
    • Removedget_project_events
    • Removedget_repository_tree
    • Removedget_user
    • Removedget_users
    • Removedhealth_check
    • Removedlist_branches
    • Removedlist_commit_statuses
    • Removedlist_commits
    • Removedlist_draft_notes
    • Removedlist_events
    • Removedlist_group_iterations
    • Removedlist_group_projects
    • Removedlist_issue_discussions
    • Removedlist_issue_emoji_reactions
    • Removedlist_issue_links
    • Removedlist_issue_note_emoji_reactions
    • Removedlist_issues
    • Removedlist_labels
    • Removedlist_merge_request_changed_files
    • Removedlist_merge_request_diffs
    • Removedlist_merge_request_emoji_reactions
    • Removedlist_merge_request_note_emoji_reactions
    • Removedlist_merge_request_pipelines
    • Removedlist_merge_request_versions
    • Removedlist_merge_requests
    • Removedlist_namespaces
    • Removedlist_project_members
    • Removedlist_projects
    • Removedlist_todos
    • Removedmark_all_todos_done
    • Removedmark_todo_done
    • Removedmerge_merge_request
    • Removedmr_discussions
    • Removedmy_issues
    • Removedpublish_draft_note
    • Removedpush_files
    • Removedresolve_merge_request_thread
    • Removedsearch_repositories
    • Removedunapprove_merge_request
    • Removedupdate_draft_note
    • Removedupdate_issue
    • Removedupdate_issue_description_patch
    • Removedupdate_issue_note
    • Removedupdate_label
    • Removedupdate_merge_request
    • Removedupdate_merge_request_discussion_note
    • Removedupdate_merge_request_note
    • Removedupload_markdown
    • Removedvalidate_ci_lint
    • Removedvalidate_project_ci_lint
    • Removedverify_namespace
    • Removedwhoami

TDQS

B3.4/5.0
Disambiguation3/5

Many tool clusters have genuinely fuzzy boundaries: get_merge_request_diffs vs list_merge_request_diffs vs get_merge_request_file_diff vs get_branch_diffs are hard to distinguish without reading deeply, and create_note vs create_merge_request_note vs create_issue_note requires careful parsing. However, the descriptions do contain extensive cross-referencing ('use X for thread, Y for flat notes') that mostly rescues an agent from misselection.

Naming Consistency3/5

The dominant verb_noun snake_case pattern is clear, but there are notable violations: `mr_discussions` breaks the list_merge_request_discussions pattern used elsewhere, `whoami` and `health_check` use different shapes, and pluralization is inconsistent (get_merge_request_diff vs get_branch_diffs, get_users vs get_user). Also push_files vs create_or_update_file represent different verb styles for the same logical operation.

Tool Count2/5

At 116 tools, this blows well past any reasonable working set for an agent; even with the discover_tools category gating, the base set includes 8 emoji-reaction tools and dozens of near-duplicate note/discussion variants. The discover_tools mechanism mitigates this somewhat, but the sheer surface area makes tool selection error-prone and costly.

Completeness4/5

The exposed surface is remarkably comprehensive, covering MR lifecycle, approvals, drafts, discussions, emoji, todos, branches, issues, labels, CI validation, and users. Minor gaps exist (no get_pipeline/run_pipeline for full pipeline workflow, no release or milestone operations despite their mention in discover_tools), but the discover_tools mechanism suggests intentional scoping rather than oversight.

Maintenance

ActivityActive
ResponsivenessWithin a week

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    MCP server for interacting with GitLab API, supporting both self-hosted instances and gitlab.com. Provides tools for managing issues, merge requests, code review, pipelines, milestones, releases, search, and file access.
    302
    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
    33
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/zereight/gitlab-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server