gitlab mcp
The GitLab MCP server enables comprehensive interaction with GitLab projects through various operations including:
File Management: Create, update, retrieve, and push files to projects (single files or multiple files in one commit)
Repository Operations: Search, create, fork repositories; create branches; access repository trees
Issue Tracking: Create, update, delete, and manage issues with filtering options, including issue links and labels
Merge Requests: Create, update, and manage merge requests, including discussions, notes, diffs, and threads
Wiki Integration: List, create, update, and delete wiki pages when enabled
Namespaces and Projects: List, verify, and manage namespaces and projects
Security Features: Operate in read-only mode for enhanced security or limited access scenarios
Allows interaction with GitLab repositories including creating/updating files, pushing multiple files, searching repositories, creating repositories, getting file contents, creating issues, creating merge requests, forking repositories, creating branches, getting merge request details and diffs, updating merge requests, and creating notes/comments.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@gitlab mcplist open merge requests for project 123"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
GitLab MCP Server
📖 Documentation → Setup guides, environment variables, and the full tool reference live on the hosted docs site.

@zereight/mcp-gitlab
Agent-workflow-optimized GitLab MCP — manage projects, merge requests, issues, pipelines, wiki, releases, tags, milestones, and more through stdio, SSE, and Streamable HTTP.
Supports PAT, OAuth, read-only mode, dynamic API URLs, and remote authorization for VS Code, Claude, Cursor, Copilot, and other MCP clients.
Why use this GitLab MCP?
232 tools +
discover_tools— start with a small toolset; activate more at runtime without CQRS-style groupingMR 2-step review —
list_merge_request_changed_files→ batchedget_merge_request_file_diffAgent Skill built in — workflow guidance in
skills/gitlab-mcp/Flexible auth — Personal Access Token, local OAuth2 browser flow, MCP OAuth proxy, and per-request remote authorization
Multiple transports — stdio for local clients, SSE for legacy clients, and Streamable HTTP for modern remote deployments
Client-friendly setup — examples for Claude Code, Codex, Antigravity, OpenCode, Copilot, Cline, Roo Code, Cursor, Kilo Code, and Amp Code
Self-hosted ready — works with custom GitLab instances, proxy settings, and dynamic API URL routing
How we compare
@zereight/mcp-gitlab | GitLab MCP A (community CQRS-style) | |
Best for | AI agent workflows | Enterprise multi-instance / grouped tools |
Tool model | ~232 granular tools + | ~50–60 grouped |
MR review | 2-step batched diff | Varies |
Node.js | >=18.17 | Often >=24 |
License | MIT | Varies |
Quick start: choose either Personal Access Token or OAuth2 setup below, install @zereight/mcp-gitlab, and use zereight-mcp-gitlab in your MCP client configuration.
Client Setup Guides
JSON-Based MCP Clients Setup Guide - for Factory AI Droid, OpenClaw, and OpenCode style clients
Related MCP server: gitlab-mcp
Usage
Setup Overview
Authentication Methods
The server supports four authentication methods:
For local/desktop use (most common):
Personal Access Token (
GITLAB_PERSONAL_ACCESS_TOKEN) — simplest setupOAuth2 — Local Browser (
GITLAB_USE_OAUTH) — recommended for better security
For server/remote deployments:
OAuth2 — MCP Proxy (
GITLAB_MCP_OAUTH) — for remote MCP clients such as Claude.aiRemote Authorization (
REMOTE_AUTHORIZATION) — multi-user deployments where each caller provides their own token
Quick setup paths
Claude Code: see Claude Code Setup Guide
VS Code: see VS Code Setup Guide
GitHub Copilot: see GitHub Copilot Setup Guide
Codex: see Codex Setup Guide
Cursor: see Cursor Setup Guide
Factory AI Droid / OpenClaw / OpenCode style clients: see JSON-Based MCP Clients Setup Guide
OAuth browser flow details: see OAuth2 Authentication Setup Guide
OAuth without a localhost callback (SSO, remote shell, background clients): run
zereight-mcp-gitlab auth(GitLab 17.9+ device flow; 17.2–17.8 needoauth2_device_grant_flow), then start the server withGITLAB_USE_OAUTH=true. See standalone device-flow command.
For the simplest local setup, start with a Personal Access Token. For browser-based local auth, use OAuth2. For remote or multi-user deployments, continue to the MCP OAuth and Remote Authorization sections later in this README.
Install the server once:
brew tap zereight/gitlab-mcp https://github.com/zereight/gitlab-mcp
brew install zereight/gitlab-mcp/zereight-mcp-gitlabOr with npm:
npm install -g @zereight/mcp-gitlabOr with Nix, by adding this flake to your own:
# flake.nix
inputs.gitlab-mcp.url = "github:zereight/gitlab-mcp";
# wherever you configure your MCP client:
command = lib.getExe inputs.gitlab-mcp.packages.${system}.default;The store path is pinned by your lock file; update it with nix flake update gitlab-mcp.
The examples use zereight-mcp-gitlab, a less collision-prone alias for the legacy mcp-gitlab binary. If your MCP client cannot find it, use the absolute path from which zereight-mcp-gitlab.
No global install? Pin npx to the previous stable release (the version these docs recommend), for example npx -y @zereight/mcp-gitlab@2.1.57. If you always want the newest release, use npx -y @zereight/mcp-gitlab@latest instead. The server prints a notice to stderr on startup when a newer version is available (disable with GITLAB_DISABLE_VERSION_CHECK=true).
Using CLI Arguments (for clients with env var issues)
Some MCP clients (like GitHub Copilot CLI) have issues with environment variables. Use CLI arguments instead:
{
"mcpServers": {
"gitlab": {
"command": "zereight-mcp-gitlab",
"args": ["--token=YOUR_GITLAB_TOKEN", "--api-url=https://gitlab.com/api/v4"],
"tools": ["*"]
}
}
}Available CLI arguments:
--token- GitLab Personal Access Token (replacesGITLAB_PERSONAL_ACCESS_TOKEN)--api-url- GitLab API URL (replacesGITLAB_API_URL)--read-only=true- Enable read-only mode (replacesGITLAB_READ_ONLY_MODE, deprecated — prefer--permission-mode=readonly)--permission-mode- Permission level:readonly,modify(no delete tools), orfull(replacesGITLAB_PERMISSION_MODE, defaultfull)--use-wiki=true- Enable wiki API (replacesUSE_GITLAB_WIKI, legacy — preferGITLAB_TOOLSETS=wiki)--use-milestone=true- Enable milestone API (replacesUSE_MILESTONE, legacy — preferGITLAB_TOOLSETS=milestones)--use-pipeline=true- Enable pipeline API (replacesUSE_PIPELINE, legacy — preferGITLAB_TOOLSETS=pipelines)--disable-version-check=true- Disable the startup new-version notice (replacesGITLAB_DISABLE_VERSION_CHECK)
CLI arguments take precedence over environment variables.
zereight-mcp-gitlab auth is a subcommand (not an MCP server flag). It runs GitLab device flow and exits. See CLI Arguments.
Fine-grained tool filtering: use
GITLAB_PERMISSION_MODE=modifyto allow create/update while blocking every delete tool (including delete mutations throughexecute_graphqlandpush_filesdelete/moveactions), orGITLAB_PERMISSION_MODE=readonlyfor read-only access. You can also enable toolset groups withGITLAB_TOOLSETS=<group,…>, allow-list individual tools withGITLAB_TOOLS=<tool,…>(e.g. read-only groups plus a few specific write tools), and deny-list by pattern withGITLAB_DENIED_TOOLS_REGEX. The legacyUSE_GITLAB_WIKI/USE_MILESTONE/USE_PIPELINEflags are kept for backward compatibility only. See Tools Reference and Environment Variables.
sse
docker run -i --rm \
-e HOST=0.0.0.0 \
-e GITLAB_PERSONAL_ACCESS_TOKEN=your_gitlab_token \
-e GITLAB_API_URL="https://gitlab.com/api/v4" \
-e GITLAB_PERMISSION_MODE=readonly \
-e GITLAB_TOOLSETS=wiki,milestones,pipelines \
-e SSE=true \
-e SSE_AUTH_TOKEN=your_mcp_sse_token \
-p 3333:3002 \
zereight050/gitlab-mcp{
"mcpServers": {
"gitlab": {
"type": "sse",
"url": "http://localhost:3333/sse",
"headers": {
"Authorization": "Bearer your_mcp_sse_token"
}
}
}
}streamable-http
docker run -i --rm \
-e HOST=0.0.0.0 \
-e REMOTE_AUTHORIZATION=true \
-e GITLAB_API_URL="https://gitlab.com/api/v4" \
-e GITLAB_PERMISSION_MODE=readonly \
-e GITLAB_TOOLSETS=wiki,milestones,pipelines \
-e STREAMABLE_HTTP=true \
-p 3333:3002 \
zereight050/gitlab-mcp{
"mcpServers": {
"gitlab": {
"type": "streamable-http",
"url": "http://localhost:3333/mcp",
"headers": {
"Authorization": "Bearer glpat-..."
}
}
}
}Using MCP OAuth Proxy (GITLAB_MCP_OAUTH)
For server/remote deployments only. This mode requires the MCP server to be deployed with a publicly accessible HTTPS URL. For local/desktop use, see
GITLAB_USE_OAUTHabove.
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 |
|
|
|
Remote MCP OAuth |
|
|
|
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:
A publicly accessible HTTPS server URL (
MCP_SERVER_URL) — use ngrok for local testingA pre-registered GitLab OAuth application with
api(orread_api) scopes — Go toAdmin area→Applications, set Redirect URI to{MCP_SERVER_URL}/callback
Environment Variable | Required | Description |
| ✅ | Set to |
| ✅ | GitLab API base URL |
| ✅ | GitLab OAuth Application ID |
| ✅ | Public HTTPS URL of this MCP server |
| ✅ | Must be |
| optional | Set to |
| optional | Comma-separated scopes (default: |
| optional | Comma-separated group full paths — only members (and subgroup members) may obtain a token (replaces deprecated |
When STREAMABLE_HTTP=true, server-side GitLab credentials (GITLAB_PERSONAL_ACCESS_TOKEN, GITLAB_JOB_TOKEN, GITLAB_AUTH_COOKIE_PATH, or GITLAB_USE_OAUTH) require REMOTE_AUTHORIZATION=true, GITLAB_MCP_OAUTH=true, or STREAMABLE_HTTP_AUTH_TOKEN.
Troubleshooting
Unregistered redirect_uriCheck the
redirect_uriin the browser URL. If it points to a client callback such ashttp://127.0.0.1:xxxxx/.../callback, enable:GITLAB_OAUTH_CALLBACK_PROXY=trueDo 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-mcpMCP 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 |
| ✅ | Set to |
| ✅ | Must be |
| optional | Allow per-request GitLab URL via |
| optional | Comma-separated allowed |
| optional | Allow unauthenticated |
| optional | Allowed public |
| optional | Trust |
GITLAB_ALLOW_UNAUTHENTICATED_TOOL_DISCOVERY=true is intended for MCP gateways
or admin UIs that need to inspect tool metadata before a user provides a GitLab
token. Leave it disabled unless the tool list is safe to expose in your deployment.
When MCP_SERVER_URL is not set, remote download URLs fall back to the local
server address. Set MCP_TRUST_PROXY=true only if the server is reachable through a
trusted reverse proxy and direct client access to the MCP server is blocked.
This enables Express trust proxy for Streamable HTTP and SSE, derives public
download URLs from Forwarded / X-Forwarded-Proto / X-Forwarded-Host /
X-Forwarded-Prefix, and keeps OAuth endpoint rate limiting working when
proxies send X-Forwarded-For with a client port (for example 1.2.3.4:5678).
Existing OAuth+proxy deployments must set this explicitly after the flag was
introduced.
Example request headers:
Private-Token: glpat-xxxxxxxxxxxxxxxxxxxxor using a Bearer token:
Authorization: Bearer glpat-xxxxxxxxxxxxxxxxxxxx⚠️
REMOTE_AUTHORIZATIONis not compatible with SSE transport.STREAMABLE_HTTP=trueis 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_URLLocal OAuth:
GITLAB_USE_OAUTH=true,GITLAB_OAUTH_CLIENT_ID,GITLAB_OAUTH_REDIRECT_URI,GITLAB_API_URLRemote multi-user HTTP:
STREAMABLE_HTTP=true,REMOTE_AUTHORIZATION=true(orGITLAB_MCP_OAUTH=true),MCP_TRUST_PROXY=true(behind a reverse proxy),MAX_REQUESTS_PER_MINUTE=300,MCP_SERVER_URLorMCP_ALLOWED_HOSTS,HOST,PORTMultiple side-by-side deployments: set a distinct
MCP_SERVER_NAMEper instance (e.g.gitlab-selfhosted-readonly) so clients, logs, and telemetry can tell them apartMulti-pod HPA (stateless): above +
OAUTH_STATELESS_MODE=true,OAUTH_STATELESS_SECRET(same across all pods). See Stateless Mode.
Commonly referenced variables:
GITLAB_API_URLGITLAB_PERSONAL_ACCESS_TOKENGITLAB_USE_OAUTHREMOTE_AUTHORIZATIONMCP_TRUST_PROXYMAX_REQUESTS_PER_MINUTEMAX_SESSIONSMCP_ALLOWED_HOSTSMCP_ALLOWED_ORIGINSGITLAB_MCP_OAUTHGITLAB_OAUTH_CALLBACK_PROXYOAUTH_REGISTER_RATE_LIMIT_PER_HOUROAUTH_STATELESS_MODEOAUTH_STATELESS_SECRET
The reference document also covers:
auth and OAuth variables
MCP OAuth proxy variables
project and tool filtering variables
dynamic tool discovery via
discover_tools(on-demand toolset activation)transport and session variables
proxy and TLS variables
For callback proxy mode details, see GitLab MCP OAuth Callback Proxy.
Remote Authorization Setup (Multi-User Support)
When using REMOTE_AUTHORIZATION=true, the MCP server can support multiple users, each with their own GitLab token passed via HTTP headers. This is useful for:
Shared MCP server instances where each user needs their own GitLab access
IDE integrations that can inject user-specific tokens into MCP requests
Setup Example:
# Start server with remote authorization
docker run -d \
-e HOST=0.0.0.0 \
-e STREAMABLE_HTTP=true \
-e REMOTE_AUTHORIZATION=true \
-e GITLAB_API_URL="https://gitlab.com/api/v4" \
-e GITLAB_PERMISSION_MODE=readonly \
-e SESSION_TIMEOUT_SECONDS=3600 \
-p 3333:3002 \
zereight050/gitlab-mcpClient Configuration:
Your IDE or MCP client must send one of these headers with each request:
Authorization: Bearer glpat-xxxxxxxxxxxxxxxxxxxxor
Private-Token: glpat-xxxxxxxxxxxxxxxxxxxxThe 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:
/mcprequests are limited toMAX_REQUESTS_PER_MINUTEper client IP, and per MCP session when using OAuth or remote authorization (default 60). See environment-variables.md.Capacity limit: Server accepts up to
MAX_SESSIONSconcurrent 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).
Go to your GitLab instance → Admin Area > Applications (instance-wide) or User Settings > Applications (personal)
Create a new application with:
Confidential: unchecked
Scopes:
api,read_api,read_user(or whichever scopes you intend to request viaGITLAB_OAUTH_SCOPES)
Save and copy the Application ID — this is your
GITLAB_OAUTH_APP_ID
How it works:
User adds your MCP server URL in Claude.ai
Claude.ai discovers OAuth endpoints via
/.well-known/oauth-authorization-serverClaude.ai registers itself via Dynamic Client Registration (
POST /register) — handled locally by the MCP server (each client gets a virtual client ID)Claude.ai redirects the user's browser to GitLab's login page using the pre-registered OAuth application
User authenticates; GitLab redirects back to
https://claude.ai/api/mcp/auth_callbackClaude.ai sends
Authorization: Bearer <token>on every MCP requestServer 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-mcpFor 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.jsClaude.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 |
| Yes | Set to |
| Yes | Client ID of the pre-registered GitLab OAuth application |
| Yes | Public HTTPS URL of your MCP server; also allowed for |
| Yes | Your GitLab instance API URL (e.g. |
| Yes | Must be |
| No | Comma-separated GitLab scopes to request (e.g. |
| No | Per-IP rolling limit for Dynamic Client Registration ( |
| No | Set |
Important Notes:
MCP OAuth only works with Streamable HTTP transport (
SSE=trueis 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_AUTHORIZATIONmode (SESSION_TIMEOUT_SECONDS,MAX_REQUESTS_PER_MINUTE,MAX_SESSIONS)DCR rate limiting:
POST /registeris limited toOAUTH_REGISTER_RATE_LIMIT_PER_HOURper client IP (default 20/hour). Separate from/mcplimits and GitLab API quotas. See environment-variables.md.Header auth fallback: when
Private-TokenorJOB-TOKENrequest 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: Beareris always treated as an OAuth token — usePrivate-Tokenfor PAT-based header auth.
Agent Skill Files
Pre-built skill files are available in skills/gitlab-mcp/ for AI agents that support skill/instruction loading (Claude Code, GitHub Copilot, Cursor, etc.).
SKILL.md — Core guide (~800 tokens) with toolset overview, key workflows, and parameter hints
reference/ — Detailed workflow docs for code review, merge requests, issues, pipelines, and vulnerability triage
Install with the skills CLI:
npx skills add zereight/gitlab-mcp --skill gitlab-mcp-skillRegister the skill directory in your AI client to get optimal tool usage guidance without relying solely on the full ListTools response.
Tools 🛠️
merge_merge_request- Merge a merge request in a GitLab projectapprove_merge_request- Approve a merge request (requires appropriate permissions)unapprove_merge_request- Unapprove a previously approved merge requestget_merge_request_approval_state- Get merge request approval details including approvers (usesapproval_statewhen available, otherwise falls back toapprovals)get_merge_request_conflicts- Get the conflicts of a merge request in a GitLab projectlist_merge_request_pipelines- List pipelines for a merge request with pagination supportexecute_graphql- Execute a GitLab GraphQL querycreate_or_update_file- Create or update a single file in a GitLab projectsearch_repositories- Search for GitLab projectscreate_repository- Create a new GitLab projectcreate_group- Create a new GitLab group or subgroup (name, path, description, visibility, and optional parent_id)get_file_contents- Get the contents of a file or directory from a GitLab projectpush_files- Push multiple files to a GitLab project in a single commitcreate_issue- Create a new issue in a GitLab projectcreate_merge_request- Create a new merge request in a GitLab projectfork_repository- Fork a GitLab project to your account or specified namespacecreate_branch- Create a new branch in a GitLab projectget_branch- Get branch details (commit, protection status)list_branches- List branches in project with search filterdelete_branch- Delete branch from projectlist_protected_branches- List protected branches in a project, supports search filterget_protected_branch- Get details of a single protected branch (access levels, force push settings)protect_branch- Protect a repository branch (set push/merge/unprotect access levels)unprotect_branch- Remove protection from a previously protected branchupdate_default_branch- Change the default branch of a projectget_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)get_merge_request_diffs- Get the changes/diffs of a merge request (Either mergeRequestIid or branchName must be provided)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)list_merge_request_diffs- List merge request diffs with pagination support (Either mergeRequestIid or branchName must be provided)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)list_merge_request_versions- List all versions of a merge requestget_merge_request_version- Get a specific version of a merge requestget_branch_diffs- Get the changes/diffs between two branches or commits in a GitLab projectupdate_merge_request- Update a merge request (Either mergeRequestIid or branchName must be provided)create_note- Create a new note (comment) to an issue or merge requestcreate_merge_request_thread- Create a new thread on a merge requestresolve_merge_request_thread- Resolve a thread on a merge requestmr_discussions- List discussion items for a merge requestdelete_merge_request_discussion_note- Delete a discussion note on a merge requestupdate_merge_request_discussion_note- Update a discussion note on a merge requestcreate_merge_request_discussion_note- Add a new discussion note to an existing merge request threadcreate_merge_request_note- Add a new note to an existing merge request threaddelete_merge_request_note- Delete an existing merge request noteget_merge_request_note- Get a specific note for a merge requestget_merge_request_notes- List notes for a merge requestupdate_merge_request_note- Modify an existing merge request thread noteget_draft_note- Get a single draft note from a merge requestlist_draft_notes- List draft notes for a merge requestcreate_draft_note- Create a draft note for a merge requestupdate_draft_note- Update an existing draft notedelete_draft_note- Delete a draft notepublish_draft_note- Publish a single draft notebulk_publish_draft_notes- Publish all draft notes for a merge requestlist_merge_request_emoji_reactions- List all emoji reactions on a merge requestlist_merge_request_note_emoji_reactions- List all emoji reactions on a merge request note. Pass discussion_id for discussion thread replies.create_merge_request_emoji_reaction- Add an emoji reaction to a merge request (e.g. thumbsup, rocket, eyes)delete_merge_request_emoji_reaction- Remove an emoji reaction from a merge requestcreate_merge_request_note_emoji_reaction- Add an emoji reaction to a merge request note. Pass discussion_id for discussion thread replies.delete_merge_request_note_emoji_reaction- Remove an emoji reaction from a merge request note. Pass discussion_id for discussion thread replies.update_issue_note- Modify an existing issue thread notecreate_issue_note- Add a new note to an existing issue threadlist_issue_emoji_reactions- List all emoji reactions on an issuelist_issue_note_emoji_reactions- List all emoji reactions on an issue note. Pass discussion_id for discussion thread replies.create_issue_emoji_reaction- Add an emoji reaction to an issue (e.g. thumbsup, rocket, eyes)delete_issue_emoji_reaction- Remove an emoji reaction from an issuecreate_issue_note_emoji_reaction- Add an emoji reaction to an issue note. Pass discussion_id for discussion thread replies.delete_issue_note_emoji_reaction- Remove an emoji reaction from an issue note. Pass discussion_id for discussion thread replies.list_issues- List issues (default: created by current user only; use scope='all' for all accessible issues)my_issues- List issues assigned to the authenticated user (defaults to open issues)get_issue- Get details of a specific issue in a GitLab projectupdate_issue- Update an issue in a GitLab projectupdate_issue_description_patch- Apply a patch (search/replace or unified diff) to an issue description. Reduces token usage by sending only the change instead of the full description. Supportsdry_runto preview andcreate_noteto summarize.delete_issue- Delete an issue from a GitLab projectlist_todos- List GitLab to-do items for the current usermark_todo_done- Mark a GitLab to-do item as donemark_all_todos_done- Mark all pending GitLab to-do items as done for the current userlist_issue_links- List all issue links for a specific issuelist_issue_discussions- List discussions for an issue in a GitLab projectget_issue_link- Get a specific issue linkcreate_issue_link- Create an issue link between two issuesdelete_issue_link- Delete an issue linklist_namespaces- List all namespaces available to the current userget_namespace- Get details of a namespace by ID or pathverify_namespace- Verify if a namespace path existsget_project- Get details of a specific projectlist_projects- List projects accessible by the current userupdate_project- Update project settings such as description, visibility, default branch, and feature access levelslist_project_members- List members of a GitLab projectlist_group_members- List members of a GitLab group with optional name or username searchlist_labels- List labels for a projectget_label- Get a single label from a projectcreate_label- Create a new label in a projectupdate_label- Update an existing label in a projectdelete_label- Delete a label from a projectlist_group_projects- List projects in a GitLab group with filtering optionslist_wiki_pages- List wiki pages in a GitLab projectget_wiki_page- Get details of a specific wiki pagecreate_wiki_page- Create a new wiki page in a GitLab projectupdate_wiki_page- Update an existing wiki page in a GitLab projectdelete_wiki_page- Delete a wiki page from a GitLab projectlist_group_wiki_pages- List wiki pages in a GitLab groupget_group_wiki_page- Get details of a specific group wiki pagecreate_group_wiki_page- Create a new wiki page in a GitLab groupupdate_group_wiki_page- Update an existing wiki page in a GitLab groupdelete_group_wiki_page- Delete a wiki page from a GitLab groupget_repository_tree- Get the repository tree for a GitLab project (list files and directories)list_pipelines- List pipelines in a GitLab project with filtering optionsget_pipeline- Get details of a specific pipeline in a GitLab projectlist_deployments- List deployments in a GitLab project with filtering optionsget_deployment- Get details of a specific deployment in a GitLab projectlist_environments- List environments in a GitLab projectget_environment- Get details of a specific environment in a GitLab projectlist_pipeline_jobs- List all jobs in a specific pipelinelist_pipeline_trigger_jobs- List all trigger jobs (bridges) in a specific pipeline that trigger downstream pipelinesget_pipeline_job- Get details of a GitLab pipeline job numberget_pipeline_job_output- Get the output/trace of a GitLab pipeline job with optional pagination to limit context window usagevalidate_ci_lint- Validate provided GitLab CI/CD YAML content for a projectvalidate_project_ci_lint- Validate an existing.gitlab-ci.ymlconfiguration for a projectlist_ci_catalog_resources- List GitLab CI/CD Catalog resources/components visible to the userget_ci_catalog_resource- Get details for a GitLab CI/CD Catalog resource, including versions and componentscreate_pipeline- Create a new pipeline for a branch or tagretry_pipeline- Retry a failed or canceled pipelinecancel_pipeline- Cancel a running pipelinelist_pipeline_schedules- List pipeline schedules in a project, optionally filtered to active or inactiveget_pipeline_schedule- Get details of a specific pipeline schedule, including its variables and last pipelinelist_pipeline_schedule_pipelines- List the pipelines that a pipeline schedule has triggeredcreate_pipeline_schedule- Create a new pipeline schedule for a branch or tagupdate_pipeline_schedule- Update an existing pipeline scheduledelete_pipeline_schedule- Delete a pipeline scheduleplay_pipeline_schedule- Run a pipeline schedule immediately, without changing its next scheduled runtake_ownership_pipeline_schedule- Take ownership of a pipeline scheduleget_pipeline_schedule_variable- Get a single variable of a pipeline schedulecreate_pipeline_schedule_variable- Create a variable for a pipeline scheduleupdate_pipeline_schedule_variable- Update a variable of a pipeline scheduledelete_pipeline_schedule_variable- Delete a variable from a pipeline scheduleplay_pipeline_job- Run a manual pipeline jobretry_pipeline_job- Retry a failed or canceled pipeline jobcancel_pipeline_job- Cancel a running pipeline joblist_job_artifacts- List artifact files in a job's artifacts archive. Returns file names, paths, types, and sizesdownload_job_artifacts- Download the entire artifact archive (zip) for a job to a local path. Returns the saved file pathget_job_artifact_file- Get the content of a single file from a job's artifacts by its path within the archivelist_merge_requests- List merge requests globally or in a specific GitLab project with filtering options (project_id is now optional)list_group_merge_requests- List merge requests across all projects of a group and its subgroups with filtering optionslist_milestones- List milestones in a GitLab project with filtering optionsget_milestone- Get details of a specific milestonecreate_milestone- Create a new milestone in a GitLab projectedit_milestone- Edit an existing milestone in a GitLab projectdelete_milestone- Delete a milestone from a GitLab projectget_milestone_issue- Get issues associated with a specific milestoneget_milestone_merge_requests- Get merge requests associated with a specific milestonepromote_milestone- Promote a milestone to the next stageget_milestone_burndown_events- Get burndown events for a specific milestonelist_group_milestones- List milestones in a GitLab group with filtering optionsget_group_milestone- Get details of a specific group milestonecreate_group_milestone- Create a new milestone in a GitLab groupedit_group_milestone- Edit an existing group milestonedelete_group_milestone- Delete a milestone from a GitLab groupget_group_milestone_issue- Get issues associated with a specific group milestoneget_group_milestone_merge_requests- Get merge requests associated with a specific group milestoneget_group_milestone_burndown_events- Get burndown events for a specific group milestoneget_users- Get GitLab user details by usernamesget_user- Get user details by IDwhoami- Get current authenticated user detailslist_commits- List repository commits with filtering optionsget_commit- Get details of a specific commitget_commit_diff- Get changes/diffs of a specific commitget_file_blame- Get git blame for a file at a given ref. Each entry maps a contiguous range of source lines to the commit that last changed them (id, author, authored_date, message). Use range_start/range_end to limit blame to specific lines.list_commit_statuses- List statuses for a specific commitcreate_commit_status- Create or update the status of a specific commitlist_group_iterations- List group iterations with filtering optionsupload_markdown- Upload a file to a GitLab project for use in markdown contentdownload_attachment- Download an uploaded file from a GitLab project by secret and filenamehealth_check- Verify server status and authentication; when authenticated, reports GitLab instance version from/api/v4/version(version,revision,enterprise)list_events- List all events for the currently authenticated userget_project_events- List all visible events for a specified projectlist_releases- List all releases for a projectget_release- Get a release by tag namecreate_release- Create a new release in a GitLab projectupdate_release- Update an existing release in a GitLab projectdelete_release- Delete a release from a GitLab project (does not delete the associated tag)create_release_evidence- Create release evidence for an existing release (GitLab Premium/Ultimate only)download_release_asset- Download a release asset file by direct asset pathlist_tags- List repository tags with filtering and pagination supportget_tag- Get details of a specific repository tagcreate_tag- Create a new tag in the repositorydelete_tag- Delete a tag from the repositoryget_tag_signature- Get the signature of a signed tagget_work_item- Get a single work item with full details including status, hierarchy (parent/children), type, labels, assignees, and all widgetslist_work_items- List work items in a project with filters (type, state, search, assignees, labels). Returns items with status and hierarchy infocreate_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 confidentialityupdate_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 fieldsconvert_work_item_type- Convert a work item to a different type (e.g. issue to task, task to incident)list_work_item_statuses- List available statuses for a work item type in a project. Requires GitLab Premium/Ultimate with configurable statuseslist_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_itemmove_work_item- Move a work item (issue, task, etc.) to a different project. Uses GitLab GraphQL issueMove mutationlist_work_item_notes- List notes and discussions on a work item. Returns threaded discussions with author, body, timestamps, and system/internal flagscreate_work_item_note- Add a note/comment to a work item. Supports Markdown, internal notes, and threaded replieslist_work_item_emoji_reactions- List all emoji reactions on a work itemlist_work_item_note_emoji_reactions- List all emoji reactions on a work item note (comment, thread, or thread reply)create_work_item_emoji_reaction- Add an emoji reaction to a work item (e.g. thumbsup, rocket, eyes)delete_work_item_emoji_reaction- Remove an emoji reaction from a work itemcreate_work_item_note_emoji_reaction- Add an emoji reaction to a work item note (comment, thread, or thread reply)delete_work_item_note_emoji_reaction- Remove an emoji reaction from a work item note (comment, thread, or thread reply)get_timeline_events- List timeline events for an incident. Returns chronological events with notes, timestamps, and tagscreate_timeline_event- Create a timeline event on an incident. Supports tags: 'Start time', 'End time', 'Impact detected', 'Response initiated', 'Impact mitigated', 'Cause identified'list_webhooks- List all configured webhooks for a GitLab project or group. Provide either project_id or group_idcreate_webhook- Create a webhook on a GitLab project or groupupdate_webhook- Update an existing project or group webhookdelete_webhook- Delete a project or group webhooklist_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 detailsget_webhook_event- Get full details of a specific webhook event by ID, including request/response payloadssearch_code- Search for code across all projects on the GitLab instance (requires advanced search or exact code search to be enabled)search_project_code- Search for code within a specific GitLab project (requires advanced search or exact code search to be enabled)search_group_code- Search for code within a specific GitLab group (requires advanced search or exact code search to be enabled)list_project_variables- List CI/CD variables for a project with optional environment scope filterget_project_variable- Get a single CI/CD variable from a project by key, with optional environment scope filtercreate_project_variable- Create a new CI/CD variable in a projectupdate_project_variable- Update an existing CI/CD variable in a project, with optional filter to disambiguate by environment scopedelete_project_variable- Delete a CI/CD variable from a project, with optional filter to disambiguate by environment scopelist_group_variables- List CI/CD variables for a group with optional environment scope filterget_group_variable- Get a single CI/CD variable from a group by key, with optional environment scope filtercreate_group_variable- Create a new CI/CD variable in a groupupdate_group_variable- Update an existing CI/CD variable in a group, with optional filter to disambiguate by environment scopedelete_group_variable- Delete a CI/CD variable from a group, with optional filter to disambiguate by environment scopeget_dependency_proxy_settings- Get dependency proxy settings for a group (enabled status, blob count, total size, image prefix, TTL policy)update_dependency_proxy_settings- Update dependency proxy settings for a group (enable/disable, credentials for authenticated Docker Hub pulls)list_dependency_proxy_blobs- List cached dependency proxy blobs for a group with cursor-based paginationpurge_dependency_proxy_cache- Schedule purge of all cached dependency proxy blobs for a grouplist_project_vulnerabilities- List vulnerabilities for a project with optional state, severity, and report type filters (GraphQL-backed, cursor pagination)get_vulnerability- Get full details of a specific vulnerabilitydismiss_vulnerability- Dismiss a vulnerability with a reason (acceptable_risk, false_positive, used_in_tests, mitigating_control, not_applicable) and optional commentconfirm_vulnerability- Confirm a vulnerability as a real finding requiring remediationdiscover_tools- Discover and activate additional tool categories for this session. Available categories: merge_requests, issues, repositories, branches, projects, labels, ci, groups, pipelines, milestones, wiki, releases, tags, users, workitems, webhooks, search, variables, dependency_proxy, vulnerabilities. Already-active categories are listed in the response.
Wiki page titles vs. slugs
GitLab derives a wiki page's slug (its URL, /-/wikis/<slug>) from the page title. Passing title to update_wiki_page / update_group_wiki_page therefore renames the page and changes its URL — for nested pages it can also move the page to a different path — which breaks existing links.
To change only the displayed title while keeping the URL stable, do not pass title. Instead, store the display title in the page content's YAML front matter and update the content:
---
title: My Custom Display Title
---
Page body…GitLab keeps the slug/URL untouched and shows the front-matter title in the UI. Read it back with get_wiki_page using render_html: true, which populates the front_matter field — the plain title field always reflects the slug-derived value.
Testing 🧪
The project includes comprehensive test coverage including remote authorization:
# Run all tests (API validation + remote auth)
npm test
# Run only remote authorization tests
npm run test:remote-auth
# Run all tests including readonly MCP tests
npm run test:all
# Run only API validation
npm run test:integrationAll remote authorization tests use a mock GitLab server and do not require actual GitLab credentials.
Available Tools
117 toolsapprove_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.
| Name | Required | Description | Default |
|---|---|---|---|
| sha | No | The HEAD of the merge request. Optional, but used to ensure the merge request hasn't changed since you last reviewed it | |
| project_id | Yes | Project ID or complete URL-encoded path to project | |
| approval_password | No | Current user's password. Required if 'Require user re-authentication to approve' is enabled in the project settings | |
| merge_request_iid | Yes | The IID of the merge request to approve |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | Summary note body to post on the merge request (GitLab 19.2+) | |
| internal | No | If true, the summary note is internal (GitLab 19.2+, default false) | |
| project_id | Yes | Project ID or complete URL-encoded path to project | |
| reviewer_state | No | Set reviewer review state after publishing (GitLab 19.2+). Does not record a formal approval. Works even with no draft notes. | |
| merge_request_iid | Yes | The IID of a merge request |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | Source branch/commit for new branch | |
| branch | Yes | Name for the new branch | |
| project_id | Yes | Project ID or complete URL-encoded path to project |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | The branch or tag ref | |
| sha | Yes | The commit hash to set the status on | |
| name | No | Status name. GitLab defaults to 'default' when omitted. | |
| state | Yes | Commit status state | |
| context | No | Alias for name. Provide either name or context, not both. | |
| coverage | No | Total code coverage for this status | |
| project_id | Yes | Project ID or complete URL-encoded path to project | |
| target_url | No | Target URL associated with this status | |
| description | No | Short status description | |
| pipeline_id | No | Pipeline ID to attach the status to |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | The content of the draft note | |
| position | No | Position when creating a diff note | |
| project_id | Yes | Project ID or complete URL-encoded path to project | |
| merge_request_iid | Yes | The IID of a merge request | |
| resolve_discussion | No | Whether to resolve the discussion when publishing | |
| in_reply_to_discussion_id | No | The ID of a discussion the draft note replies to |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | The name of the group | |
| path | Yes | The path of the group | |
| parent_id | No | The parent group ID for creating a subgroup | |
| visibility | No | The group's visibility level | |
| description | No | The group's description |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Issue title | |
| labels | No | Array of label names | |
| weight | No | Weight of the issue (numeric, typically hours of work) | |
| issue_type | No | The type of issue. One of issue, incident, test_case or task. | issue |
| project_id | Yes | Project ID or complete URL-encoded path to project | |
| description | No | Issue description | |
| assignee_ids | No | Array of user IDs to assign | |
| milestone_id | No | Milestone ID to assign |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Name of the emoji without colons (e.g. 'thumbsup', 'rocket', 'eyes') | |
| issue_iid | Yes | The IID of an issue | |
| project_id | Yes | Project ID or complete URL-encoded path to project |
TDQS
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.
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.
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.
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.
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.
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_linkA
Create an issue link between two issues. 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.
| Name | Required | Description | Default |
|---|---|---|---|
| issue_iid | Yes | The internal ID of a project's issue | |
| link_type | No | The type of the relation, defaults to relates_to | |
| project_id | Yes | Project ID or URL-encoded path | |
| target_issue_iid | Yes | The internal ID of a target project's issue | |
| target_project_id | Yes | The ID or URL-encoded path of a target project |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses that the operation changes remote GitLab state, requires specific permissions, and returns validation/conflict/permission/rate-limit errors rather than silently failing. This goes beyond the openWorldHint annotation and gives agents a realistic expectation 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loads the core purpose. It includes useful side-effect and error information, but the final sentence about group_id and pagination fields is extraneous and slightly repetitive, reducing overall focus.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description needn't explain return values. It covers side effects, permissions, errors, and usage guidance, which is sufficient for a create operation. It omits edge cases (e.g., self-linking) but these are not critical for basic invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides descriptions for all five parameters (e.g., project_id as 'Project ID or URL-encoded path'), so schema coverage is 100%. The description adds minimal extra meaning, mostly a generic note about providing numeric IDs and pagination, which is redundant with the schema and includes an irrelevant mention of group_id.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it creates an issue link between two issues, a specific verb and resource. Distinguishes from siblings like list_issue_links, get_issue_link, and delete_issue_link, and explicitly instructs to use update tools when the resource already exists.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear when-to-use guidance for new resources, and indicates using update/edit tools for existing ones. Mentions permission requirements and error behavior, but does not name a specific update tool (there is no update_issue_link sibling), and the generic instruction about pagination fields is not applicable here.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | The content of the note or reply | |
| issue_iid | Yes | The IID of an issue | |
| created_at | No | Date the note was created at (ISO 8601 format) | |
| project_id | Yes | Project ID or complete URL-encoded path to project | |
| discussion_id | No | The ID of a thread. If provided, replies to that thread; otherwise creates a top-level note |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Name of the emoji without colons (e.g. 'thumbsup', 'rocket', 'eyes') | |
| note_id | Yes | The ID of a note (comment or thread reply) | |
| issue_iid | Yes | The IID of an issue | |
| project_id | Yes | Project ID or complete URL-encoded path to project | |
| discussion_id | No | The ID of a discussion thread. Required for notes that are discussion replies; omit for top-level notes. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | The name of the label | |
| color | Yes | The color of the label given in 6-digit hex notation with leading '#' sign | |
| priority | No | The priority of the label | |
| project_id | Yes | Project ID or URL-encoded path | |
| description | No | The description of the label |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| draft | No | Create as draft merge request | |
| title | Yes | Merge request title | |
| labels | No | Labels for the MR | |
| squash | No | If true, squash all commits into a single commit on merge. | |
| project_id | Yes | Project ID or complete URL-encoded path to project | |
| description | No | Merge request description | |
| assignee_ids | No | The ID of the users to assign the MR to | |
| reviewer_ids | No | The ID of the users to assign as reviewers of the MR | |
| source_branch | Yes | Branch containing changes | |
| target_branch | Yes | Branch to merge into | |
| target_project_id | No | Numeric ID of the target project. | |
| allow_collaboration | No | Allow commits from upstream members | |
| remove_source_branch | No | Flag indicating if a merge request should remove the source branch when merging. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | The content of the note or reply | |
| created_at | No | Date the note was created at (ISO 8601 format) | |
| project_id | Yes | Project ID or complete URL-encoded path to project | |
| discussion_id | Yes | The ID of a thread | |
| merge_request_iid | Yes | The IID of a merge request |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Name of the emoji without colons (e.g. 'thumbsup', 'rocket', 'eyes') | |
| project_id | Yes | Project ID or complete URL-encoded path to project | |
| merge_request_iid | Yes | The IID of a merge request |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | The content of the note or reply | |
| project_id | Yes | Project ID or complete URL-encoded path to project | |
| merge_request_iid | Yes | The IID of a merge request |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Name of the emoji without colons (e.g. 'thumbsup', 'rocket', 'eyes') | |
| note_id | Yes | The ID of a note (comment or thread reply) | |
| project_id | Yes | Project ID or complete URL-encoded path to project | |
| discussion_id | No | The ID of a discussion thread. Required for notes that are discussion replies; omit for top-level notes. | |
| merge_request_iid | Yes | The IID of a merge request |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | The content of the thread | |
| position | No | Position when creating a diff note | |
| created_at | No | Date the thread was created at (ISO 8601 format) | |
| project_id | Yes | Project ID or complete URL-encoded path to project | |
| merge_request_iid | Yes | The IID of a merge request |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | Note content | |
| project_id | Yes | Project ID or namespace/project_path | |
| noteable_iid | Yes | IID of the issue or merge request | |
| noteable_type | Yes | Type of noteable (issue or merge_request) |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| branch | Yes | Branch to create/update the file in | |
| content | Yes | Content of the file | |
| encoding | No | Content encoding. Use 'base64' for binary files (content must already be base64-encoded). When omitted, GITLAB_REPO_FILE_ENCODING applies. | |
| commit_id | No | Current file commit ID (for update operations) | |
| file_path | Yes | Path where to create/update the file | |
| project_id | Yes | Project ID or complete URL-encoded path to project | |
| previous_path | No | Path of the file to move/rename | |
| commit_message | Yes | Commit message | |
| last_commit_id | No | Last known file commit ID |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Repository name | |
| visibility | No | Repository visibility level | |
| description | No | Repository description | |
| namespace_id | No | Group namespace ID to create the project in. Omit to use the current user's namespace. | |
| initialize_with_readme | No | Initialize with README.md |
TDQS
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.
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.
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.
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.
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.
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_branchADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | Project ID or complete URL-encoded path to project | |
| branch_name | Yes | Name of the branch to delete |
TDQS
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.
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.
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.
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.
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.
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_noteADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | Project ID or complete URL-encoded path to project | |
| draft_note_id | Yes | The ID of the draft note | |
| merge_request_iid | Yes | The IID of a merge request |
TDQS
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.
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.
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.
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.
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.
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_issueADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| issue_iid | Yes | The internal ID of the project issue | |
| project_id | Yes | Project ID or URL-encoded path |
TDQS
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.
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.
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.
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.
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.
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_reactionADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| award_id | Yes | The ID of the emoji reaction to delete | |
| issue_iid | Yes | The IID of an issue | |
| project_id | Yes | Project ID or complete URL-encoded path to project |
TDQS
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.
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.
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.
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.
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.
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_linkADestructive
Delete an issue link. Use this to remove an existing relationship between two issues; use list_issue_links or get_issue_link to verify the link first. The operation changes issue relationships, requires issue-edit permission, and returns the result or an error when the link is missing or access is denied.
| Name | Required | Description | Default |
|---|---|---|---|
| issue_iid | Yes | The internal ID of a project's issue | |
| project_id | Yes | Project ID or URL-encoded path | |
| issue_link_id | Yes | The ID of an issue relationship |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark destructiveHint and openWorldHint, so the description adds value by specifying the real-world effect ('changes issue relationships'), the required 'issue-edit permission', and error cases for missing links or denied access. It does not elaborate on reversibility, but deletion is inherently destructive and hinted.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two tightly written sentences: action and purpose first, verification guidance second, and side effects/permissions/error behavior third. Every clause contributes information, with no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter delete operation with no output schema, the description adequately covers purpose, preconditions, verification path, permission requirements, and error scenarios. Nothing essential is missing for an agent to decide whether and how to invoke it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the description adds no parameter-specific semantics beyond what the input schema already provides for project_id, issue_iid, and issue_link_id. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with the specific verb 'Delete' and resource 'issue link', and clarifies the action as removing an existing relationship between two issues. This clearly distinguishes it from sibling tools like create_issue_link, list_issue_links, and get_issue_link.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use the tool: to remove an existing issue relationship, and it recommends verifying with list_issue_links or get_issue_link first. It stops short of naming the inverse alternative (create_issue_link) explicitly, but the usage context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_issue_note_emoji_reactionADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| note_id | Yes | The ID of a note (comment or thread reply) | |
| award_id | Yes | The ID of the emoji reaction to delete | |
| issue_iid | Yes | The IID of an issue | |
| project_id | Yes | Project ID or complete URL-encoded path to project | |
| discussion_id | No | The ID of a discussion thread. Required for notes that are discussion replies; omit for top-level notes. |
TDQS
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.
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.
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.
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.
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.
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_labelADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| label_id | Yes | The ID or title of a project's label | |
| project_id | Yes | Project ID or URL-encoded path |
TDQS
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.
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.
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.
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.
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.
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_noteADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| note_id | Yes | The ID of a thread note | |
| project_id | Yes | Project ID or complete URL-encoded path to project | |
| discussion_id | Yes | The ID of a thread | |
| merge_request_iid | Yes | The IID of a merge request |
TDQS
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.
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.
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.
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.
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.
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_reactionADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| award_id | Yes | The ID of the emoji reaction to delete | |
| project_id | Yes | Project ID or complete URL-encoded path to project | |
| merge_request_iid | Yes | The IID of a merge request |
TDQS
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.
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.
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.
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.
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.
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_noteADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| note_id | Yes | The ID of a thread note | |
| project_id | Yes | Project ID or complete URL-encoded path to project | |
| merge_request_iid | Yes | The IID of a merge request |
TDQS
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.
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.
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.
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.
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.
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_reactionADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| note_id | Yes | The ID of a note (comment or thread reply) | |
| award_id | Yes | The ID of the emoji reaction to delete | |
| project_id | Yes | Project ID or complete URL-encoded path to project | |
| discussion_id | No | The ID of a discussion thread. Required for notes that are discussion replies; omit for top-level notes. | |
| merge_request_iid | Yes | The IID of a merge request |
TDQS
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.
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.
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.
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.
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.
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_toolsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| category | No | Toolset category to activate (e.g. 'pipelines', 'wiki'). Omit to list available categories. |
TDQS
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.
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.
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.
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.
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.
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_attachmentARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| secret | Yes | The 32-character secret of the upload | |
| filename | Yes | The filename of the upload | |
| local_path | No | Local path to save the file (optional, defaults to current directory) | |
| project_id | Yes | Project ID or URL-encoded path of the project |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| namespace | No | Namespace to fork to (full path) | |
| project_id | Yes | Project ID or complete URL-encoded path to project |
TDQS
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.
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.
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.
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.
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.
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_branchARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | Project ID or complete URL-encoded path to project | |
| branch_name | Yes | Name of the branch |
TDQS
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.
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.
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.
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.
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.
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_diffsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | The target branch or commit SHA to compare to | |
| from | Yes | The base branch or commit SHA to compare from | |
| straight | No | Comparison method: false for '...' (default), true for '--' | |
| project_id | Yes | Project ID or complete URL-encoded path to project | |
| excluded_file_patterns | No | Array 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
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.
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.
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.
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.
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.
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_resourceARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | CI/CD Catalog resource global ID. Required when full_path is omitted. | |
| full_path | No | CI/CD Catalog resource full project path. Required when id is omitted. | |
| version_limit | No | Number of versions to include (default: 5, max: 20) | |
| component_name | No | Filter returned components by component name | |
| include_readme | No | Include version README content | |
| component_limit | No | Number of components per version to include (default: 20, max: 50) |
TDQS
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.
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.
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.
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.
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.
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_commitARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| sha | Yes | The commit hash or name of a repository branch or tag | |
| stats | No | Include commit stats | |
| project_id | Yes | Project ID or complete URL-encoded path to project |
TDQS
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.
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.
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.
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.
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.
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_diffARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| sha | Yes | The commit hash or name of a repository branch or tag | |
| full_diff | No | Whether to return the full diff or only first page (default: false) | |
| project_id | Yes | Project ID or complete URL-encoded path to project |
TDQS
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.
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.
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.
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.
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.
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_noteARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | Project ID or complete URL-encoded path to project | |
| draft_note_id | Yes | The ID of the draft note | |
| merge_request_iid | Yes | The IID of a merge request |
TDQS
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.
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.
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.
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.
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.
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_blameARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | Yes | The name of branch, tag or commit (required by GitLab blame API) | |
| file_path | Yes | The full path of the file to blame, relative to repo root | |
| range_end | No | Last line of the blame range (inclusive, 1-based). Both range[start] and range[end] must be set together. | |
| project_id | No | Project ID or complete URL-encoded path to project | |
| range_start | No | First line of the blame range (inclusive, 1-based). Both range[start] and range[end] must be set together. |
TDQS
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.
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.
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.
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.
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.
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_contentsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | Branch/tag/commit to get contents from | |
| path | No | Alias of file_path | |
| file_path | No | Path to the file or directory. Takes precedence over 'path' when both are provided | |
| project_id | No | Project ID or URL-encoded path (optional; falls back to env) |
TDQS
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.
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.
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.
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.
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.
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_issueARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| issue_iid | Yes | The internal ID of the project issue | |
| project_id | Yes | Project ID or URL-encoded path | |
| full_response | No | 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. |
TDQS
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.
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.
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.
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.
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.
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_issue_linkARead-only
Get a specific issue link. 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.
| Name | Required | Description | Default |
|---|---|---|---|
| issue_iid | Yes | The internal ID of a project's issue | |
| project_id | Yes | Project ID or URL-encoded path | |
| issue_link_id | Yes | ID of an issue relationship |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=true, and the description reinforces that it does not mutate data while adding concrete behavioral details: missing resources, invalid identifiers, insufficient permission, and rate limits are surfaced as errors. This provides context beyond the annotation without contradicting it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action and usage guidance are front-loaded and efficient, but the final sentence contains boilerplate about group_id and pagination that does not apply to this tool's schema. The description would be tighter and more accurate without that extraneous clause.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only tool with three fully documented parameters and no output schema, the description covers the action, usage context, and error behavior. It does not explain the concept of an issue link or the return shape, but the low complexity and annotation coverage make the definition sufficiently complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so a baseline of 3 is expected, but the description introduces group_id and 'pagination fields' that do not appear in the schema. It largely restates the schema's project_id guidance rather than adding meaningful semantics, and the irrelevant references actively confuse parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Get'), the resource ('a specific issue link'), and scope ('specific'), and distinguishes itself from list or search tools by noting when those should be used instead. This effectively differentiates it from the sibling list_issue_links.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit usage context: use for a known resource or result, and use the corresponding list or search tool when discovering multiple resources. This is direct when-to-use versus alternative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_labelARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| label_id | Yes | The ID or title of a project's label | |
| project_id | Yes | Project ID or URL-encoded path | |
| include_ancestor_groups | No | Include ancestor groups |
TDQS
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.
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.
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.
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.
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.
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_requestARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | Project ID or complete URL-encoded path to project | |
| source_branch | No | Source branch name | |
| include_summaries | No | If true, include deployment_summary, commit_addition_summary and approval_summary (extra API calls, larger response). Default false to reduce token usage. | |
| merge_request_iid | No | The IID of a merge request |
TDQS
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.
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.
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.
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.
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.
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_stateARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | Project ID or complete URL-encoded path to project | |
| merge_request_iid | Yes | The IID of the merge request |
TDQS
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.
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.
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.
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.
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.
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_conflictsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | Project ID or complete URL-encoded path to project | |
| merge_request_iid | Yes | The IID of the merge request |
TDQS
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.
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.
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.
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.
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.
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_diffsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| view | No | Diff view type | |
| project_id | Yes | Project ID or complete URL-encoded path to project | |
| source_branch | No | Source branch name | |
| merge_request_iid | No | The IID of a merge request | |
| excluded_file_patterns | No | Array 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
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.
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.
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.
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.
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.
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_diffARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| unidiff | No | Present diff in the unified diff format. Default is false. | |
| file_paths | Yes | List 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_id | Yes | Project ID or complete URL-encoded path to project | |
| source_branch | No | Source branch name | |
| merge_request_iid | No | The IID of a merge request |
TDQS
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.
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.
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.
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.
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.
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_noteARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| note_id | Yes | The ID of a thread note | |
| project_id | Yes | Project ID or complete URL-encoded path to project | |
| merge_request_iid | Yes | The IID of a merge request |
TDQS
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.
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.
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.
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.
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.
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_notesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number for pagination | |
| sort | No | The sort order of the notes | |
| order_by | No | The field to sort the notes by | |
| per_page | No | Number of items per page | |
| project_id | Yes | Project ID or complete URL-encoded path to project | |
| merge_request_iid | Yes | The IID of a merge request |
TDQS
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.
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.
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.
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.
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.
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_versionARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| unidiff | No | Present diffs in the unified diff format. Default is false. Introduced in GitLab 16.5. | |
| project_id | Yes | Project ID or complete URL-encoded path to project | |
| version_id | Yes | The ID of the merge request diff version | |
| merge_request_iid | Yes | The internal ID of the merge request |
TDQS
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.
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.
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.
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.
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.
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_namespaceARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| namespace_id | Yes | Namespace ID or full path |
TDQS
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.
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.
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.
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.
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.
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_projectARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | Project ID or URL-encoded path |
TDQS
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.
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.
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.
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.
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.
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_eventsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Returns the specified results page. Default: 1 | |
| sort | No | Direction to sort the results by creation date. Default: desc | |
| after | No | If defined, Returns events created after the specified date (YYYY-MM-DD format). To include events on 2025-08-29, use after=2025-08-28 | |
| action | No | If defined, returns events with the specified action type | |
| before | No | If 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_page | No | Number of results per page. Default: 20 | |
| project_id | Yes | Project ID or URL-encoded path | |
| target_type | No | If defined, returns events with the specified target type |
TDQS
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.
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.
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.
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.
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.
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_branchARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | Project ID or complete URL-encoded path to project | |
| branch_name | Yes | Name of the protected branch |
TDQS
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.
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.
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.
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.
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.
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_treeARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | The name of a repository branch or tag. Defaults to the default branch. | |
| path | No | The path inside the repository | |
| per_page | No | Number of results to show per page | |
| recursive | No | Boolean value to get a recursive tree | |
| page_token | No | Token for keyset pagination. Use the next_page_token value returned in the previous response to retrieve the next page. | |
| pagination | No | Pagination 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_id | Yes | The ID or URL-encoded path of the project |
TDQS
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.
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.
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.
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.
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.
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_userARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| user_id | Yes | The ID of the user |
TDQS
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.
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.
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.
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.
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.
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_usersARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| usernames | Yes | Array of usernames to search for |
TDQS
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.
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.
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.
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.
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.
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_checkARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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_branchesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number for pagination (default: 1) | |
| search | No | Search term to filter branches by name | |
| per_page | No | Number of items per page (max: 100, default: 20) | |
| project_id | Yes | Project ID or complete URL-encoded path to project |
TDQS
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.
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.
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.
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.
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.
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_resourcesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Sort order | |
| after | No | GraphQL cursor for the next page | |
| first | No | Number of resources to return (default: 20, max: 100) | |
| scope | No | Catalog resource scope | |
| search | No | Search catalog resources by name or description | |
| topics | No | Filter by project topic names | |
| group_ids | No | Filter to catalog resources in these group IDs | |
| verification_level | No | Filter by verification level |
TDQS
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.
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.
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.
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.
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.
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_commitsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| all | No | Retrieve every commit from the repository | |
| page | No | Page number for pagination (default: 1) | |
| path | No | The file path | |
| order | No | List commits in order | |
| since | No | Only commits after or on this date are returned in ISO 8601 format YYYY-MM-DDTHH:MM:SSZ | |
| until | No | Only commits before or on this date are returned in ISO 8601 format YYYY-MM-DDTHH:MM:SSZ | |
| author | No | Search commits by commit author | |
| per_page | No | Number of items per page (max: 100, default: 20) | |
| ref_name | No | The name of a repository branch, tag or revision range, or if not given the default branch | |
| trailers | No | Parse and include Git trailers for every commit | |
| project_id | Yes | Project ID or complete URL-encoded path to project | |
| with_stats | No | Stats about each commit are added to the response | |
| first_parent | No | Follow only the first parent commit upon seeing a merge commit |
TDQS
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.
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.
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.
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.
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.
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_statusesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| all | No | Return all statuses, not only latest ones | |
| ref | No | Filter statuses by Git ref | |
| sha | Yes | The commit hash or name of a repository branch or tag | |
| name | No | Filter statuses by status name or context | |
| page | No | Page number for pagination (default: 1) | |
| sort | No | Sort direction | |
| stage | No | Filter statuses by build stage | |
| order_by | No | Field to order statuses by | |
| per_page | No | Number of items per page (max: 100, default: 20) | |
| project_id | Yes | Project ID or complete URL-encoded path to project | |
| pipeline_id | No | Filter statuses by pipeline ID |
TDQS
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.
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.
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.
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.
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.
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_notesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | Project ID or complete URL-encoded path to project | |
| merge_request_iid | Yes | The IID of a merge request |
TDQS
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.
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.
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.
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.
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.
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_eventsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Returns the specified results page. Default: 1 | |
| sort | No | Direction to sort the results by creation date. Default: desc | |
| after | No | If defined, Returns events created after the specified date (YYYY-MM-DD format). To include events on 2025-08-29, use after=2025-08-28 | |
| scope | No | Include all events across a user's projects | |
| action | No | If defined, returns events with the specified action type | |
| before | No | If 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_page | No | Number of results per page. Default: 20 | |
| target_type | No | If defined, returns events with the specified target type |
TDQS
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.
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.
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.
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.
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.
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_iterationsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number for pagination (default: 1) | |
| state | No | Return opened, upcoming, current, closed, or all iterations. | |
| search | No | Return only iterations with a title matching the provided string. | |
| group_id | Yes | Group ID or URL-encoded path | |
| per_page | No | Number of items per page (max: 100, default: 20) | |
| search_in | No | Fields 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_after | No | Return only iterations updated after the given datetime. Expected in ISO 8601 format (2019-03-15T08:00:00Z). | |
| updated_before | No | Return only iterations updated before the given datetime. Expected in ISO 8601 format (2019-03-15T08:00:00Z). | |
| include_ancestors | No | Include iterations for group and its ancestors. Defaults to true. | |
| include_descendants | No | Include iterations for group and its descendants. Defaults to false. |
TDQS
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.
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.
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.
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.
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.
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_membersARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number for pagination (default: 1) | |
| query | No | Search for members by name or username | |
| group_id | Yes | Group ID or URL-encoded path | |
| per_page | No | Number of items per page (default: 20, max: 100) | |
| user_ids | No | Filter by user IDs | |
| skip_users | No | User IDs to exclude | |
| include_inheritance | No | Include inherited members. Defaults to false. |
TDQS
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.
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.
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.
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.
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.
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_requestsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| wip | No | Filter merge requests against their wip status | |
| page | No | Page number for pagination (default: 1) | |
| sort | No | Return merge requests sorted in ascending or descending order | |
| scope | No | Return merge requests from a specific scope | |
| state | No | Return merge requests with a specific state | |
| labels | No | Array of label names | |
| search | No | Search for specific terms | |
| group_id | Yes | Group ID or URL-encoded path | |
| order_by | No | Return merge requests ordered by the given field | |
| per_page | No | Number of items per page (max: 100, default: 20) | |
| author_id | No | Returns merge requests created by the given user ID (integer). Mutually exclusive with author_username. | |
| milestone | No | Milestone title | |
| assignee_id | No | Return MRs assigned to the given user ID (integer), 'none', or 'any'. Mutually exclusive with assignee_username. | |
| reviewer_id | No | Returns merge requests which have the user as a reviewer. Must be an integer, 'none', or 'any'. Mutually exclusive with reviewer_username. | |
| non_archived | No | Return merge requests from non-archived projects only. Defaults to true. | |
| created_after | No | Return merge requests created after the given time | |
| source_branch | No | Return merge requests from a specific source branch | |
| target_branch | No | Return merge requests targeting a specific branch | |
| updated_after | No | Return merge requests updated after the given time | |
| created_before | No | Return merge requests created before the given time | |
| updated_before | No | Return merge requests updated before the given time | |
| author_username | No | Returns merge requests created by the given username. Mutually exclusive with author_id. | |
| assignee_username | No | Returns merge requests assigned to the given username. Mutually exclusive with assignee_id. | |
| reviewer_username | No | Returns merge requests which have the user as a reviewer by username. Mutually exclusive with reviewer_id. | |
| source_project_id | No | Return merge requests with the given source project ID | |
| with_labels_details | No | Return more details for each label | |
| approved_by_usernames | No | Returns merge requests approved by the given usernames (array). |
TDQS
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.
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.
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.
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.
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.
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_projectsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number for pagination (default: 1) | |
| sort | No | Sort direction | |
| topic | No | Filter by topic (projects tagged with this topic) | |
| search | No | Search term to filter projects | |
| starred | No | Filter by starred projects | |
| archived | No | Filter for archived projects | |
| group_id | Yes | Group ID or path | |
| order_by | No | Field to sort by | |
| per_page | No | Number of items per page (max: 100, default: 20) | |
| statistics | No | Include project statistics | |
| visibility | No | Filter by project visibility | |
| min_access_level | No | Filter by minimum access level | |
| include_subgroups | No | Include projects from subgroups | |
| with_issues_enabled | No | Filter projects with issues feature enabled | |
| with_security_reports | No | Include security reports | |
| with_custom_attributes | No | Include custom attributes | |
| with_programming_language | No | Filter by programming language | |
| with_merge_requests_enabled | No | Filter projects with merge requests feature enabled |
TDQS
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.
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.
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.
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.
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.
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_discussionsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number for pagination (default: 1) | |
| per_page | No | Number of items per page (max: 100, default: 20) | |
| issue_iid | Yes | The internal ID of the project issue | |
| project_id | Yes | Project ID or URL-encoded path |
TDQS
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.
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.
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.
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.
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.
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_reactionsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| issue_iid | Yes | The IID of an issue | |
| project_id | Yes | Project ID or complete URL-encoded path to project |
TDQS
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.
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.
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.
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.
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.
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_linksARead-only
List all issue links for a specific 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.
| Name | Required | Description | Default |
|---|---|---|---|
| issue_iid | Yes | The internal ID of a project's issue | |
| project_id | Yes | Project ID or URL-encoded path |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, and the description reinforces it ('does not mutate GitLab data') while adding error behavior for missing resources, invalid identifiers, insufficient permission, and rate limits. This is useful behavioral context beyond annotations, though it doesn't describe response shape or pagination.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose is front-loaded in the first sentence, and all three sentences contribute. The 'project_id or group_id' conditional and mention of pagination fields are slightly off-target for this schema, which only has project_id and no pagination parameters, causing minor noise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a straightforward two-parameter read-only list operation, the description is largely complete: purpose, list-vs-get usage, error behavior, and identifier guidance are all present. The off-target conditional and undocumented pagination reference prevent it from being fully coherent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers both required parameters with descriptions, so the description does not need to document them. It adds a small clarification about numeric IDs vs URL-encoded paths, but most of that repeats schema text, keeping it at the baseline for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the exact operation ('List all issue links') and target ('specific issue'), and contrasts with the get_issue_link sibling for single-resource inspection. No ambiguity about which sibling to pick.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs to use for a collection of resources and to choose the corresponding get tool when a single resource is known. This directly maps to the list-vs-get distinction among siblings and leaves no inference required.
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_reactionsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| note_id | Yes | The ID of a note (comment or thread reply) | |
| issue_iid | Yes | The IID of an issue | |
| project_id | Yes | Project ID or complete URL-encoded path to project | |
| discussion_id | No | The ID of a discussion thread. Required for notes that are discussion replies; omit for top-level notes. |
TDQS
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.
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.
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.
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.
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.
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_issuesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number for pagination (default: 1) | |
| scope | No | Return issues from a specific scope | |
| state | No | Return issues with a specific state | |
| labels | No | Array of label names | |
| search | No | Search for specific terms | |
| due_date | No | Return issues that have the due date | |
| per_page | No | Number of items per page (max: 100, default: 20) | |
| author_id | No | Return issues created by the given user ID. Mutually exclusive with author_username. | |
| milestone | No | Milestone title | |
| issue_type | No | Filter to a given type of issue. One of issue, incident, test_case or task | |
| project_id | No | Project ID or URL-encoded path (optional - if not provided, lists issues across all accessible projects) | |
| assignee_id | No | Return issues assigned to the given user ID (user id, none, or any). Mutually exclusive with assignee_username. | |
| confidential | No | Filter confidential or public issues | |
| iteration_id | No | Return 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_after | No | Return issues created after the given time | |
| updated_after | No | Return issues updated after the given time | |
| created_before | No | Return issues created before the given time | |
| updated_before | No | Return issues updated before the given time | |
| author_username | No | Return issues created by the given username. Mutually exclusive with author_id. | |
| assignee_username | No | Return issues assigned to the given username. Mutually exclusive with assignee_id. | |
| with_labels_details | No | Return more details for each label |
TDQS
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.
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.
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.
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.
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.
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_labelsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number for pagination (default: 1) | |
| search | No | Keyword to filter labels by | |
| per_page | No | Number of items per page (max: 100, default: 20) | |
| project_id | Yes | Project ID or URL-encoded path | |
| with_counts | No | Whether to include issue and merge request counts | |
| include_ancestor_groups | No | Include ancestor groups |
TDQS
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.
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.
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.
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.
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.
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_filesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | Project ID or complete URL-encoded path to project | |
| source_branch | No | Source branch name | |
| merge_request_iid | No | The IID of a merge request | |
| excluded_file_patterns | No | Array of regex patterns to exclude files. Examples: ["^vendor/", "\.pb\.go$"] |
TDQS
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.
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.
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.
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.
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.
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_diffsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number for pagination (default: 1) | |
| unidiff | No | Present diffs in the unified diff format. Default is false. Introduced in GitLab 16.5. | |
| per_page | No | Number of items per page (max: 100, default: 20) | |
| project_id | Yes | Project ID or complete URL-encoded path to project | |
| source_branch | No | Source branch name | |
| merge_request_iid | No | The IID of a merge request |
TDQS
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.
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.
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.
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.
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.
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_reactionsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | Project ID or complete URL-encoded path to project | |
| merge_request_iid | Yes | The IID of a merge request |
TDQS
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.
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.
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.
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.
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.
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_reactionsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| note_id | Yes | The ID of a note (comment or thread reply) | |
| project_id | Yes | Project ID or complete URL-encoded path to project | |
| discussion_id | No | The ID of a discussion thread. Required for notes that are discussion replies; omit for top-level notes. | |
| merge_request_iid | Yes | The IID of a merge request |
TDQS
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.
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.
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.
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.
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.
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_pipelinesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number for pagination (default: 1) | |
| per_page | No | Number of items per page (max: 100, default: 20) | |
| project_id | Yes | Project ID or complete URL-encoded path to project | |
| merge_request_iid | Yes | The internal ID of the merge request |
TDQS
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.
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.
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.
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.
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.
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_requestsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| wip | No | Filter merge requests against their wip status | |
| page | No | Page number for pagination (default: 1) | |
| sort | No | Return merge requests sorted in ascending or descending order | |
| scope | No | Return merge requests from a specific scope | |
| state | No | Return merge requests with a specific state | |
| labels | No | Array of label names | |
| search | No | Search for specific terms | |
| order_by | No | Return merge requests ordered by the given field | |
| per_page | No | Number of items per page (max: 100, default: 20) | |
| author_id | No | Returns merge requests created by the given user ID (integer). Mutually exclusive with author_username. | |
| milestone | No | Milestone title | |
| project_id | No | Project ID or URL-encoded path (optional - if not provided, lists all merge requests the user has access to) | |
| assignee_id | No | Return MRs assigned to the given user ID (integer), 'none', or 'any'. Mutually exclusive with assignee_username. | |
| reviewer_id | No | Returns merge requests which have the user as a reviewer. Must be an integer, 'none', or 'any'. Mutually exclusive with reviewer_username. | |
| created_after | No | Return merge requests created after the given time | |
| source_branch | No | Return merge requests from a specific source branch | |
| target_branch | No | Return merge requests targeting a specific branch | |
| updated_after | No | Return merge requests updated after the given time | |
| created_before | No | Return merge requests created before the given time | |
| updated_before | No | Return merge requests updated before the given time | |
| author_username | No | Returns merge requests created by the given username. Mutually exclusive with author_id. | |
| assignee_username | No | Returns merge requests assigned to the given username. Mutually exclusive with assignee_id. | |
| reviewer_username | No | Returns merge requests which have the user as a reviewer by username. Mutually exclusive with reviewer_id. | |
| with_labels_details | No | Return more details for each label | |
| approved_by_usernames | No | Returns merge requests approved by the given usernames (array). |
TDQS
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.
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.
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.
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.
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.
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_versionsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | Project ID or complete URL-encoded path to project | |
| merge_request_iid | Yes | The internal ID of the merge request |
TDQS
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.
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.
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.
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.
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.
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_namespacesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number for pagination (default: 1) | |
| owned | No | Filter for namespaces owned by current user | |
| search | No | Search term for namespaces | |
| per_page | No | Number of items per page (max: 100, default: 20) |
TDQS
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.
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.
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.
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.
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.
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_membersARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number for pagination (default: 1) | |
| query | No | Search for members by name or username | |
| per_page | No | Number of items per page (default: 20, max: 100) | |
| user_ids | No | Filter by user IDs | |
| project_id | Yes | Project ID or URL-encoded path | |
| skip_users | No | User IDs to exclude | |
| include_inheritance | No | Include inherited members. Defaults to false. |
TDQS
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.
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.
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.
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.
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.
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_projectsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number for pagination (default: 1) | |
| sort | No | Return projects sorted in ascending or descending order | |
| owned | No | Filter for projects owned by current user | |
| topic | No | Filter by topic (projects tagged with this topic) | |
| search | No | Search term for projects | |
| simple | No | Return only limited fields | |
| archived | No | Filter for archived projects | |
| order_by | No | Return projects ordered by field | |
| per_page | No | Number of items per page (max: 100, default: 20) | |
| membership | No | Filter for projects where current user is a member | |
| visibility | No | Filter by project visibility | |
| min_access_level | No | Filter by minimum access level | |
| search_namespaces | No | Needs to be true if search is full path | |
| with_issues_enabled | No | Filter projects with issues feature enabled | |
| with_merge_requests_enabled | No | Filter projects with merge requests feature enabled |
TDQS
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.
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.
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.
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.
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.
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_branchesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number for pagination (default: 1) | |
| search | No | Search term to filter protected branches by name | |
| per_page | No | Number of items per page (max: 100, default: 20) | |
| project_id | Yes | Project ID or complete URL-encoded path to project |
TDQS
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.
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.
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.
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.
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.
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_todosARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number for pagination (default: 1) | |
| type | No | Filter by to-do target type | |
| state | No | Filter by to-do state | |
| action | No | Filter by to-do action | |
| group_id | No | Filter by group ID | |
| per_page | No | Number of items per page (max: 100, default: 20) | |
| author_id | No | Filter by author ID | |
| project_id | No | Filter by project ID |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The ID of the to-do item |
TDQS
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.
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.
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.
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.
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.
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_requestADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| sha | No | 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). | |
| squash | No | Squash commits into a single commit when merging | |
| auto_merge | No | If true, the merge request merges when the pipeline succeeds. | |
| project_id | Yes | Project ID or complete URL-encoded path to project | |
| merge_request_iid | No | The IID of a merge request | |
| merge_commit_message | No | Custom merge commit message | |
| squash_commit_message | No | Custom squash commit message | |
| should_remove_source_branch | No | Remove source branch after merge | |
| merge_when_pipeline_succeeds | No | If true, the merge request merges when the pipeline succeeds. Deprecated in GitLab 17.11. Use `auto_merge` instead. |
TDQS
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.
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.
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.
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.
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.
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_discussionsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number for pagination (default: 1) | |
| per_page | No | Number of items per page (max: 100, default: 20) | |
| project_id | Yes | Project ID or complete URL-encoded path to project | |
| merge_request_iid | Yes | The IID of a merge request |
TDQS
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.
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.
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.
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.
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.
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_issuesBRead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number for pagination (default: 1) | |
| state | No | Return issues with a specific state (default: opened) | |
| labels | No | Array of label names to filter by | |
| search | No | Search for specific terms in title and description | |
| per_page | No | Number of items per page (default: 20, max: 100) | |
| milestone | No | Milestone title to filter by | |
| project_id | No | Project ID or URL-encoded path (optional to search across all accessible projects) | |
| created_after | No | Return issues created after the given time (ISO 8601) | |
| updated_after | No | Return issues updated after the given time (ISO 8601) | |
| created_before | No | Return issues created before the given time (ISO 8601) | |
| updated_before | No | Return issues updated before the given time (ISO 8601) |
TDQS
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.
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.
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.
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.
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.
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_branchADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Deprecated alias for branch_name; prefer branch_name for consistency | |
| project_id | No | Project ID or complete URL-encoded path to project | |
| branch_name | Yes | Branch name or wildcard pattern to protect | |
| allow_force_push | No | Allow force push to the protected branch. Default: false | |
| push_access_level | No | Access level for pushing (0=No access, 30=Developer, 40=Maintainer, 60=Admin). GitLab default applies when omitted. | |
| merge_access_level | No | Access level for merging (0=No access, 30=Developer, 40=Maintainer, 60=Admin). GitLab default applies when omitted. | |
| unprotect_access_level | No | Access level for unprotecting (0=No access, 30=Developer, 40=Maintainer, 60=Admin). GitLab default applies when omitted. | |
| code_owner_approval_required | No | Require code owner approval before merging (PREMIUM). Default: false |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | Project ID or complete URL-encoded path to project | |
| draft_note_id | Yes | The ID of the draft note | |
| merge_request_iid | Yes | The IID of a merge request |
TDQS
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.
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.
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.
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.
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.
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_filesADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| files | Yes | 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. | |
| branch | Yes | Branch to push to | |
| project_id | Yes | Project ID or complete URL-encoded path to project | |
| commit_message | Yes | Commit message |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| resolved | Yes | Whether to resolve the thread | |
| project_id | Yes | Project ID or complete URL-encoded path to project | |
| discussion_id | Yes | The ID of a thread | |
| merge_request_iid | Yes | The IID of a merge request |
TDQS
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.
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.
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.
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.
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.
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_repositoriesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number for pagination (default: 1) | |
| query | No | Search query (alias for 'search') | |
| search | No | Search query | |
| per_page | No | Number of items per page (max: 100, default: 20) |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | Project ID or complete URL-encoded path to project | |
| merge_request_iid | Yes | The IID of the merge request to unapprove |
TDQS
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.
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.
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.
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.
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.
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_branchADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | Project ID or complete URL-encoded path to project | |
| branch_name | Yes | Name of the protected branch to unprotect |
TDQS
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.
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.
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.
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.
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.
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_branchADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | Project ID or complete URL-encoded path to project | |
| default_branch | Yes | The new default branch name for the project |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | The content of the draft note | |
| position | No | Position when creating a diff note | |
| project_id | Yes | Project ID or complete URL-encoded path to project | |
| draft_note_id | Yes | The ID of the draft note | |
| merge_request_iid | Yes | The IID of a merge request | |
| resolve_discussion | No | Whether to resolve the discussion when publishing |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | The title of the issue | |
| labels | No | Array of label names | |
| weight | No | Weight of the issue (numeric, typically hours of work) | |
| due_date | No | Date the issue is due (YYYY-MM-DD) | |
| issue_iid | Yes | The internal ID of the project issue | |
| issue_type | No | The type of issue. One of issue, incident, test_case or task. | |
| project_id | Yes | Project ID or URL-encoded path | |
| description | No | The description of the issue | |
| state_event | No | Update issue state (close/reopen) | |
| assignee_ids | No | Array of user IDs to assign issue to | |
| confidential | No | Set the issue to be confidential | |
| milestone_id | No | Milestone ID to assign | |
| full_response | No | If true, return the complete updated issue object. Default returns a slim confirmation (iid, title, state, web_url, updated_at) to reduce token usage. | |
| discussion_locked | No | Flag to lock discussions |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| patch | Yes | The patch content to apply to the issue description | |
| dry_run | No | If true, preview changes without updating the issue | |
| issue_iid | Yes | The internal ID of the project issue | |
| patch_type | Yes | Type of patch format to apply | |
| project_id | Yes | Project ID or URL-encoded path | |
| create_note | No | If true, add a note summarizing the change after update | |
| allow_multiple | No | For search_replace: allow multiple matches to all be replaced (default: false — fail on duplicate) |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | The content of the note or reply | |
| note_id | No | The ID of a thread note | |
| resolved | No | Resolve or unresolve the note | |
| issue_iid | No | The IID of an issue | |
| project_id | No | Project ID or complete URL-encoded path to project | |
| discussion_id | No | The ID of a thread |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| color | No | The color of the label given in 6-digit hex notation with leading '#' sign | |
| label_id | Yes | The ID or title of a project's label | |
| new_name | No | The new name of the label | |
| priority | No | The new priority of the label | |
| project_id | Yes | Project ID or URL-encoded path | |
| description | No | The new description of the label |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| draft | No | Work in progress merge request | |
| title | No | The title of the merge request | |
| labels | No | Labels for the MR | |
| squash | No | Squash commits into a single commit when merging | |
| project_id | Yes | Project ID or complete URL-encoded path to project | |
| description | No | The description of the merge request | |
| state_event | No | New state (close/reopen) for the MR | |
| assignee_ids | No | The ID of the users to assign the MR to | |
| milestone_id | No | Milestone ID to assign. Set to 0 to unassign. Null is treated as omitted. | |
| reviewer_ids | No | The ID of the users to assign as reviewers of the MR | |
| source_branch | No | Source branch name | |
| target_branch | No | The target branch | |
| merge_request_iid | No | The IID of a merge request | |
| remove_source_branch | No | Flag indicating if the source branch should be removed |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | The content of the note or reply | |
| note_id | No | The ID of a thread note | |
| resolved | No | Resolve or unresolve the note | |
| project_id | No | Project ID or complete URL-encoded path to project | |
| discussion_id | No | The ID of a thread | |
| merge_request_iid | No | The IID of a merge request |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | The content of the note or reply | |
| note_id | Yes | The ID of a thread note | |
| project_id | Yes | Project ID or complete URL-encoded path to project | |
| merge_request_iid | Yes | The IID of a merge request |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Project display name | |
| path | No | Project path/slug | |
| topics | No | Project topics | |
| project_id | No | Project ID or complete URL-encoded path to project | |
| visibility | No | Project visibility | |
| description | No | Project description | |
| merge_method | No | Merge method | |
| squash_option | No | Squash commits setting | |
| default_branch | No | Default branch name | |
| wiki_access_level | No | Wiki feature visibility | |
| pages_access_level | No | Pages feature visibility | |
| builds_access_level | No | CI/CD pipelines feature visibility | |
| issues_access_level | No | Issues feature visibility | |
| forking_access_level | No | Forking feature visibility | |
| snippets_access_level | No | Snippets feature visibility | |
| request_access_enabled | No | Allow users to request access | |
| environments_access_level | No | Environments feature visibility | |
| merge_requests_access_level | No | Merge requests feature visibility | |
| package_registry_access_level | No | Package registry feature visibility | |
| container_registry_access_level | No | Container registry feature visibility | |
| remove_source_branch_after_merge | No | Remove source branches after merge by default | |
| only_allow_merge_if_pipeline_succeeds | No | Require successful pipeline before merge | |
| only_allow_merge_if_all_discussions_are_resolved | No | Require all discussions to be resolved before merge |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| file_path | Yes | Path to the file to upload | |
| project_id | Yes | Project ID or URL-encoded path of the project |
TDQS
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.
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.
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.
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.
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.
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_lintARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | Branch or tag context for dry_run validation | |
| content | Yes | GitLab CI/CD YAML content to validate | |
| dry_run | No | Run pipeline creation simulation | |
| project_id | Yes | Project ID or URL-encoded path | |
| include_jobs | No | Include jobs in the lint response |
TDQS
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.
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.
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.
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.
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.
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_lintARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No | Run pipeline creation simulation | |
| project_id | Yes | Project ID or URL-encoded path | |
| content_ref | No | Commit SHA, branch, or tag to read the existing CI config from | |
| dry_run_ref | No | Branch or tag context for dry_run validation | |
| include_jobs | No | Include jobs in the lint response |
TDQS
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.
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.
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.
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.
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.
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_namespaceARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Namespace path to verify | |
| parent_id | No | Parent namespace ID; required to correctly resolve paths in nested namespaces where the same path may exist under different parents |
TDQS
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.
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.
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.
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.
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.
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.
whoamiARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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 tool update
v2.1.57- Added
list_group_merge_requests
3 tool updates
v2.1.52- Changed
create_or_update_file1 field changed- added
Input schema / properties / encodingAdded 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" +}
- Changed
merge_merge_request1 field changed- added
Input schema / properties / shaAdded 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" +}
- Changed
push_files7 fields changed- changed
Input schema / properties / files / descriptionPrevious 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." - added
Input schema / properties / files / items / properties / actionAdded value: +{ + "description": "Commit action for this file. Defaults to 'create'.", + "enum": [ + "create", + "update", + "delete", + "move" + ], + "type": "string" +} - changed
Input schema / properties / files / items / properties / content / descriptionPrevious 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'." - added
Input schema / properties / files / items / properties / encodingAdded 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" +} - changed
Input schema / properties / files / items / properties / file_path / descriptionPrevious value: -"Path where to create the file"New value: +"Path of the file in the repo" - added
Input schema / properties / files / items / properties / previous_pathAdded value: +{ + "description": "Previous path of the file. Required when action is 'move'.", + "type": "string" +} - changed
Input schema / properties / files / items / requiredPrevious value: -[ - "file_path", - "content" -]New value: +[ + "file_path" +]
1 tool update
v2.1.46- Added
list_group_members
35 tool updates
v2.1.45- Added
approve_merge_request - Added
create_branch - Added
create_commit_status - Added
create_issue_emoji_reaction - Added
create_issue_link - Added
create_or_update_file - Added
delete_issue_link - Added
delete_label - Added
discover_tools - Added
fork_repository - Added
get_commit - Added
get_commit_diff - Added
get_file_blame - Added
get_issue_link - Added
get_merge_request_approval_state - Added
get_repository_tree - Added
get_user - Added
get_users - Added
list_ci_catalog_resources - Added
list_commit_statuses - Added
list_commits - Added
list_group_projects - Added
list_issue_discussions - Added
list_issue_links - Added
list_merge_request_changed_files - Added
list_merge_request_versions - Added
list_protected_branches - Added
mark_all_todos_done - Added
merge_merge_request - Added
push_files - Added
update_label - Added
upload_markdown - Added
validate_ci_lint - Added
validate_project_ci_lint - Added
whoami
37 tool updates
v2.1.43- Removed
approve_merge_request - Changed
bulk_publish_draft_notes3 fields changed- added
Input schema / properties / internalAdded value: +{ + "description": "If true, the summary note is internal (GitLab 19.2+, default false)", + "type": "boolean" +} - added
Input schema / properties / noteAdded value: +{ + "description": "Summary note body to post on the merge request (GitLab 19.2+)", + "type": "string" +} - added
Input schema / properties / reviewer_stateAdded 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" +}
- Removed
create_branch - Removed
create_commit_status - Removed
create_issue_emoji_reaction - Removed
create_issue_link - Removed
create_or_update_file - Removed
delete_issue_link - Removed
delete_label - Removed
discover_tools - Removed
fork_repository - Removed
get_commit - Removed
get_commit_diff - Removed
get_file_blame - Removed
get_issue_link - Removed
get_merge_request_approval_state - Removed
get_repository_tree - Removed
get_user - Removed
get_users - Removed
list_ci_catalog_resources - Removed
list_commit_statuses - Removed
list_commits - Removed
list_group_projects - Removed
list_issue_discussions - Removed
list_issue_links - Removed
list_merge_request_changed_files - Removed
list_merge_request_versions - Removed
list_protected_branches - Removed
mark_all_todos_done - Removed
merge_merge_request - Removed
push_files - Removed
update_label - Changed
update_merge_request1 field changed- added
Input schema / properties / milestone_idAdded value: +{ + "description": "Milestone ID to assign. Set to 0 to unassign. Null is treated as omitted.", + "type": "string" +}
- Removed
upload_markdown - Removed
validate_ci_lint - Removed
validate_project_ci_lint - Removed
whoami
3 tool updates
v2.1.30- Changed
get_issue1 field changed- added
Input schema / properties / full_responseAdded 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" +}
- Changed
get_merge_request1 field changed- added
Input schema / properties / include_summariesAdded 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" +}
- Changed
update_issue1 field changed- added
Input schema / properties / full_responseAdded 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" +}
1 tool update
v2.1.28- Changed
get_ci_catalog_resource1 field changed- removed
Input schema / anyOfRemoved 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" - } -]
4 tool updates
v2.1.26- Changed
create_repository1 field changed- added
Input schema / properties / namespace_idAdded value: +{ + "description": "Group namespace ID to create the project in. Omit to use the current user's namespace.", + "minimum": 1, + "type": "integer" +}
- Added
get_ci_catalog_resource - Added
list_ci_catalog_resources - Added
update_project
2 tool updates
v2.1.25- Changed
my_issues1 field changed- changed
Input schema / properties / project_id / descriptionPrevious 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)"
- Changed
verify_namespace1 field changed- added
Input schema / properties / parent_idAdded value: +{ + "description": "Parent namespace ID; required to correctly resolve paths in nested namespaces where the same path may exist under different parents", + "type": "integer" +}
2 tool updates
v2.1.24- Changed
list_labels1 field changed- changed
Input schema / properties / with_counts / descriptionPrevious value: -"Whether or not to include issue and merge request counts"New value: +"Whether to include issue and merge request counts"
- Changed
merge_merge_request1 field changed- changed
Input schema / properties / merge_when_pipeline_succeeds / descriptionPrevious 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."
6 tool updates
v2.1.21- Added
get_protected_branch - Changed
list_issues4 fields changed- changed
Input schema / properties / assignee_id / descriptionPrevious 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." - changed
Input schema / properties / assignee_username / descriptionPrevious value: -"Return issues assigned to the given username"New value: +"Return issues assigned to the given username. Mutually exclusive with assignee_id." - changed
Input schema / properties / author_id / descriptionPrevious value: -"Return issues created by the given user ID"New value: +"Return issues created by the given user ID. Mutually exclusive with author_username." - changed
Input schema / properties / author_username / descriptionPrevious value: -"Return issues created by the given username"New value: +"Return issues created by the given username. Mutually exclusive with author_id."
- Added
list_protected_branches - Added
protect_branch - Added
unprotect_branch - Added
update_default_branch
107 tool updates
v2.1.18- Added
approve_merge_request - Added
bulk_publish_draft_notes - Added
create_branch - Added
create_commit_status - Added
create_draft_note - Added
create_group - Added
create_issue - Added
create_issue_emoji_reaction - Added
create_issue_link - Added
create_issue_note - Added
create_issue_note_emoji_reaction - Added
create_label - Added
create_merge_request - Added
create_merge_request_discussion_note - Added
create_merge_request_emoji_reaction - Added
create_merge_request_note - Added
create_merge_request_note_emoji_reaction - Added
create_merge_request_thread - Added
create_note - Added
create_or_update_file - Added
create_repository - Added
delete_branch - Added
delete_draft_note - Added
delete_issue - Added
delete_issue_emoji_reaction - Added
delete_issue_link - Added
delete_issue_note_emoji_reaction - Added
delete_label - Added
delete_merge_request_discussion_note - Added
delete_merge_request_emoji_reaction - Added
delete_merge_request_note - Added
delete_merge_request_note_emoji_reaction - Added
discover_tools - Added
download_attachment - Added
fork_repository - Added
get_branch - Added
get_branch_diffs - Added
get_commit - Added
get_commit_diff - Added
get_draft_note - Added
get_file_blame - Added
get_file_contents - Added
get_issue - Added
get_issue_link - Added
get_label - Added
get_merge_request - Added
get_merge_request_approval_state - Added
get_merge_request_conflicts - Added
get_merge_request_diffs - Added
get_merge_request_file_diff - Added
get_merge_request_note - Added
get_merge_request_notes - Added
get_merge_request_version - Added
get_namespace - Added
get_project - Added
get_project_events - Added
get_repository_tree - Added
get_user - Added
get_users - Added
health_check - Added
list_branches - Added
list_commit_statuses - Added
list_commits - Added
list_draft_notes - Added
list_events - Added
list_group_iterations - Added
list_group_projects - Added
list_issue_discussions - Added
list_issue_emoji_reactions - Added
list_issue_links - Added
list_issue_note_emoji_reactions - Added
list_issues - Added
list_labels - Added
list_merge_request_changed_files - Added
list_merge_request_diffs - Added
list_merge_request_emoji_reactions - Added
list_merge_request_note_emoji_reactions - Added
list_merge_request_pipelines - Added
list_merge_request_versions - Added
list_merge_requests - Added
list_namespaces - Added
list_project_members - Added
list_projects - Added
list_todos - Added
mark_all_todos_done - Added
mark_todo_done - Added
merge_merge_request - Added
mr_discussions - Added
my_issues - Added
publish_draft_note - Added
push_files - Added
resolve_merge_request_thread - Added
search_repositories - Added
unapprove_merge_request - Added
update_draft_note - Added
update_issue - Added
update_issue_description_patch - Added
update_issue_note - Added
update_label - Added
update_merge_request - Added
update_merge_request_discussion_note - Added
update_merge_request_note - Added
upload_markdown - Added
validate_ci_lint - Added
validate_project_ci_lint - Added
verify_namespace - Added
whoami
107 tool updates
v2.1.14- Removed
approve_merge_request - Removed
bulk_publish_draft_notes - Removed
create_branch - Removed
create_commit_status - Removed
create_draft_note - Removed
create_group - Removed
create_issue - Removed
create_issue_emoji_reaction - Removed
create_issue_link - Removed
create_issue_note - Removed
create_issue_note_emoji_reaction - Removed
create_label - Removed
create_merge_request - Removed
create_merge_request_discussion_note - Removed
create_merge_request_emoji_reaction - Removed
create_merge_request_note - Removed
create_merge_request_note_emoji_reaction - Removed
create_merge_request_thread - Removed
create_note - Removed
create_or_update_file - Removed
create_repository - Removed
delete_branch - Removed
delete_draft_note - Removed
delete_issue - Removed
delete_issue_emoji_reaction - Removed
delete_issue_link - Removed
delete_issue_note_emoji_reaction - Removed
delete_label - Removed
delete_merge_request_discussion_note - Removed
delete_merge_request_emoji_reaction - Removed
delete_merge_request_note - Removed
delete_merge_request_note_emoji_reaction - Removed
discover_tools - Removed
download_attachment - Removed
fork_repository - Removed
get_branch - Removed
get_branch_diffs - Removed
get_commit - Removed
get_commit_diff - Removed
get_draft_note - Removed
get_file_blame - Removed
get_file_contents - Removed
get_issue - Removed
get_issue_link - Removed
get_label - Removed
get_merge_request - Removed
get_merge_request_approval_state - Removed
get_merge_request_conflicts - Removed
get_merge_request_diffs - Removed
get_merge_request_file_diff - Removed
get_merge_request_note - Removed
get_merge_request_notes - Removed
get_merge_request_version - Removed
get_namespace - Removed
get_project - Removed
get_project_events - Removed
get_repository_tree - Removed
get_user - Removed
get_users - Removed
health_check - Removed
list_branches - Removed
list_commit_statuses - Removed
list_commits - Removed
list_draft_notes - Removed
list_events - Removed
list_group_iterations - Removed
list_group_projects - Removed
list_issue_discussions - Removed
list_issue_emoji_reactions - Removed
list_issue_links - Removed
list_issue_note_emoji_reactions - Removed
list_issues - Removed
list_labels - Removed
list_merge_request_changed_files - Removed
list_merge_request_diffs - Removed
list_merge_request_emoji_reactions - Removed
list_merge_request_note_emoji_reactions - Removed
list_merge_request_pipelines - Removed
list_merge_request_versions - Removed
list_merge_requests - Removed
list_namespaces - Removed
list_project_members - Removed
list_projects - Removed
list_todos - Removed
mark_all_todos_done - Removed
mark_todo_done - Removed
merge_merge_request - Removed
mr_discussions - Removed
my_issues - Removed
publish_draft_note - Removed
push_files - Removed
resolve_merge_request_thread - Removed
search_repositories - Removed
unapprove_merge_request - Removed
update_draft_note - Removed
update_issue - Removed
update_issue_description_patch - Removed
update_issue_note - Removed
update_label - Removed
update_merge_request - Removed
update_merge_request_discussion_note - Removed
update_merge_request_note - Removed
upload_markdown - Removed
validate_ci_lint - Removed
validate_project_ci_lint - Removed
verify_namespace - Removed
whoami
TDQS
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.
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.
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.
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
Related MCP Connectors
GitLab MCP — wraps the GitLab REST API v4 (BYO API key)
A MCP server built for developers enabling Git based project management with project and personal…
Go MCP server for GitLab: 2 dynamic tools reach 1000+ REST/GraphQL actions. Free/CE, no paid tier.
Related MCP Servers
- AlicenseAqualityBmaintenanceMCP server for GitLab CI/CD — pipelines, jobs, schedules, branches, tags, merge requests and repository files. Works with any GitLab (SaaS gitlab.com or self-hosted) via python-gitlab.232MIT
- AlicenseNot gradedqualityDmaintenanceMCP 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.302MIT
- AlicenseAqualityAmaintenanceModel 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.233MIT
- AlicenseNot gradedqualityAmaintenanceMCP server for interacting with GitLab API, supporting dynamic tool selection and enterprise-grade security.10MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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