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 "Deploy 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?
261 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 | ~261 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.63. If you always want the newest release, use npx -y @zereight/mcp-gitlab@latest instead. The server prints a notice to stderr on startup when a newer version is available (disable with GITLAB_DISABLE_VERSION_CHECK=true).
Using CLI Arguments (for clients with env var issues)
Some MCP clients (like GitHub Copilot CLI) have issues with environment variables. Use CLI arguments instead:
{
"mcpServers": {
"gitlab": {
"command": "zereight-mcp-gitlab",
"args": ["--token=YOUR_GITLAB_TOKEN", "--api-url=https://gitlab.com/api/v4"],
"tools": ["*"]
}
}
}Available CLI arguments:
--token- GitLab Personal Access Token (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)--masking-enabled=true- Enable text-response masking (replacesGITLAB_MASKING_ENABLED)--masking-config- Path to a masking configuration file (replacesGITLAB_MASKING_CONFIG)--masking-policy-file- Path to a protected managed-policy file (replacesGITLAB_MASKING_POLICY_FILE)--masking-workspace-dir- Directory used to resolve masking files (replacesGITLAB_MASKING_WORKSPACE_DIR)
CLI arguments take precedence over environment variables.
zereight-mcp-gitlab auth is a subcommand (not an MCP server flag). It runs GitLab device flow and exits. See CLI Arguments.
Fine-grained tool filtering: use
GITLAB_PERMISSION_MODE=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 requestapprove_merge_request- Approve a merge requestunapprove_merge_request- Unapprove a merge requestget_merge_request_approval_state- Get merge request approval details including approversget_merge_request_conflicts- Get the conflicts of a merge requestlist_merge_request_pipelines- List pipelines for a merge request with paginationexecute_graphql- Execute a GitLab GraphQL querycreate_or_update_file- Create or update a file in a GitLab projectsearch_repositories- Search for GitLab projectscreate_repository- Create a new GitLab projectcreate_group- Create new group or subgroupget_file_contents- Get contents of a file or directory from a GitLab projectpush_files- Push multiple files in a single commitcreate_issue- Create a new issuecreate_merge_request- Create a new merge requestfork_repository- Fork a project to your account or specified namespacecreate_branch- Create a new branchget_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 (mergeRequestIid or branchName required). Set include_summaries=true for deployment/commit/approval summariesget_merge_request_diffs- Get the changes/diffs of a merge request (mergeRequestIid or branchName required)list_merge_request_changed_files- List changed file paths in a merge request without diff content (mergeRequestIid or branchName required)list_merge_request_diffs- List merge request diffs with pagination (mergeRequestIid or branchName required)get_merge_request_file_diff- Get diffs for specific files from a merge request (mergeRequestIid or branchName required)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 diffs between two branches or commitsupdate_merge_request- Update a merge request (mergeRequestIid or branchName required)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 a merge requestdelete_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 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 request. Optionally sets reviewer_state and posts a summary note (GitLab 19.2+). Can set reviewer_state even with no drafts.list_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 note to an issue, optionally replying to a discussion 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; use scope='all' for all)my_issues- List issues assigned to the authenticated userget_issue- Get details of a specific issue. Returns a slim milestone by default; set full_response=true for the complete milestone objectupdate_issue- Update an issue. Returns a slim confirmation by default; set full_response=true for the complete updated issue objectupdate_issue_description_patch- Apply a patch (search/replace or unified diff) to an issue description. Reduces token usage by allowing small changes without sending the full description. Supports dry_run to preview changes and create_note to summarize updates.delete_issue- Delete an issuelist_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 issueget_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 (users and groups) available to the current user. Filter by kind='group' for groups only.get_namespace- Get details of a namespace (user or group) by ID or path. Groups are namespaces with kind='group'.verify_namespace- Verify if a namespace path exists. Use parent_id to scope the check to a specific parent namespace — required for nested namespaces where the same path may exist under different parents.get_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 grouplist_wiki_pages- List wiki pages in a projectget_wiki_page- Get details of a specific wiki pagecreate_wiki_page- Create a wiki page in a projectupdate_wiki_page- Update a wiki page in a projectdelete_wiki_page- Delete a wiki page from a projectlist_group_wiki_pages- List wiki pages in a groupget_group_wiki_page- Get details of a specific group wiki pagecreate_group_wiki_page- Create a wiki page in a groupupdate_group_wiki_page- Update a wiki page in a groupdelete_group_wiki_page- Delete a wiki page from a groupget_repository_tree- List files and directories in a repositorylist_pipelines- List pipelines with filtering optionsget_pipeline- Get details of a specific pipelineget_pipeline_variables- Get variables configured for a pipelineget_pipeline_test_report- Get pipeline test reportget_pipeline_test_report_summary- Get pipeline test report summarydelete_pipeline- Delete a pipeline. Requires the project Owner role, cannot be undone, and does not automatically delete child pipelines.update_pipeline_metadata- Update pipeline metadatalist_deployments- List deployments with filtering optionsget_deployment- Get deployment details, including approval_summary, approvals, and pending_approval_count when GitLab provides themcreate_deployment- Create a deploymentupdate_deployment- Update a deployment statusdelete_deployment- Delete a deploymentlist_deployment_merge_requests- List merge requests shipped with a deploymentapprove_deployment- Approve or reject a protected-environment deploymentlist_environments- List environments in a projectget_environment- Get details of a specific environmentupdate_environment- Update an environmentdelete_environment- Delete a stopped environmentstop_environment- Stop an environmentstop_stale_environments- Stop eligible stale environments; protected environments are excluded and environments are stopped, not deleteddelete_review_app_environments- Schedule deletion of stopped review-app environments one week later; dry_run defaults to true and actual scheduling requires dry_run=falselist_pipeline_triggers- List project pipeline trigger tokensget_pipeline_trigger- Get a project pipeline triggercreate_pipeline_trigger- Create a project pipeline triggerupdate_pipeline_trigger- Update a project pipeline triggerdelete_pipeline_trigger- Delete a project pipeline triggertrigger_pipeline- Trigger a pipeline with a pipeline trigger tokenlist_pipeline_jobs- List all jobs in a specific pipelinelist_pipeline_trigger_jobs- List trigger jobs (bridges) in a pipelineget_pipeline_job- Get details of a GitLab pipeline job numberget_pipeline_job_output- Get the output/trace of a pipeline job with optional paginationvalidate_ci_lint- Validate provided GitLab CI/CD YAML content for a projectvalidate_project_ci_lint- Validate an existing .gitlab-ci.yml configuration 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 immediatelytake_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 jobplay_pipeline_jobs- Play multiple manual pipeline jobs sequentiallyretry_pipeline_job- Retry a failed or canceled pipeline jobcancel_pipeline_job- Cancel a running pipeline joberase_pipeline_job- Erase a pipeline job log and artifactswait_for_pipeline- Wait for a pipeline to reach a terminal statuswait_for_job- Wait for a job to reach a terminal statuslist_job_artifacts- List artifact files in a job's archivedownload_job_artifacts- Download job artifact archive (zip) and save to a local pathget_job_artifact_file- Get content of a single file from a job's artifactslist_merge_requests- List merge requests (without project_id: user's MRs; with project_id: project MRs)list_group_merge_requests- List merge requests across all projects of a group and its subgroupslist_milestones- List milestones with filtering optionsget_milestone- Get details of a specific milestonecreate_milestone- Create a new milestoneedit_milestone- Edit an existing milestonedelete_milestone- Delete a milestoneget_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 group milestones with filtering optionsget_group_milestone- Get details of a specific group milestonecreate_group_milestone- Create a new group milestoneedit_group_milestone- Edit an existing group milestonedelete_group_milestone- Delete a group milestoneget_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 commitcreate_commit_status- Create or update the status of a commitlist_group_iterations- List group iterations with filtering optionsupload_markdown- Upload a file for use in markdown contentdownload_attachment- Download an uploaded file from a project (images returned as base64; use local_path to save to disk)health_check- Verify server status and authentication. Always reports the MCP server version (mcp_server_version). When authenticated, also reports the GitLab instance version from GET /api/v4/version (version, revision, enterprise). Version lookup failures do not fail the health check — those fields are omitted.list_events- List events for the authenticated user (before/after: YYYY-MM-DD)get_project_events- List events for a project (before/after: YYYY-MM-DD)list_releases- List all releases for a projectget_release- Get a release by tag namecreate_release- Create a new releaseupdate_release- Update an existing releasedelete_release- Delete a release (does not delete the tag)create_release_evidence- Create release evidence (Premium/Ultimate)download_release_asset- Download a release asset file by direct asset pathlist_tags- List repository tags for a projectget_tag- Get a repository tag by namecreate_tag- Create a new repository tagdelete_tag- Delete a repository tagget_tag_signature- Get the X.509 signature of a signed tag (404 if unsigned)get_work_item- Get a work item with full details including status, hierarchy, type, and widgetslist_work_items- List work items with filters (type, state, search, assignees, labels)create_work_item- Create a work item (issue, task, incident, epic, etc.) with full field supportupdate_work_item- Update a work item (title, description, labels, assignees, state, parent, custom fields, etc.)convert_work_item_type- Convert a work item to a different typelist_work_item_statuses- List available statuses for a work item type (Premium/Ultimate)list_custom_field_definitions- List custom field definitions for a work item typemove_work_item- Move a work item to a different projectlist_work_item_notes- List notes and discussions on a work itemcreate_work_item_note- Add a note to a work item (supports Markdown, internal notes, threads)list_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 incidentcreate_timeline_event- Create a timeline event on an incidentlist_webhooks- List webhooks for a project or groupcreate_webhook- Create a webhook on a 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)get_webhook_event- Get full details of a specific webhook eventsearch_code- Search for code across all projects (requires advanced search or Zoekt)search_project_code- Search for code within a specific project (requires advanced search or Zoekt)search_group_code- Search for code within a specific group (requires advanced search or Zoekt)list_project_variables- List CI/CD variables for a projectget_project_variable- Get a single CI/CD variable from a projectcreate_project_variable- Create a CI/CD variable for a projectupdate_project_variable- Update an existing CI/CD variable in a projectdelete_project_variable- Delete a CI/CD variable from a projectlist_group_variables- List CI/CD variables for a groupget_group_variable- Get a single CI/CD variable from a groupcreate_group_variable- Create a CI/CD variable for a groupupdate_group_variable- Update an existing CI/CD variable in a groupdelete_group_variable- Delete a CI/CD variable from a groupget_dependency_proxy_settings- Get dependency proxy settings for a groupupdate_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 grouppurge_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 remediationorbit_query- Execute a GitLab Orbit graph query over the indexed SDLC knowledge graphorbit_get_schema- Fetch the current GitLab Orbit graph schema (node and edge types)orbit_get_status- Check GitLab Orbit indexing status for the enabled scopeorbit_list_tools- List the MCP tool definitions exposed by GitLab Orbitdiscover_tools- Discover and activate additional tool categories for this session. Available categories: merge_requests, issues, repositories, branches, projects, labels, ci, groups, pipelines, milestones, wiki, releases, tags, users, workitems, webhooks, search, variables, dependency_proxy, vulnerabilities, orbit. Already-active categories are listed in the response.
Wiki page titles vs. slugs
GitLab derives a wiki page's slug (its URL, /-/wikis/<slug>) from the page title. Passing title to update_wiki_page / update_group_wiki_page therefore renames the page and changes its URL — for nested pages it can also move the page to a different path — which breaks existing links.
To change only the displayed title while keeping the URL stable, do not pass title. Instead, store the display title in the page content's YAML front matter and update the content:
---
title: My Custom Display Title
---
Page body…GitLab keeps the slug/URL untouched and shows the front-matter title in the UI. Read it back with get_wiki_page using render_html: true, which populates the front_matter field — the plain title field always reflects the slug-derived value.
Testing 🧪
The project includes comprehensive test coverage including remote authorization:
# Run all tests (API validation + remote auth)
npm test
# Run only remote authorization tests
npm run test:remote-auth
# Run all tests including readonly MCP tests
npm run test:all
# Run only API validation
npm run test:integrationAll remote authorization tests use a mock GitLab server and do not require actual GitLab credentials.
Available Tools
118 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 repository state, requires branch-creation permission, and lists possible error types (validation, missing-ref, protected-project, already-exists). The openWorldHint annotation is minimal, so the description carries the burden and does so well, though it doesn't detail side effects beyond state change.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no filler. The core purpose is front-loaded, usage guidance follows, and parameter clarifications are compactly appended. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter tool with no output schema, the description covers purpose, usage, permissions, error cases, and parameter semantics. It doesn't describe the return value shape, but the description already mentions it returns the new branch or an error, which is sufficient for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all three parameters. The description adds a small amount of context by explaining that project_id accepts a numeric ID or URL-encoded path and that ref selects the starting revision, but this largely mirrors the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Create a new branch') and distinguishes it from siblings by naming get_branch/list_branches for inspection and protect_branch for post-creation protection. It clearly identifies what the tool does and how it differs from related branch tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use this tool ('Use this to create a branch from a branch, tag, or commit') and names alternatives for inspection and protection. It also states the required permission (branch-creation permission), giving clear context for when this tool is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_commit_statusA
Create or update the status of a commit. Use this for a new resource or action; choose the corresponding update or edit tool when the resource already exists. It changes remote GitLab state and requires the necessary project or group permission; GitLab returns validation, conflict, permission, or rate-limit errors instead of silently applying an invalid request. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.
| 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?
The description explicitly states that it changes remote GitLab state and requires project/group permissions, and explains that the API returns validation, conflict, permission, and rate-limit errors rather than silently succeeding. Since annotations only contain openWorldHint=true, this behavioral disclosure carries the full burden and does so well.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose and side effects are front-loaded and concise, but the generic create-vs-update sentence and the closing boilerplate about required identifiers or pagination are not tailored to this tool and could mislead. Size is reasonable but not every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation with 10 parameters and no output schema, the description covers state change, permission requirements, and error behavior, but it omits the key upsert semantics (that an existing status with the same name/context is updated) and repeats the confusing update-tool advice. This leaves an agent with enough to act but with a significant ambiguity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents all 10 parameters at 100% coverage, so no extra parameter detail is needed, but the description adds boilerplate that is not grounded in the schema: it mentions group_id, which is not an accepted input, and references pagination fields that do not exist on this schema. This is actively more confusing than helpful.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opening sentence names the exact operation and resource: 'Create or update the status of a commit.' This distinguishes it from the read-only sibling list_commit_statuses and leaves no doubt about what resource is acted on.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It offers a generic rule ('choose the corresponding update or edit tool when the resource already exists') but this is misleading here: the tool itself supports updating commit statuses and there is no update_commit_status sibling. It also does not point to list_commit_statuses for checking existing statuses, so an agent could be steered toward a non-existent alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_draft_noteA
Create a draft note for a merge request. Use this for a new resource or action; choose the corresponding update or edit tool when the resource already exists. It changes remote GitLab state and requires the necessary project or group permission; GitLab returns validation, conflict, permission, or rate-limit errors instead of silently applying an invalid request. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.
| 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?
With only openWorldHint as an annotation, the description carries the safety disclosure burden. It explicitly says the tool 'changes remote GitLab state,' requires project/group permission, and returns validation, conflict, permission, or rate-limit errors rather than silently applying invalid requests. This adds meaningful context beyond the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose and side-effect warning, and is not overly long. However, the closing sentence about pagination fields is generic boilerplate that does not apply to this tool's schema, and 'described by the schema' is redundant filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The complex position object is thoroughly documented in the schema, so the description does not need to repeat it. It adds the key operational context: state change, permissions, and error behavior. A short note on draft-note lifecycle (unpublished until publish_draft_note) would strengthen it, but it is reasonably complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all six parameters in detail, including the complex position object. The description's note about numeric IDs or URL-encoded paths mostly restates the project_id schema, and the 'group_id' mention is conditional boilerplate not present in this schema. A baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Create a draft note for a merge request.' It also explicitly distinguishes creation from update/edit tools, which separates it from siblings like update_draft_note and delete_draft_note.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states 'Use this for a new resource or action' and directs the agent to the corresponding update or edit tool when the resource already exists. It also adds permission prerequisites and error behavior. It could name update_draft_note explicitly or contrast with create_note, but the guidance is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_groupA
Create new group or subgroup. Use this for a new resource or action; choose the corresponding update or edit tool when the resource already exists. It changes remote GitLab state and requires the necessary project or group permission; GitLab returns validation, conflict, permission, or rate-limit errors instead of silently applying an invalid request. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.
| 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?
Beyond the sparse openWorldHint annotation, the description discloses that the operation creates remote project data, requires issue creation permission, and returns either the new issue or validation, permission, and duplicate-related errors. This is meaningful behavioral context for a mutation tool, though it could have added more detail about side effects like notifications or idempotency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no filler. The core purpose is front-loaded, followed by routing guidance and behavioral/error context, and every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with 8 parameters, a fully documented schema, and no output schema, the description provides the essential extra context: side effect, permission requirement, and expected success/error returns. An agent has what it needs to decide whether to call the tool and what to expect.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents every parameter. The description does not add parameter-level detail beyond what the schema provides, so it meets the baseline but does not exceed it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Create a new issue', a specific verb and resource that makes the tool's purpose immediately clear. It further distinguishes itself from update_issue and create_issue_note, ensuring the agent can tell it apart from the most similar sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use this tool ('Use this to open a new issue') and when not to: 'use update_issue for an existing issue and create_issue_note to add discussion without changing issue fields'. This gives clear routing guidance with named alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_issue_emoji_reactionA
Add an emoji reaction to an issue (e.g. thumbsup, rocket, eyes). Use this for a new resource or action; choose the corresponding update or edit tool when the resource already exists. It changes remote GitLab state and requires the necessary project or group permission; GitLab returns validation, conflict, permission, or rate-limit errors instead of silently applying an invalid request. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.
| 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?
With no readOnly or destructive annotations present, the description usefully states that the tool changes remote GitLab state and requires permissions. It also discloses error behavior (validation, conflict, permission, rate-limit) rather than silent failure. This gives an agent important behavioral context beyond the openWorldHint annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, with the core action front-loaded and examples early. The final sentence contains generic filler ('pagination fields', 'described by the schema') that is not applicable and could be trimmed, so it is not maximally concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple 3-parameter creation tool, the description covers purpose, mutation, permissions, errors, and identifier format. It is diminished by irrelevant boilerplate about group_id and pagination, and it does not mention what a successful response returns or how to distinguish from note-level emoji reactions. Overall adequate but not complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already describes all three parameters with 100% coverage, so the baseline is 3. The description adds emoji-name examples and repeats URL-encoding guidance for project_id, but its mention of group_id and pagination fields is boilerplate that does not match this schema. It does not meaningfully clarify issue_iid beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a concrete action and resource ('Add an emoji reaction to an issue') with examples of valid emoji names, which is immediately actionable. The follow-up create-vs-update phrasing helps distinguish from edit tools, though it does not explicitly distinguish from sibling note-emoji reaction tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly advises using this for a new resource or action and choosing an update/edit tool when the resource already exists, and it notes permission requirements. However, the guidance is generic and does not name specific siblings like create_issue_note_emoji_reaction, and the 'update or edit' advice is questionable for this tool since no update_issue_emoji_reaction sibling exists.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_issue_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?
Annotations are sparse (only openWorldHint), so the description must carry the transparency burden. It does: it states the operation 'creates remote discussion content,' requires note permission, and returns the note or a missing-issue/thread/permission error. This covers mutation, permissions, and failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly packed sentences front-load the core action, then handle alternatives, side effects, permissions, and error cases. There is no filler, repetition, or unnecessary detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema and only a weak annotation, the description is complete enough for an agent to select and invoke the tool correctly: it covers purpose, when to use alternatives, remote side effects, permission requirements, and expected return/error behavior. The 100% schema coverage handles parameter details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all five parameters. The description adds only contextual framing around the discussion thread behavior, which is already reflected in the discussion_id schema description. It doesn't enrich parameter semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with a specific verb and resource: 'Add a note to an issue, optionally replying to a discussion thread.' It also explicitly distinguishes itself from update_issue and create_note, making its purpose unambiguous against a crowded set of sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives direct routing guidance: 'use update_issue for issue fields and create_note only when the generic endpoint is required.' This tells an agent exactly when to pick this tool and when to pick an alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_issue_note_emoji_reactionA
Add an emoji reaction to an issue note. Pass discussion_id for discussion thread replies. Use this for a new resource or action; choose the corresponding update or edit tool when the resource already exists. It changes remote GitLab state and requires the necessary project or group permission; GitLab returns validation, conflict, permission, or rate-limit errors instead of silently applying an invalid request. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.
| 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?
With only openWorldHint in annotations, the description carries the behavioral burden and delivers: it states that the tool mutates remote GitLab state, requires project/group permission, and surfaces validation, conflict, permission, or rate-limit errors rather than silently accepting invalid requests. This is valuable beyond the sparse annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose is front-loaded in the first sentence, which is good. However, the middle sentences are generic boilerplate ('Use this for a new resource or action...', 'use required identifiers and pagination fields exactly as documented') that could apply to any GitLab tool and add little specific value; the mention of pagination fields is inaccurate for a schema with no pagination parameters.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a five-parameter tool with full schema coverage and no output schema, the description addresses the key gaps: the discussion_id nuance, mutation semantics, permission requirements, and error behavior. An agent has enough to call the tool correctly without needing to read the GitLab API docs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds marginal value by noting that project_id accepts a numeric ID or URL-encoded path and that discussion_id is the thread-reply differentiator — but most parameter meaning already lives in the schema, and the generic 'pagination fields' remark is boilerplate that doesn't apply to this schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Add an emoji reaction to an issue note') and clarifies the discussion_id variant for thread replies. It distinguishes creation from update/edit tools, though it doesn't explicitly name the closest siblings (create_issue_emoji_reaction, create_merge_request_note_emoji_reaction) — the resource is specific enough that an agent can disambiguate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives an explicit when-to-use rule ('Pass discussion_id for discussion thread replies'), a creation-vs-update routing rule ('choose the corresponding update or edit tool when the resource already exists'), and notes that required identifiers must be used exactly as documented. It lacks an explicit alternative-tool name, but the guidance is concrete and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_labelA
Create a new label in a project. Use this for a new resource or action; choose the corresponding update or edit tool when the resource already exists. It changes remote GitLab state and requires the necessary project or group permission; GitLab returns validation, conflict, permission, or rate-limit errors instead of silently applying an invalid request. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.
| 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?
The openWorldHint annotation already implies external side effects, but the description adds valuable specifics: it changes remote GitLab state, requires project or group permission, and returns validation, conflict, permission, or rate-limit errors rather than silently succeeding. This goes beyond the annotation and gives the agent a clear failure model, though it doesn't discuss idempotency or response payload.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first two sentences are tight and valuable, but the third sentence includes generic boilerplate about pagination and group_id that doesn't apply to this tool. This wastes tokens and could misdirect the agent, making the description less effective than it could be with a more targeted final sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given there is no output schema, the description should explain the return value, but it does not. It also omits behavior for duplicate labels or partial updates, though it does mention conflict errors. The inaccurate group_id and pagination references detract from completeness, making this only minimally adequate for a correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already has 100% coverage, so the baseline is 3, but the description's parameter guidance is partly inaccurate. It mentions 'group_id' which is not in the input schema, and refers to 'pagination fields' that have no relevance to this create operation. The only useful addition, that project_id can be a numeric ID or URL-encoded path, merely repeats the schema's description, so it adds confusion instead of clear value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Create a new label in a project' with a specific verb and resource. It also differentiates from the update/edit siblings by explicitly saying to use those when the resource already exists, so an agent can confidently select this tool versus update_label or create_issue.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says 'Use this for a new resource or action; choose the corresponding update or edit tool when the resource already exists,' giving a direct when-to-use vs. when-not-to-use. It also notes permission requirements and error behavior, which helps the agent decide if this tool is appropriate given its context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_merge_requestA
Create a new merge request. Use this to open a new merge request from an existing source branch to a target branch; use update_merge_request after it exists. The operation creates remote review state, requires project access, and returns the new merge request or a validation, permission, branch, or duplicate-related error.
| 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?
With only `openWorldHint` as an annotation, the description carries the behavioral disclosure burden. It clearly states that the operation "creates remote review state," requires project access, and returns either the new MR or validation, permission, branch, or duplicate-related errors. It stops short of detailing reversibility or side effects like source branch removal, but this is solid coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three tightly written sentences with the core action front-loaded. Every sentence adds meaning: what it does, when to use it versus the sibling, and what side effects and outcomes to expect.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 13-parameter tool with no output schema, the description covers the essential operational facts: purpose, lifecycle relationship to `update_merge_request`, remote state creation, permission requirements, and return/error categories. It could mention that merging an existing MR is handled by `merge_merge_request`, but the sibling names make that reasonably clear.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description mentions source and target branches but adds little semantic depth beyond the schema's own parameter descriptions, which already explain each field.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: "Create a new merge request." It further specifies that it opens an MR from an existing source branch to a target branch and explicitly distinguishes it from `update_merge_request`, so an agent can tell it apart from sibling MR tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives direct usage guidance: use it to open a new merge request and use `update_merge_request` after the MR exists. It also notes the operation requires project access, which helps the agent decide when it is applicable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_merge_request_discussion_noteA
Add a new discussion note to an existing merge request thread. Use this to reply inside an existing merge request discussion; use create_merge_request_thread to start a new thread and create_merge_request_note for a top-level note. The operation creates remote review content, requires note permission, and returns the new note or a missing-discussion/position/permission error.
| 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?
Annotations only provide openWorldHint, so the description carries most of the behavioral burden. It discloses that the operation creates remote review content, requires note permission, and returns either the new note or missing-discussion/position/permission errors. This adds meaningful context beyond the annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core action, followed by routing and consequence details. There is no filler or redundant restatement of the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a write-style tool with no output schema, it still tells the agent what to expect (new note or error) and which permission is required. Combined with full parameter schema and sibling differentiation, the description is sufficiently complete; only minor details like created_at behavior are left to the schema, which already documents them.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, with descriptions for all five parameters, so the schema carries the parameter documentation burden. The description reinforces the purpose of discussion_id and body but adds no new parameter-level detail beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description uses a specific verb and resource: 'Add a new discussion note to an existing merge request thread.' It also distinguishes itself from `create_merge_request_thread` and `create_merge_request_note` by naming the exact context (reply inside existing discussion).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use this tool: to reply inside an existing merge request discussion. It names the alternatives for starting a new thread and adding a top-level note, so no inference is needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_merge_request_emoji_reactionB
Add an emoji reaction to a merge request (e.g. thumbsup, rocket, eyes). Use this for a new resource or action; choose the corresponding update or edit tool when the resource already exists. It changes remote GitLab state and requires the necessary project or group permission; GitLab returns validation, conflict, permission, or rate-limit errors instead of silently applying an invalid request. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.
| 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?
The annotations only provide openWorldHint, so the description carries the behavioral burden. It explicitly says the tool changes remote GitLab state, requires project or group permission, and surfaces validation, conflict, permission, or rate-limit errors rather than silently applying invalid requests.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first sentence front-loads the purpose effectively and the error/permission sentence is useful. However, the update/edit alternative and the group_id/pagination boilerplate add noise without corresponding to this tool's actual API surface.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple three-parameter create tool with no output schema, the description covers the key operational details: side effects, permissions, error behavior, and identifier format. It is not fully complete because it omits a pointer to the note-emoji sibling and does not mention what a successful response looks like.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema coverage is 100 percent and already documents the emoji examples and project_id path format, so the description adds little beyond the schema. The closing note about group_id and pagination fields is generic and not fully relevant to this tool's actual parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action, Add an emoji reaction to a merge request, with concrete emoji examples. It is clear about the resource but does not distinguish itself from the similarly named sibling create_merge_request_note_emoji_reaction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Offers only a generic new-resource versus update/edit rule, which does not map cleanly to any real update tool for emoji reactions in the sibling list. It gives no guidance about when to choose this tool over the closely related create_merge_request_note_emoji_reaction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_merge_request_noteA
Add a new note to a merge request. Use this for a new resource or action; choose the corresponding update or edit tool when the resource already exists. It changes remote GitLab state and requires the necessary project or group permission; GitLab returns validation, conflict, permission, or rate-limit errors instead of silently applying an invalid request. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.
| 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?
Description discloses that it mutates remote state, requires permissions, and returns validation/conflict/permission/rate-limit errors. This is valuable since annotations provide only openWorldHint and no safety flags. It doesn't mention potential side effects (e.g., notifications or discussion threading) but covers the core behavior well.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose, then usage, then behavior. It is moderately concise and each sentence earns its place, though the final sentence about identifiers/pagination is somewhat generic and could be trimmed without losing essential information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (3 params, no output schema, minimal annotations), the description covers purpose, usage, permissions, and error handling. It is sufficiently complete for an agent to invoke it correctly, though it could mention the exact response format (since no output schema exists) and any content constraints on the note body.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so parameters are already documented. The description adds minimal extra meaning; it mentions providing numeric ID or URL-encoded path, but that's already in the schema. It also references 'group_id' which is not a parameter in this tool, creating slight confusion. Value added is marginal.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a clear verb+resource: 'Add a new note to a merge request.' Explicitly distinguishes from update/edit tools, making the purpose unambiguous and differentiating from siblings like update_merge_request_note.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs to use this for new resources/actions and to choose the corresponding update/edit tool when the resource exists. This covers the main alternative, though it doesn't differentiate from other create-type note tools (e.g., create_merge_request_thread or create_draft_note), leaving some ambiguity for those siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_merge_request_note_emoji_reactionA
Add an emoji reaction to a merge request note. Pass discussion_id for discussion thread replies. Use this for a new resource or action; choose the corresponding update or edit tool when the resource already exists. It changes remote GitLab state and requires the necessary project or group permission; GitLab returns validation, conflict, permission, or rate-limit errors instead of silently applying an invalid request. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.
| 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?
Despite only openWorldHint being set in the annotations, the description explicitly discloses that the tool changes remote GitLab state, requires appropriate project/group permissions, and returns validation, conflict, permission, or rate-limit errors instead of silently succeeding. This gives the agent the essential behavioral expectations for a mutating operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first two sentences are specific and efficient, but the final sentence is generic boilerplate about group_id and pagination fields that is neither relevant nor accurate for this tool. The overall length is acceptable, but that last sentence does not earn its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers important operational context: discussion_id behavior, remote state mutation, permissions, and error modes. However, it includes irrelevant group_id/pagination wording and gives a misleading update/edit alternative when no such tool exists, leaving the overall picture accurate but not fully reliable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description does not add meaningful parameter semantics and instead introduces inaccuracies: it references group_id and pagination fields that do not exist in this tool's schema. The numeric ID or URL-encoded path advice merely repeats what the project_id schema description already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence names a specific verb and resource: adding an emoji reaction to a merge request note. This clearly distinguishes it from related siblings like create_merge_request_emoji_reaction, which targets the merge request itself, and create_merge_request_note, which creates a note without a reaction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It offers some context, such as passing discussion_id for discussion thread replies, but the guidance to 'choose the corresponding update or edit tool when the resource already exists' is misleading: no update or edit tool exists for merge request note emoji reactions in the sibling list, only delete and create tools. It also does not name the closest alternatives like create_merge_request_emoji_reaction or delete_merge_request_note_emoji_reaction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_merge_request_threadA
Create a new thread on a merge request. Use this to start a review thread on a merge request; use create_merge_request_note for an unthreaded note and create_merge_request_discussion_note to reply to an existing thread. The operation creates remote review content, requires note permission, and returns the discussion or a position/permission/validation error.
| 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?
Annotations provide only openWorldHint, so the description carries the behavioral burden. It discloses that the operation creates remote content, requires note permission, and returns either the discussion or permission/validation errors. This goes beyond the schema and gives an agent a realistic failure model.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences: purpose, routing to alternatives, and behavioral/error summary. No filler or repeated schema content, and the most important selection information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex nested tool there is no output schema, but the description states the success return (discussion) and main error categories. Combined with the very detailed input schema and sibling routing, an agent has enough to invoke and verify the call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema already documents all five parameters including the nested position object with detailed rules for line_code, shas, and line ranges. The description adds no parameter-level detail, but with 100% schema coverage the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it creates a new thread on a merge request and explicitly frames it as starting a review thread. Names the sibling tools for unthreaded notes and replies, which distinguishes it from adjacent operations. The verb+resource is specific and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use this tool: to start a review thread. It also says when not to use it, naming create_merge_request_note for unthreaded notes and create_merge_request_discussion_note for replies to existing threads. The permission requirement provides an additional eligibility check before invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_noteA
Create a new note (comment) to an issue or merge request. Use this for a top-level comment on an issue or merge request when no typed discussion operation is needed; use create_merge_request_thread or create_issue_note for threaded replies. The operation creates remote discussion content, requires note permission, and returns the created note or a target/permission/validation error.
| 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 provide openWorldHint=true, so the description carries the behavioral burden. It discloses that the operation mutates remote discussion content, requires note permission, and returns the created note or an error, covering the main behavioral risks even though it omits finer details like idempotency or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: definition, usage routing, and behavior/return information. No unnecessary detail or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite lacking an output schema, the description provides the essential return and error information. All required parameters are documented in the schema, and the tool's complexity is modest, so nothing needed for a correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters are already fully documented. The description adds context about top-level usage but no additional parameter-level meaning, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Create a new note (comment) to an issue or merge request.' It further narrows scope to top-level comments, distinguishing it from threaded note operations and making sibling differentiation clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use this tool ('for a top-level comment ... when no typed discussion operation is needed') and names alternatives for threaded replies (`create_merge_request_thread` or `create_issue_note`). The when-to-use and when-not-to-use guidance is direct and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_or_update_fileA
Create or update a file in a GitLab project. Use this for a single repository file when you know whether the target path is new or already exists; use push_files for a multi-file commit. Optional encoding (text or base64) defaults to GITLAB_REPO_FILE_ENCODING so existing callers stay unchanged. The operation creates or updates remote content in a commit, requires repository write permission, and returns the commit result or a conflict/validation error.
| 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?
Annotations provide only `openWorldHint`, so the description carries the burden of disclosing effects. It explains that the tool writes through a commit, requires repository write permission, and surfaces conflict/validation errors. It stops just short of explicitly stating that an existing file's content will be overwritten.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four purposeful sentences: purpose, usage rule, encoding default/backward compatibility, and permission/error behavior. It is front-loaded and contains no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter mutation tool with no output schema, this description covers selection criteria, write permission, commit semantics, encoding, and the return/error class. The high schema coverage fills in remaining field details, so an agent has what it needs to call the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline for parameter semantics is 3. The description mostly restates the `encoding` default already present in the schema and does not clarify the relation between `commit_id` and `last_commit_id` or the rename behavior of `previous_path`.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Create or update a file in a GitLab project') and immediately narrows scope to a single repository file. It also names `push_files` as the multi-file sibling, so an agent can distinguish this tool without inspecting schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit conditions for use: a single repository file when the target path is known to be new or existing. It also calls out the alternative, `push_files`, for multi-file commits, which makes the selection rule unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_repositoryA
Create a new GitLab project. Use this for a new resource or action; choose the corresponding update or edit tool when the resource already exists. It changes remote GitLab state and requires the necessary project or group permission; GitLab returns validation, conflict, permission, or rate-limit errors instead of silently applying an invalid request. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.
| 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?
The description adds value beyond the openWorldHint annotation by disclosing that it changes remote GitLab state, requires permissions, and returns validation/conflict/permission/rate-limit errors instead of silently failing. This is useful behavioral context for the agent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description starts with a clear purpose and provides usage guidance, but the final sentence about project_id/group_id and pagination fields is irrelevant and confusing. It adds noise without earning its place, reducing overall conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the core purpose, usage guidance, and error behavior, but the misleading parameter reference creates a gap that could lead an agent to look for non-existent fields. It also does not mention what happens on success (e.g., returned project object), though with no output schema this may be less critical. Overall, it is adequate but not fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. However, the description includes a confusing reference to 'project_id' or 'group_id' and 'pagination fields' that do not exist in the schema (only namespace_id is present). This adds misleading guidance that could misdirect the agent, and it does not clarify any of the actual parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb and resource: 'Create a new GitLab project.' It also distinguishes this from update/edit tools, making it easy for an agent to select this tool for new resources and the update tool for existing ones.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use this tool ('Use this for a new resource or action') and when not to ('choose the corresponding update or edit tool when the resource already exists'). This directly routes the agent to the correct alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_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?
The description discloses the permanent/irreversible nature of the operation ('permanently removes a remote branch'), the required permission ('requires branch-delete permission'), and the error outcomes ('protected-branch, missing-resource, or permission error'). It adds value beyond the destructiveHint annotation by specifying consequences and failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: the primary action and resource are stated in the first sentence, followed by concise usage and behavioral notes. Every sentence earns its place—no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's destructive nature, the description is fully complete: it covers when to use, what to do before, what the operation does, what permissions are needed, and what errors to expect. No output schema is present, but the description adequately signals return shape ('returns the deletion result or ... error') while the error list covers the key failure cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers 100% of the parameters with descriptions, so the baseline is 3. The description adds clarifying context: it clarifies that `branch_name` refers to the branch being deleted, reinforces that `project_id` is the target, and connects the parameters to the operation's semantics (e.g., confirming the branch name means checking `branch_name`). This slight edge warrants a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Delete') and resource ('branch from project'), and clearly distinguishes this tool from siblings like `get_branch`, `list_branches`, `protect_branch`, and `update_default_branch` by specifying the action and scope. It also names the sibling tools explicitly in the usage guidance, so an agent can differentiate it without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use guidance: 'Use this only after confirming the branch name and intended data loss; use `get_branch` or `list_branches` before deletion and never use it to remove branch protection.' It gives clear preconditions, exclusions, and alternatives, which is exemplary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_draft_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, orbit. Already-active categories are listed in the response. Use this when a needed opt-in category is not currently exposed; omit category to inspect available categories, then call it with a category to activate that group for the current session. It changes only the session's tool registry, returns the active-tool summary, and does not change GitLab data.
| 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?
Annotations already provide readOnlyHint=true-does not say 'is a read-only operation' in description. The description adds that the effect is scoped to the session tool registryrix, that categories are listed in the response, and that GitLab data is untouched. This is useful beyond the annotations, though it doesn't clarify failure modes like invalid category names or whether activation is idempotent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single compact paragraph with every sentence earning its place: core action, parameter semantics, usage trigger, side-effect scope, and response content. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with one optional parameter and no output schema, the description covers what the agent needs: available category examples, how to discover vs activate, what the response includes, and the safety boundary. Nothing important is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with one optional string parameter. The description adds critical semantics: omitting the parameter lists available categories, while providing it activates that category. That usage nuance goes beyond the schema and meaningfully guides the agent.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource pair: 'Discover and activate additional tool categories for this session.' It clearly differentiates this from the GitLab data-operation siblings by framing it as session tool management.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use it ('when a needed opt-in category is not currently exposed') and precisely explains the two invocation modes: omit `category` to list, or provide it to activate. This gives an agent direct decision criteria for when this tool beats the alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
download_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?
It explicitly states the tool is read-only and does not mutate GitLab data, consistent with readOnlyHint. It also discloses concrete error behaviors (missing resources, invalid identifiers, insufficient permission, rate limits) that are not present in the annotations, adding valuable transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first sentence is front-loaded and concise, but the later sentences contain boilerplate about group_id and pagination that are irrelevant to this specific tool. The description could be tighter without losing necessary guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple getter with two required parameters and no output schema, the description covers the invocation context, safety profile, error behavior, and return-field hints. It is sufficiently complete for an agent to call the tool correctly and understand what to expect.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline 3 applies, but the description adds no new parameter meaning beyond the schema. It mostly repeats the project_id wording and includes a generic reference to group_id and pagination fields that do not apply to this two-parameter tool, which is slightly misleading.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence names a specific verb and resource ('Get branch details') and identifies the key fields returned (commit, protection status). It also distinguishes itself from discovery tools by stating it is for a known resource, separating it clearly from siblings like list_branches and get_protected_branch.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use this tool ('for a known resource or result') and when to prefer list/search tools (for discovering multiple resources). It does not name the exact sibling tool, e.g., list_branches, but the decision rule is clear and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_branch_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?
Annotations already include readOnlyHint=true, and the description reinforces this by stating 'read-only' and adding error behavior: missing resources, invalid identifiers, insufficient permission, and rate limits returned as errors. This provides useful context beyond the annotation without contradicting it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is moderately sized with purpose, usage, behavior, and parameter guidance in four sentences. It is mostly front-loaded and every sentence contributes value, though the final sentence's 'exactly as documented' is mildly redundant, so it is not maximally tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity, the description covers purpose, usage boundaries, read-only behavior, error conditions, and parameter handling. There is no output schema, but the tool's return values are fairly predictable from the name; the absence of explicit return-format details is a minor gap, not a blocking one.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all parameters are documented in the schema. The description adds a generic note about providing project_id as a numeric ID or URL-encoded path, but it mostly restates what the schema already offers and does not add per-parameter meaning beyond that baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Get diffs between two branches or commits', a specific verb and resource. It also adds a scoping clue by contrasting with list/search tools, though it does not name sibling diff tools like get_commit_diff or list_merge_request_diffs, so differentiation is clear but not fully explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use it ('for a known resource or result') and when not to ('choose the corresponding list or search tool when you need to discover multiple resources'). It offers a clear exclusion but does not name specific alternative tools, so it stops short of maximum explicitness.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ci_catalog_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 the description reinforces it while adding concrete error behavior: missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. This is valuable beyond the annotation, though it does not describe success payloads.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, front-loads the core action, and keeps usage guidance brief. However, it contains some redundancy ('read-only' vs 'does not mutate') and an irrelevant mention of group_id not present in the schema, which prevents a top score.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-commit retrieval tool with a complete schema and read-only annotations, the description provides enough context: purpose, usage, identifier format, and error handling. It doesn't explain the return shape, but that is permissible without an output schema. The optional stats parameter is left to the schema, which is acceptable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the description is not obligated to repeat parameter meanings. It does add a note about providing numeric ID or URL-encoded path, but that closely mirrors the schema description for project_id. The generic instruction to use identifiers and pagination fields 'exactly as documented' adds little beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get details of a specific commit') and explicitly distinguishes itself from list/search tools by saying to use those for discovery. This differentiates it from siblings like list_commits and get_commit_diff.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use guidance: 'Use this for a known resource or result; choose the corresponding list or search tool when you need to discover multiple resources.' This clearly routes the agent to alternatives, satisfying the requirement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_commit_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?
Building on the readOnlyHint annotation, the description adds that the tool does not mutate GitLab data and details error behavior for missing resources, invalid identifiers, insufficient permission, and rate limits. This is useful context beyond the structured annotations, though it does not describe the return payload.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded and the description is only four sentences, each adding information. The final sentence is somewhat boilerplate and could be tightened, but nothing is redundant enough to hurt clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a small read-only tool with full schema coverage and no output schema, the description covers use case, mutation safety, and error behavior comprehensively. It is complete enough for an agent to select and invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents all three parameters (100% coverage), so the description needs to add little. It adds the practical note about numeric IDs or URL-encoded paths, but the group_id mention does not match the schema and no new per-parameter semantics are provided.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('Get changes/diffs of a specific commit'), and clarifies scope by contrasting with list/search tools for discovering multiple resources. This distinguishes it from siblings like list_commits and get_commit without requiring the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states to use this when a specific resource/result is already known and to switch to a list or search tool for discovery. It names a category of alternatives rather than specific sibling tools, but the when/when-not guidance is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_draft_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 | Yes | 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 already convey readOnlyHint=true, so the safety profile is covered. The description adds meaningful behavioral detail beyond the schema by explaining the return shape: each entry maps a contiguous source-line range to the commit that last changed them, including id, author, authored_date, and message. This is especially valuable given there is no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no filler. The core purpose and output structure are front-loaded in the first sentence, and the optional line-range usage is clearly stated in the second. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only operation with fully documented parameters and readOnlyHint/openWorldHint annotations, the description covers what an agent needs: the purpose, the returned data shape, and the optional range restriction. The absence of an output schema is compensated by the explicit entry structure in the description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all five parameters, including required fields and the paired constraint on range_start/range_end. The description reiterates that range_start/range_end limit blame to specific lines, but does not add substantial new meaning beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb, resource, and operation: 'Get git blame for a file at a given ref.' The phrase 'git blame' clearly distinguishes it from sibling file-related tools like get_file_contents or get_repository_tree, since no other tool claims to map lines to commits.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context: it retrieves blame for a file at a ref, and explains how to scope the operation with range_start/range_end. It does not explicitly name alternative tools or when-not-to-use this tool, but the unique blame semantics make the proper use clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_file_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 issue management: inspect one issue's fields; use list_issues or my_issues to discover issues first. It is read-only, requires issue read permission, and returns the issue or an error when the identifier is invalid, the issue is missing, or access is denied.
| 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?
Beyond the readOnlyHint annotation, it discloses issue read permission, error behavior for invalid/missing identifiers or denied access, and the default slim response versus full_response mode. The 'milestone' wording is slightly inconsistent with the issue-focused schema, so transparency is high but not flawless.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three front-loaded sentences cover purpose, response modes, usage context, permissions, and error behavior with no filler. It avoids duplicating the schema's parameter details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description covers default versus full response, error cases, permission requirements, and read-only status, which is enough for an agent to call and interpret the result. The main shortcoming is the ambiguous 'milestone' versus 'issue object' wording in the response-mode sentence.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All three parameters are already described in the schema, so the description adds little new parameter-level meaning. It only restates that full_response=true yields a larger response, which is already implied by the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Get details of a specific issue' and reinforces that it is for inspecting a single issue's fields. It also distinguishes itself from the listing siblings by telling the agent to use list_issues or my_issues for discovery first.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use the tool — to inspect one issue's fields — and which alternatives to use first for discovery. It does not contrast it with update/delete siblings, but the read-only statement makes the non-mutating usage clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_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_discussionARead-only
Get a single discussion item for a merge request. Use this to fetch one known merge request discussion by discussion identifier; use mr_discussions for a collection and get_merge_request_note for a flat note. It is read-only and returns the discussion item or an error for an invalid identifier, missing discussion, or insufficient permission.
| Name | Required | Description | Default |
|---|---|---|---|
| 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?
The description states read-only behavior, matching the readOnlyHint annotation, and goes beyond annotations by specifying error outcomes: invalid identifier, missing discussion, or insufficient permission. It does not detail the response shape, but the error semantics add useful operational context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences: purpose, usage/alternative routing, and behavior/errors. The most important scoping information is front-loaded and every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple 3-parameter read-only tool with no output schema, the description covers selection, invocation context, and likely error cases. It does not describe the discussion item structure, but that is not necessary for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and each parameter already has a clear description (project ID or encoded path, thread ID, MR IID). The tool description adds little beyond saying the discussion is fetched 'by discussion identifier,' so the schema carries the parameter-meaning burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening clause 'Get a single discussion item for a merge request' names a specific verb, resource, and singular scope. It further clarifies the target by contrasting with `mr_discussions` (collection) and `get_merge_request_note` (flat note), making the tool distinguishable from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says to use this tool for 'one known merge request discussion by discussion identifier' and directs the agent to `mr_discussions` for a collection and `get_merge_request_note` for a flat note. This is direct when/when-not guidance with named alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_merge_request_file_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 declare readOnlyHint=true, and the description reinforces 'It is read-only and does not mutate GitLab data'. It also discloses error conditions ('missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors'), which is valuable context beyond annotations. The only minor gap is absence of detail on response format, but with no output schema and openWorldHint, this is acceptable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each with a distinct purpose: what it does, when to use, and behavior/parameter guidance. It is front-loaded with the core purpose. The parameter guidance sentence is a bit long but necessary. Could be slightly more concise, but overall efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool is a simple read operation with only 2 parameters and annotations cover safety, the description provides sufficient context: purpose, usage boundaries, error behavior, and parameter format. It doesn't meet full 5 because it doesn't specify output structure (e.g., current access levels format), but that is not critical for this simple tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented. The description adds guidance on providing 'numeric ID or complete URL-encoded path' for project_id, which is useful but incremental. It doesn't add new semantics for branch_name beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Get details of a single protected branch (access levels, force push settings)'. This is a specific verb-resource pair that distinguishes it from sibling tools like 'list_protected_branches' and complements 'protect_branch'/'unprotect_branch'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says 'Use this for a known resource or result; choose the corresponding list or search tool when you need to discover multiple resources.' This provides clear when-to-use and when-not-to-use guidance and names the alternative class of tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_repository_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. Always reports the MCP server version (mcp_server_version). When authenticated, also reports the GitLab instance version from GET /api/v4/version (version, revision, enterprise). Version lookup failures do not fail the health check — those fields are omitted. Use this to verify server connectivity and authentication before making GitLab requests; use whoami when the authenticated user's identity is the goal. It does not mutate GitLab state and returns server/authentication status plus GitLab version details when available.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses conditional behavior (reports mcp_server_version always, GitLab version only when authenticated), failure tolerance (version lookup failures omit fields without failing the check), and explicitly states it does not mutate GitLab state. This adds significant context about runtime behavior and edge cases.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is moderately sized but well-structured: purpose first, then concrete behavioral details, usage guidance, and a no-mutation note. Each sentence contributes useful information; the only minor inefficiency is the final sentence partially repeating earlier points about status and version details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter health check with no output schema, the description is remarkably complete: it specifies what fields are always returned, what is conditionally returned, how failures are handled, when to use it, and that it is non-mutating. An agent has everything needed to invoke it correctly and interpret results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has zero parameters)Skip and 100% coverage trivially, so the baseline is 4. The description adds no parameter-specific detail because there are none, but it implicitly confirms the tool takes no arguments while explaining what the returned status reports cover.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Verify') and resource ('server status and authentication'), and explicitly differentiates from sibling `whoami` by noting the health check serves connectivity/auth verification rather than identifying the user. This leaves no ambiguity about the tool's core function.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly instructs when to use the tool ('before making GitLab requests') and when to prefer the alternative (`whoami` when the authenticated user's identity is the goal). This direct when/when-not guidance is exactly what an agent needs for tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_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?
Annotations already declare readOnlyHint=true, and the description reinforces this and adds error conditions (missing resources, invalid identifiers, insufficient permission, rate limits). This adds context beyond the annotation without contradicting it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, front-loads the purpose, and then gives usage guidance and error behavior. It avoids unnecessary verbosity, though the phrase 'use required identifiers and pagination fields exactly as documented' is slightly redundant with the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a list tool with 11 parameters and no output schema, the description covers the main usage decisions, error handling, and read-only nature. It does not describe the return format, but that is not critical for a list operation, and the schema documents all parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so parameters are well documented in the schema. The description adds only generic advice about providing numeric IDs or URL-encoded paths (already in schema) and using pagination fields, which does not significantly enhance parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists commit statuses, which is a specific verb+resource. It distinguishes from single-resource get tools by saying 'choose the corresponding get tool when you already know the single resource to inspect,' providing a clear boundary with sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use this tool versus a get tool, and gives guidance on required identifiers and pagination fields. This makes it easy for an agent to decide between this and alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_draft_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 issue management: list GitLab issues, optionally scoped with project_id. Use get_issue when the issue iid is already known and my_issues for issues assigned to the current user. It is read-only and paginated, requires issue read permission, and returns issue records or GitLab errors for invalid identifiers, missing resources, or rate limits.
| 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?
Annotations already declare `readOnlyHint: true` and the description does not contradict that. It adds extra useful behavioral context: the tool is paginated, requires issue read permission, and describes error outcomes such as invalid identifiers, missing resources, and rate limits. This goes beyond what the annotations alone provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
All three sentences are information-dense and no filler: default behavior, sibling routing, and behavioral caveats are each front-loaded. It avoids repeating schema field docs and stays appropriately compact for a tool with a large parameter list.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a list tool with 21 optional params and no output schema, the description covers the most important invocation concerns: read-only guarantee, pagination, permission requirement, return type, and failure modes. It does not abbreviate the output record shape or note the subtle overlap between `scope=assigned_to_me` and the `my_issues` tool, but these are minor given the schema already documents filters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds meaningful interpretation of the defaults and scope behavior: it clarifies that the default is 'created by current user' and that `project_id` is optional, which helps the agent choose initial parameters without diving into each of the 21 properties.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb and resource ('List GitLab issues') and immediately explains the default behavior and scope variants. It explicitly differentiates this tool from siblings `get_issue` and `my_issues`, making it unambiguous which tool to pick without inspecting their schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit routing conditions: use `get_issue` when the iid is already known, and `my_issues` for issues assigned to the current user. It also notes the optional `project_id` scoping and the default scope, providing actionable guidance for when to call this tool instead of alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_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, and the description reinforces this by stating 'It is read-only and paginated.' More importantly, it adds substantive behavioral context beyond annotations: access requirements ('requires project access') and error semantics ('GitLab errors for invalid identifiers, missing resources, or rate limits'). This gives the agent a clear picture of failure modes and preconditions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no filler. The core action is front-loaded in sentence one, routing guidance follows, and behavioral/error details close it out. Every sentence earns its place, and the total length is appropriate for the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given there is no output schema, the description compensates by stating what is returned ('pipeline records or GitLab errors') and the error categories. With only 4 simple scalar parameters, no nested objects, and read-only annotations covering the safety profile, nothing essential is missing for an agent to select and invoke this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters (project_id, merge_request_iid, page, per_page) are already documented in the schema. The description mentions pagination, which thematically maps to page/per_page, but adds no format or syntax details beyond what the schema provides. Baseline 3 is appropriate when the schema carries the documentation load.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource — 'List pipelines for a merge request with pagination' — making the operation unambiguous. It further distinguishes scope by contrasting with `list_pipelines` for project-wide filtering, which differentiates it from sibling merge-request tools. The purpose is immediately clear and distinct.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit routing guidance: 'Use this to inspect pipelines associated with one merge request; use `list_pipelines` for project-wide pipeline filtering.' This names the alternative and the exact condition that selects it. The only minor caveat is that `list_pipelines` is not among the visible sibling tools, but openWorldHint=true makes this acceptable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_merge_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_issuesARead-only
List issues assigned to the authenticated user. Use this for issue management: list issues assigned to the authenticated user. Use list_issues for project-wide or author-scoped listing and get_issue for one issue. It is read-only and paginated, requires authentication, and returns assigned issue records or permission/rate-limit errors.
| 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?
Explicitly states it is read-only (consistent with readOnlyHint=true annotation), paginated, requires authentication, and returns permission/rate-limit errors. Goes beyond the annotation to disclose pagination, auth, and failure behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the key verb phrase around 4 words in. However, it redundantly repeats 'List issues assigned to the authenticated user' in the second sentence ('Use this for issue management: list issues assigned to the authenticated user'), wasting tokens.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-parameter read-only tool with fully documented schema, the description covers authentication, pagination, and error behavior. It does not describe the response record shape (no output schema exists), but the scope and invocation context are sufficiently complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already covers all 11 parameters with descriptions (100% coverage), so the description is not required to explain parameters. It does add a general hint about pagination, but no parameter-level detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource+scope combo: 'List issues assigned to the authenticated user,' and explicitly differentiates from sibling tools `list_issues` and `get_issue`. An agent can immediately tell what this tool does and what it does not do.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names alternative siblings (`list_issues` for project-wide/author-scoped, `get_issue` for a single issue) and clarifies that this tool is specifically for the authenticated user's assigned issues. Slightly generic 'Use this for issue management' filler, but the routing guidance is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_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 | Yes | 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 carry openWorldHint and destructiveHint, but the description adds substantial context beyond them: what exactly changes ('who may push, merge, or unprotect'), side effects ('may enable force-push or code-owner settings'), the permission gate ('requires maintainer-level permission'), and the return/error shape ('returns the protection rule or a validation/permission error').
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with purpose, followed by usage guidance and behavioral disclosure. Each sentence earns its place, though there is slight redundancy between 'set push/merge/unprotect access levels' (sentence 1) and 'changes who may push, merge, or unprotect' (sentence 3).
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly carries return-value information ('returns the protection rule or a validation/permission error'), and it covers permissions, effects, and usage. Minor gaps remain, such as interaction between existing and new rules on the same branch, but nothing an agent critically needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, with every parameter already documented including access-level enum values and defaults, so the baseline of 3 applies. The description's references to 'push/merge/unprotect access levels' and 'force-push or code-owner settings' conceptually map to the parameters but add no syntax or format detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource pair ('Protect a repository branch') and specifies the concrete meaning of protection ('set push/merge/unprotect access levels'). It also mentions wildcard branch patterns, distinguishing it from related siblings like get_protected_branch, unprotect_branch, and create_branch.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use ('Use this to create or update protection rules for a branch or wildcard') and names the sibling to use beforehand ('use get_protected_branch to inspect existing rules first'). This is direct, actionable routing that leaves little to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
publish_draft_noteA
Publish a single draft note. Use this for the specific operation described; choose a sibling tool when you need a different resource or lifecycle action. It changes remote GitLab state and requires the necessary project or group permission; GitLab returns validation, conflict, permission, or rate-limit errors instead of silently applying an invalid request. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.
| 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?
Annotations only carry openWorldHint and destructiveHint, so the description carries most of the behavioral burden and carries it well. It discloses that the operation writes repository history, requires repository write permission, and returns either the commit result or validation/conflict/protected-branch errors — concrete behavioral and failure-mode context well beyond the annotations. Nothing contradicts the annotations; destructiveHint aligns with the described history-writing side effect.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, each earning its place: core purpose first, then routing guidance, then per-file defaults and constraints, then side effects and error behavior. The most decision-relevant information (what it does, when to use it) is front-loaded, and there is no filler or repetition of schema content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a multi-file mutation tool with no output schema, the description covers everything an agent needs: scope, when to choose the sibling, per-file action/encoding behavior, permission-mode limitations, required permissions, and the expected return/error shape. The per-file field details are thoroughly handled by the 100%-coverage schema, so the description need not repeat them.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already describes defaults, encodings, and previous_path, so the baseline is 3. The description adds genuine value on top: the atomic single-commit semantics, the default-to-create behavior, and especially the GITLAB_PERMISSION_MODE interaction that rejects delete/move — a constraint not present anywhere in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence, 'Push multiple files in a single commit,' states a specific verb, resource, and atomicity guarantee. It explicitly distinguishes itself from create_or_update_file by naming the sibling and the condition that selects it. An agent can identify what this tool does and what it is not without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives an explicit when-to-use ('commit several file changes atomically'), an explicit when-not-to-use ('use create_or_update_file when only one path is involved'), and names the alternative tool. It further adds an environment-conditional constraint (GITLAB_PERMISSION_MODE=modify rejects delete and move), which is unmissable usage guidance beyond the schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resolve_merge_request_threadA
Resolve a thread on a merge request. Use this to mark an existing merge request review thread resolved; use update_merge_request_discussion_note when the note text itself must change. The operation changes review state, requires permission to resolve discussions, and returns the updated discussion or a missing-thread/permission error.
| 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 declare destructiveHint=true, and the description adds meaningful context: it changes repository security controls, requires permission to manage protected branches, and returns an error when the branch is missing or policy forbids the change. This goes beyond the annotation by explaining the permission requirement and error conditions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no wasted words. The core action is front-loaded, the sibling distinction comes second, and the behavioral/error context is packed efficiently into the final sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter tool with full schema coverage and a destructiveHint annotation, the description covers the action, the alternative, the permission requirement, and error conditions. It doesn't describe the return value format, but with no output schema and a simple operation, this is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters. The description adds no new parameter-level detail beyond what the schema provides, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Remove protection') and resource ('previously protected branch'), and explicitly distinguishes itself from protect_branch. It clearly identifies what the tool does and how it differs from the sibling that changes access levels.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use this tool ('remove protection from an existing branch') and when not to ('use protect_branch to change access levels without removing the rule'). This gives an agent clear routing guidance between the two related tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_default_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 destructiveHint and openWorldHint annotations, the description discloses real behavioral consequences: it changes project settings and may affect clone, merge request, and CI defaults. It also states permission requirements and the possible return outcome, giving the agent important context that annotations alone do not provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded with the primary purpose, followed by usage guidance, effects, permissions, and return behavior. Every sentence adds useful information without redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter mutation tool, the description covers when to use it, what it changes, side effects, permissions required, and the return type/error behavior. No output schema exists, so this description carries the full burden well and leaves no critical gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both project_id and default_branch. The description does not add significant parameter-level detail, but with full schema coverage the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Change the default branch of a project') and clearly defines what GitLab treats as the project default. It also explicitly distinguishes itself from create_branch, making it easy for an agent to select the correct tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use this tool and names the alternative: 'use create_branch to create a branch rather than changing project defaults.' This provides clear routing guidance without requiring the agent to infer usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_draft_noteA
Update an existing draft note. Use this for an existing resource; choose the corresponding create tool for a new resource and a note tool for discussion-only text. It changes remote GitLab state and requires the necessary project or group permission; GitLab returns validation, conflict, permission, or rate-limit errors instead of silently applying an invalid request. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.
| 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 clearly states the mutating side effect ('changes the issue description when not dry-running'), the required permission ('issue-edit permission'), and the possible failure modes (mismatch/validation/permission error). Since annotations only provide openWorldHint and no safety flags, this disclosure carries the full weight and does so strongly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is information-dense yet compact, front-loading what the tool does, then usage guidance, then behavior and errors. Every sentence contributes distinct value with no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers side effects, permissions, error classes, dry-run behavior, and note creation, which is substantial for a 7-parameter tool with no output schema. It stops short of specifying the exact patch syntax or the structure of the returned patch result, but those are reasonably inferable and not essential for selection/invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all parameters. The description adds context for dry_run and create_note beyond their schema descriptions, but it doesn't materially elaborate parameter syntax or relationships beyond what the schema provides, matching the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb-resource pair ('Apply a patch to an issue description') and immediately clarifies the two patch formats, search/replace and unified diff. It distinguishes this tool from the sibling update_issue by noting it avoids sending the full description, so an agent can tell them apart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to use this for a targeted search/replace or unified-diff change and tells when to enable dry_run and create_note. It implies the alternative (full description update) through the token-saving rationale, but does not name update_issue as the sibling to use for wholesale rewrites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_issue_noteA
Modify an existing issue thread note. Use this for an existing resource; choose the corresponding create tool for a new resource and a note tool for discussion-only text. It changes remote GitLab state and requires the necessary project or group permission; GitLab returns validation, conflict, permission, or rate-limit errors instead of silently applying an invalid request. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | The content of the note or reply | |
| note_id | Yes | The ID of a thread note | |
| resolved | No | Resolve or unresolve the note | |
| issue_iid | Yes | The IID of an issue | |
| project_id | Yes | Project ID or complete URL-encoded path to project | |
| discussion_id | Yes | 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 project or group permission, and returns validation, conflict, permission, or rate-limit errors instead of silently applying invalid requests. With only openWorldHint=true in annotations, this behavioral context is valuable and does not contradict the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is reasonably front-loaded and has useful early sentences about purpose and usage. However, it includes generic boilerplate such as 'pagination fields exactly as documented' even though this tool has no pagination parameters, and it mentions group_id even though the schema only accepts project_id. This reduces precision and earns its length less effectively.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutating tool with sparse annotations and no output schema, the description covers the essential invocation context: what it modifies, when to choose it, permission requirements, and error behavior. It does not describe the return value, but for a straightforward update operation this is not a critical gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the parameter descriptions already carry the semantic weight. The description adds only generic identifier guidance about numeric IDs or URL-encoded paths and tells agents to use required identifiers as documented, but it does not add meaning beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Modify an existing issue thread note.' It also clarifies what the tool is not for by distinguishing existing resources (this tool) from new resources (create tool) and discussion-only text (note tool), which differentiates it from siblings like create_issue_note and create_note.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use the tool: for an existing issue thread note. It also gives clear when-not guidance by directing agents to the corresponding create tool for new resources and to a note tool for discussion-only text. This is concrete usage guidance that does not rely on inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_labelA
Update an existing label in a project. Use this for an existing resource; choose the corresponding create tool for a new resource and a note tool for discussion-only text. It changes remote GitLab state and requires the necessary project or group permission; GitLab returns validation, conflict, permission, or rate-limit errors instead of silently applying an invalid request. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.
| 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 | Yes | The ID of a thread note | |
| resolved | No | Resolve or unresolve the 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?
Annotations only provide openWorldHint, so the description carries the transparency burden. It explicitly states that the tool changes remote GitLab state, requires permissions, and returns errors instead of silently applying invalid requests. This is useful behavioral context beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded with the purpose, then covers usage, side effects, and parameter notes. Some boilerplate about group_id and pagination is unnecessary and slightly distracts, but the overall structure is readable and useful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutating GitLab tool with minimal annotations and no output schema, the description covers what the tool does, when to use it, its side effects, permission requirements, and error behavior. It does not describe the return value, but an agent can still invoke it correctly with the provided context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all six parameters. The description adds only general ID-format guidance that largely restates the project_id schema entry, and it mentions group_id and pagination fields that do not actually appear in this tool's schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource: 'Update a discussion note on a merge request.' It also distinguishes itself from sibling tools by explicitly saying to use this tool for an existing resource and to choose create tools for new resources and note tools for discussion-only text.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear when-to-use guidance: existing resource vs. create vs. note-only text. It also warns about the necessary project/group permission and the possibility of validation, conflict, permission, or rate-limit errors, which helps the agent decide whether this tool is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_merge_request_noteA
Modify an existing merge request note. Use this for an existing resource; choose the corresponding create tool for a new resource and a note tool for discussion-only text. It changes remote GitLab state and requires the necessary project or group permission; GitLab returns validation, conflict, permission, or rate-limit errors instead of silently applying an invalid request. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.
| 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?
Beyond the openWorldHint annotation, the description discloses that the tool 'changes remote GitLab state', requires 'the necessary project or group permission', and details error behavior ('returns validation, conflict, permission, or rate-limit errors instead of silently applying an invalid request'). This significantly adds to the annotation's minimal information.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences and front-loads the core purpose. The third sentence is long and packs multiple pieces of guidance (permission, errors, parameter usage), making it slightly dense but still efficient. Overall, it is well-structured without unnecessary repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that there is no output schema, the description covers the essential aspects: mutation side effects, permission requirements, error types, and parameter formatting. It does not describe a success response, but that is not strictly necessary. The differentiation from siblings and the mention of potential errors make it sufficiently complete for an update tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description repeats the schema's guidance on project_id (numeric ID or URL-encoded path) without adding new meaning. It also mentions 'group_id' which is not in the schema, potentially causing confusion. The generic advice to use identifiers 'exactly as documented' adds little value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Modify an existing merge request note.' It uses a specific verb (Modify) and resource (merge request note), and explicitly distinguishes it from create and note tools for new or discussion-only resources. This differentiates it from sibling tools like create_merge_request_note and update_merge_request_discussion_note.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells when to use this tool: for an existing resource, and when not to use it: for a new resource (use create tool) and for discussion-only text (use note tool). It also mentions the requirement for project/group permission, providing context for appropriate invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_projectA
Update project settings such as description, visibility, default branch, and feature access levels. Use this for an existing resource; choose the corresponding create tool for a new resource and a note tool for discussion-only text. It changes remote GitLab state and requires the necessary project or group permission; GitLab returns validation, conflict, permission, or rate-limit errors instead of silently applying an invalid request. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Project display name | |
| path | No | Project path/slug | |
| topics | No | Project topics | |
| project_id | Yes | 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?
With only openWorldHint in annotations and no read-only/destructive hints, the description carries the disclosure burden. It clearly states the tool mutates remote GitLab state, requires project/group permission, and surfaces validation, conflict, permission, or rate-limit errors instead of silently accepting invalid requests.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is reasonably short and front-loads the purpose, but the final sentence contains redundant identifier guidance and inaccurate references to group_id and pagination. Not every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 23-parameter mutation tool with no output schema and minimal annotations, the description covers the critical operational context: existing-resource usage, permission needs, state mutation, and error behavior. The inaccurate group_id/pagination references and lack of partial-update semantics keep it from being fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds no useful parameter meaning and introduces inaccuracies: it mentions group_id and pagination fields that do not exist in the schema. The identifier-format advice merely repeats what the schema already says.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence uses a specific verb and resource: 'Update project settings such as description, visibility, default branch, and feature access levels.' This clearly identifies the tool's scope and distinguishes it from issue, merge request, and branch update siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says to use this tool for an existing resource, to choose the corresponding create tool for a new resource, and to use a note tool for discussion-only text. This gives the agent concrete routing guidance and permission requirements.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_markdownC
Upload a file for use in markdown content. Use this for the specific operation described; choose a sibling tool when you need a different resource or lifecycle action. It changes remote GitLab state and requires the necessary project or group permission; GitLab returns validation, conflict, permission, or rate-limit errors instead of silently applying an invalid request. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.
| 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?
Annotations already provide readOnlyHint=true, but the description adds meaningful behavioral detail by enumerating specific error conditions (missing resources, invalid identifiers, insufficient permission, rate limits) and confirming no mutation. This goes beyond what annotations convey and helps agents anticipate failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four sentences with front-loaded purpose and no fluff. The parameter guidance sentence is slightly verbose and includes a misreferenced group_id, but overall it remains compact and readable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter tool with no output schema, the description covers purpose, usage, behavior, and parameter format well. However, it does not describe what a successful validation response looks like, and the group_id inaccuracy plus lack of differentiation from the sibling validator leaves gaps an agent must resolve elsewhere.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. The description adds guidance on providing numeric ID or URL-encoded path for project_id, but it also references group_id which does not exist in the schema, introducing a potential misunderstanding. This prevents it from scoring higher.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool validates GitLab CI/CD YAML content for a project, using a specific verb and resource. It distinguishes from create/update tools by noting it checks without applying, but it does not explicitly differentiate from the similarly named sibling validate_project_ci_lint, so it falls short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit guidance to use this tool for validation before applying changes, and says to choose a create or update tool only after validation succeeds. However, it does not mention the sibling validate_project_ci_lint or any exclusion criteria, leaving some ambiguity about when to pick one validator over the other.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_project_ci_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?
The read-only annotations already indicate this is a safe read operation. The description adds useful behavioral context about path ambiguity in nested namespaces, explaining why parent_id matters and how resolution behaves in that scenario.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two compact sentences. The primary purpose is front-loaded, and the parent_id guidance is included only where it adds necessary operational context. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple existence-check tool with two fully documented parameters and read-only annotations, the description covers everything needed to call it correctly. The ambiguity handling for nested namespaces is addressed, and no critical usage information is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents both parameters thoroughly, with 100% coverage. The description restates parent_id's role in resolving nested namespaces, but does not add significant meaning beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: verifying whether a namespace path exists. It clearly identifies the tool's unique purpose and distinguishes it from sibling tools like get_namespace or list_namespaces by focusing on existence checking.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit guidance on when to use parent_id, explaining that it is needed for nested namespaces where the same path may exist under different parents. It does not discuss alternatives explicitly, but the usage context is clear enough for correct invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
1 tool update
v2.1.63- Added
get_merge_request_discussion
37 tool updates
v2.1.62- Changed
create_branch1 field changed- changed
Input schema / requiredPrevious value: -[ - "branch", - "project_id" -]New value: +[ + "project_id", + "branch" +]
- Changed
create_commit_status1 field changed- changed
Input schema / requiredPrevious value: -[ - "sha", - "state", - "project_id" -]New value: +[ + "project_id", + "sha", + "state" +]
- Changed
create_draft_note1 field changed- changed
Input schema / requiredPrevious value: -[ - "body", - "project_id", - "merge_request_iid" -]New value: +[ + "project_id", + "merge_request_iid", + "body" +]
- Changed
create_issue1 field changed- changed
Input schema / requiredPrevious value: -[ - "title", - "project_id" -]New value: +[ + "project_id", + "title" +]
- Changed
create_issue_emoji_reaction1 field changed- changed
Input schema / requiredPrevious value: -[ - "name", - "project_id", - "issue_iid" -]New value: +[ + "project_id", + "issue_iid", + "name" +]
- Changed
create_issue_note1 field changed- changed
Input schema / requiredPrevious value: -[ - "body", - "project_id", - "issue_iid" -]New value: +[ + "project_id", + "issue_iid", + "body" +]
- Changed
create_issue_note_emoji_reaction1 field changed- changed
Input schema / requiredPrevious value: -[ - "name", - "project_id", - "issue_iid", - "note_id" -]New value: +[ + "project_id", + "issue_iid", + "note_id", + "name" +]
- Changed
create_label1 field changed- changed
Input schema / requiredPrevious value: -[ - "name", - "color", - "project_id" -]New value: +[ + "project_id", + "name", + "color" +]
- Changed
create_merge_request1 field changed- changed
Input schema / requiredPrevious value: -[ - "title", - "source_branch", - "target_branch", - "project_id" -]New value: +[ + "project_id", + "title", + "source_branch", + "target_branch" +]
- Changed
create_merge_request_discussion_note1 field changed- changed
Input schema / requiredPrevious value: -[ - "body", - "project_id", - "merge_request_iid", - "discussion_id" -]New value: +[ + "project_id", + "merge_request_iid", + "discussion_id", + "body" +]
- Changed
create_merge_request_emoji_reaction1 field changed- changed
Input schema / requiredPrevious value: -[ - "name", - "project_id", - "merge_request_iid" -]New value: +[ + "project_id", + "merge_request_iid", + "name" +]
- Changed
create_merge_request_note1 field changed- changed
Input schema / requiredPrevious value: -[ - "body", - "project_id", - "merge_request_iid" -]New value: +[ + "project_id", + "merge_request_iid", + "body" +]
- Changed
create_merge_request_note_emoji_reaction1 field changed- changed
Input schema / requiredPrevious value: -[ - "name", - "project_id", - "merge_request_iid", - "note_id" -]New value: +[ + "project_id", + "merge_request_iid", + "note_id", + "name" +]
- Changed
create_merge_request_thread1 field changed- changed
Input schema / requiredPrevious value: -[ - "body", - "project_id", - "merge_request_iid" -]New value: +[ + "project_id", + "merge_request_iid", + "body" +]
- Changed
create_note1 field changed- changed
Input schema / requiredPrevious value: -[ - "noteable_type", - "body", - "project_id", - "noteable_iid" -]New value: +[ + "project_id", + "noteable_type", + "noteable_iid", + "body" +]
- Changed
create_or_update_file1 field changed- changed
Input schema / requiredPrevious value: -[ - "file_path", - "content", - "commit_message", - "branch", - "project_id" -]New value: +[ + "project_id", + "file_path", + "content", + "commit_message", + "branch" +]
- Changed
create_repository1 field changed- added
Input schema / properties / namespace_id / maximumAdded value: +9007199254740991
- Changed
delete_branch1 field changed- changed
Input schema / requiredPrevious value: -[ - "branch_name", - "project_id" -]New value: +[ + "project_id", + "branch_name" +]
- Changed
get_branch1 field changed- changed
Input schema / requiredPrevious value: -[ - "branch_name", - "project_id" -]New value: +[ + "project_id", + "branch_name" +]
- Changed
get_branch_diffs1 field changed- changed
Input schema / requiredPrevious value: -[ - "from", - "to", - "project_id" -]New value: +[ + "project_id", + "from", + "to" +]
- Changed
get_commit1 field changed- changed
Input schema / requiredPrevious value: -[ - "sha", - "project_id" -]New value: +[ + "project_id", + "sha" +]
- Changed
get_commit_diff1 field changed- changed
Input schema / requiredPrevious value: -[ - "sha", - "project_id" -]New value: +[ + "project_id", + "sha" +]
- Changed
get_file_blame5 fields changed- added
Input schema / properties / range_end / maximumAdded value: +9007199254740991 - added
Input schema / properties / range_end / minimumAdded value: +-9007199254740991 - added
Input schema / properties / range_start / maximumAdded value: +9007199254740991 - added
Input schema / properties / range_start / minimumAdded value: +-9007199254740991 - changed
Input schema / requiredPrevious value: -[ - "file_path", - "ref" -]New value: +[ + "project_id", + "file_path", + "ref" +]
- Changed
get_protected_branch1 field changed- changed
Input schema / requiredPrevious value: -[ - "branch_name", - "project_id" -]New value: +[ + "project_id", + "branch_name" +]
- Changed
list_commit_statuses1 field changed- changed
Input schema / requiredPrevious value: -[ - "sha", - "project_id" -]New value: +[ + "project_id", + "sha" +]
- Changed
list_merge_request_pipelines1 field changed- changed
Input schema / requiredPrevious value: -[ - "merge_request_iid", - "project_id" -]New value: +[ + "project_id", + "merge_request_iid" +]
- Changed
protect_branch7 fields changed- added
Input schema / properties / merge_access_level / maximumAdded value: +9007199254740991 - added
Input schema / properties / merge_access_level / minimumAdded value: +-9007199254740991 - added
Input schema / properties / push_access_level / maximumAdded value: +9007199254740991 - added
Input schema / properties / push_access_level / minimumAdded value: +-9007199254740991 - added
Input schema / properties / unprotect_access_level / maximumAdded value: +9007199254740991 - added
Input schema / properties / unprotect_access_level / minimumAdded value: +-9007199254740991 - changed
Input schema / requiredPrevious value: -[ - "branch_name" -]New value: +[ + "project_id", + "branch_name" +]
- Changed
push_files2 fields changed- removed
Input schema / properties / files / items / additionalPropertiesRemoved value: -false - changed
Input schema / requiredPrevious value: -[ - "branch", - "files", - "commit_message", - "project_id" -]New value: +[ + "project_id", + "branch", + "files", + "commit_message" +]
- Changed
unprotect_branch1 field changed- changed
Input schema / requiredPrevious value: -[ - "branch_name", - "project_id" -]New value: +[ + "project_id", + "branch_name" +]
- Changed
update_default_branch1 field changed- changed
Input schema / requiredPrevious value: -[ - "default_branch", - "project_id" -]New value: +[ + "project_id", + "default_branch" +]
- Changed
update_issue_description_patch1 field changed- changed
Input schema / requiredPrevious value: -[ - "patch_type", - "patch", - "project_id", - "issue_iid" -]New value: +[ + "project_id", + "issue_iid", + "patch_type", + "patch" +]
- Changed
update_issue_note1 field changed- added
Input schema / requiredAdded value: +[ + "project_id", + "issue_iid", + "discussion_id", + "note_id" +]
- Changed
update_merge_request_discussion_note1 field changed- added
Input schema / requiredAdded value: +[ + "project_id", + "merge_request_iid", + "discussion_id", + "note_id" +]
- Changed
update_merge_request_note1 field changed- changed
Input schema / requiredPrevious value: -[ - "body", - "project_id", - "merge_request_iid", - "note_id" -]New value: +[ + "project_id", + "merge_request_iid", + "note_id", + "body" +]
- Changed
update_project1 field changed- added
Input schema / requiredAdded value: +[ + "project_id" +]
- Changed
validate_ci_lint1 field changed- changed
Input schema / requiredPrevious value: -[ - "content", - "project_id" -]New value: +[ + "project_id", + "content" +]
- Changed
verify_namespace2 fields changed- added
Input schema / properties / parent_id / maximumAdded value: +9007199254740991 - added
Input schema / properties / parent_id / minimumAdded value: +-9007199254740991
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
TDQS
Scored across 118 tools
The set contains several clusters of nearly interchangeable tools, especially around notes/discussions (create_note, create_issue_note, create_merge_request_note, create_merge_request_thread, create_merge_request_discussion_note) and diffs (get_merge_request_diffs, list_merge_request_diffs, get_merge_request_file_diff, get_branch_diffs). Descriptions add cross-references, but with 118 tools the boundaries are easy to miss and some pairs remain easy to confuse.
Most tools follow a clear snake_case verb_noun pattern (get_commit, create_branch, delete_label, update_issue). Minor deviations like mr_discussions, whoami, health_check, and my_issues break the pattern but are few and still readable.
118 tools is far beyond the well-scoped range and exceeds the 50+ extreme threshold. Even for a broad GitLab API, exposing this many tools at once overwhelms an agent, and discover_tools hints that even more categories can be activated.
Core GitLab workflows are well covered: issues, merge requests, branches, files, labels, projects, users, and CI validation. However, several notable lifecycle gaps remain, such as no update/delete for groups, no project deletion, no member mutation, and no pipeline/milestone/release tools in the active set, though discover_tools can activate some of these.
Maintenance
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.2339 PyPI2MIT
- 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.403 npmMIT
- 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.237MIT
- AlicenseNot gradedqualityAmaintenanceMCP server for interacting with GitLab API, supporting dynamic tool selection and enterprise-grade security.10MIT