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
JMESPath result filtering — optional
jmespathon tool calls (seetools/list) shrinks JSON results without changing GitLab API requests; when response masking is enabled, JMESPath runs on masked data.
How we compare
@zereight/mcp-gitlab | GitLab MCP A (community CQRS-style) | |
Best for | AI agent workflows | Enterprise multi-instance / grouped tools |
Tool model | ~261 granular tools + | ~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.65. If you always want the newest release, use npx -y @zereight/mcp-gitlab@latest instead. The server prints a notice to stderr on startup when a newer version is available (disable with GITLAB_DISABLE_VERSION_CHECK=true).
Using CLI Arguments (for clients with env var issues)
Some MCP clients (like GitHub Copilot CLI) have issues with environment variables. Use CLI arguments instead:
{
"mcpServers": {
"gitlab": {
"command": "zereight-mcp-gitlab",
"args": ["--token=YOUR_GITLAB_TOKEN", "--api-url=https://gitlab.com/api/v4"],
"tools": ["*"]
}
}
}Available CLI arguments:
--token- GitLab Personal Access Token (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 or teardown 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 and the destructive teardown tools (cancel_pipeline,cancel_pipeline_job,stop_environment,stop_stale_environments,unprotect_branch) — including destructive mutations (deletion and teardown verbs) 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.
SSE session limits
GET /sse is subject to the same remote-transport controls as Streamable HTTP:
Capacity: at most
MAX_SESSIONSconcurrent SSE sessions (default 1000); further connections get503.Creation rate limit: new connections are limited to
MAX_REQUESTS_PER_MINUTEper client IP (default 60); excess connections get429.Idle timeout: a session that receives no
POST /messagesrequest forSESSION_TIMEOUT_SECONDS(default 1 hour) is closed, so an idle client must reconnect instead of holding a capacity slot. Unlike Streamable HTTP, holding the SSE stream open does not count as activity./healthreturns503withstatus: "degraded"while the instance is at capacity.
Tune these with MAX_SESSIONS, MAX_REQUESTS_PER_MINUTE, and SESSION_TIMEOUT_SECONDS.
Remote Authorization Setup (Multi-User Support)
When using REMOTE_AUTHORIZATION=true, the MCP server can support multiple users, each with their own GitLab token passed via HTTP headers. This is useful for:
Shared MCP server instances where each user needs their own GitLab access
IDE integrations that can inject user-specific tokens into MCP requests
Setup Example:
# Start server with remote authorization
docker run -d \
-e HOST=0.0.0.0 \
-e STREAMABLE_HTTP=true \
-e REMOTE_AUTHORIZATION=true \
-e GITLAB_API_URL="https://gitlab.com/api/v4" \
-e GITLAB_PERMISSION_MODE=readonly \
-e SESSION_TIMEOUT_SECONDS=3600 \
-p 3333:3002 \
zereight050/gitlab-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 | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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?
Annotations only provide openWorldHint: true, so the description carries the burden of behavioral disclosure. It states that the operation changes review state, may require re-authentication or approval permission, and returns an updated approval result or an error. This adds meaningful context beyond the annotation and aligns with the openWorldHint without contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no redundancy. The first sentence states the core purpose and the key exclusion (does not merge), and the second covers side effects, authentication, and return type. Information is front-loaded and every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 5 parameters and no output schema, the description adequately covers the return value ('updated approval result or a permission/state error') and the key side effect (review state change). It doesn't elaborate on parameter usage, but the schema covers that. The only minor gap is not mentioning the `sha` concurrency check, but that is documented in the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all five parameters are already documented in the input schema. The description does not add extra parameter-level detail, which is acceptable given the schema's thoroughness. Baseline 3 is appropriate because the schema handles the parameter explanations.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb (approve), the resource (merge request), and the exact scope: it records an approval and explicitly clarifies it does not merge or change the source branch. This distinguishes it from sibling tools like merge_merge_request and unapprove_merge_request.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description says 'Use this to record an approval on an existing merge request' and contrasts with merging, so the agent knows when to call it. It also mentions potential re-authentication and permission requirements, giving practical usage context. It doesn't explicitly name alternatives like unapprove, but the core distinction from merge is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bulk_publish_draft_notesA
Publish all draft notes for a merge request. Optionally sets reviewer_state and posts a summary note (GitLab 19.2+). Can set reviewer_state even with no drafts. Use this for the specific operation described; choose a sibling tool when you need a different resource or lifecycle action. It changes remote GitLab state and requires the necessary project or group permission; GitLab returns validation, conflict, permission, or rate-limit errors instead of silently applying an invalid request. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.
| 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) | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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?
The annotations only provide openWorldHint=true, which is a weak signal. The description adds valuable context: it changes remote GitLab state, requires permissions, and returns validation/conflict/permission/rate-limit errors instead of silently failing. It also discloses the non-obvious behavior of setting reviewer_state without drafts. This goes beyond the annotation and helps agents anticipate side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the primary action, followed by optional features, then guidance and behavioral notes. It is not excessively long, but the sentence 'Use this for the specific operation described; choose a sibling tool when you need a different resource or lifecycle action' is somewhat redundant and adds little information. Overall, it is reasonably tight and structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no output schema, the description covers the essential aspects: what it does, optional parameters, permission requirements, and error behavior. It does not describe the success response, but this is not critical given the clear operation and the presence of many sibling tools with similar patterns. The description is sufficient for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents each parameter. The description's only parameter guidance is a generic instruction to provide project_id as numeric ID or URL-encoded path and to follow schema exactly. This adds minimal value beyond the schema and does not give per-parameter insights, so it meets the baseline but not more.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Publish all draft notes for a merge request', clearly stating the verb, resource, and scope. The use of 'all' and the tool name 'bulk_publish' distinguish it from the sibling 'publish_draft_note' (singular). It also mentions optional actions (reviewer_state, summary note) without obscuring the core purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The guidance to 'choose a sibling tool when you need a different resource or lifecycle action' is too generic and does not name any specific alternative (e.g., publish_draft_note for a single note). It does mention the specific condition 'Can set reviewer_state even with no drafts', which is a useful behavior but not a tool-selection guideline. Overall, it lacks explicit when-to-use versus sibling distinctions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_branchA
Create a new branch. Use this to create a branch from a branch, tag, or commit; use get_branch or list_branches to inspect branches and protect_branch to configure protection afterward. The operation changes remote repository state, requires branch-creation permission, and returns the new branch or a validation, missing-ref, protected-project, or already-exists error. project_id accepts a numeric ID or URL-encoded path, branch is the new name, and ref selects its starting revision.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | Source branch/commit for new branch | |
| branch | Yes | Name for the new branch | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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 only openWorldHint in annotations, the description carries the behavioral disclosure burden. It states the operation changes remote repository state, requires branch-creation permission, and returns the new branch or specific error types (validation, missing-ref, protected-project, already-exists). It does not cover default ref behavior or idempotency, but it is substantially transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences, front-loaded with the core action, followed by usage routing, behavioral disclosure, and parameter clarifications. No filler or repeated schema text; every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers what the tool does, when to use it, what can go wrong, and key parameter semantics. Since there is no output schema, explicitly naming the returned new branch or errors is valuable. Minor omissions such as default ref behavior keep it just short of fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for all four parameters, so the baseline is 3. The description adds modest value by clarifying ref can select from a branch, tag, or commit, and that project_id accepts a numeric ID or URL-encoded path, but the jmespath parameter is not mentioned and the schema already documents the properties well.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States 'Create a new branch' with a specific verb and resource, and distinguishes itself from branch-related siblings by naming get_branch/list_branches for inspection and protect_branch for later protection. The scope is clear and an agent can differentiate it without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Use this to create a branch from a branch, tag, or commit' and points to get_branch/list_branches for inspection and protect_branch for configuring protection. This gives concrete routing guidance and clarifies when to choose this tool over relevant alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_commit_statusA
Create or update the status of a commit. Use this for a new resource or action; choose the corresponding update or edit tool when the resource already exists. It changes remote GitLab state and requires the necessary project or group permission; GitLab returns validation, conflict, permission, or rate-limit errors instead of silently applying an invalid request. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.
| 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 | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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 says the tool changes remote GitLab state, requires project or group permission, and surfaces GitLab's error behavior (validation, conflict, permission, rate-limit) instead of silently applying invalid requests. This adds real behavioral context well beyond the minimal readOnly/destructive annotations, which here are absent; it covers mutation, auth needs, and error mode without contradicting the openWorldHint annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose and contains a good behavioral sentence about state change and errors. However, the final sentence drifts into boilerplate about 'required identifiers and pagination fields' and mentions group_id where the schema does not accept one, making the structure less disciplined than it could be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 11 parameters, no output schema, and minimal annotations, the description still covers what the tool does, when to use it, that it mutates remote state, what permissions are needed, and how errors surface. It is incomplete only in that it does not resolve the discrepancy between the described update behavior and the absence of a dedicated update alternative in the sibling tool list.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all parameters and parameter semantics, which sets a baseline of 3. The description adds a useful note about numeric IDs or URL-encoded paths, but it also references group_id and pagination fields in a way that is generic and not represented in the schema, so its added value over the schema is only partial.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence names a specific resource ('status of a commit') and an explicit action ('Create or update'), so the agent can tell what the tool acts on. It also tries to position this against an update/edit alternative, distinguishing it from list-only commit status tools. It loses a point because 'create or update' is immediately undercut by the instruction to prefer an update/edit tool for existing resources, and no corresponding update_commit_status sibling exists in the tool list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states a clear new-vs-existing rule: use this for a new resource or action, and choose the update or edit tool when the resource already exists. However, the alternative is referenced generically rather than by name, and the sibling set has no update_commit_status tool, making the guidance less actionable and slightly inconsistent with the claim that this tool can already update.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_draft_noteA
Create a draft note for a merge request. Use this for a new resource or action; choose the corresponding update or edit tool when the resource already exists. It changes remote GitLab state and requires the necessary project or group permission; GitLab returns validation, conflict, permission, or rate-limit errors instead of silently applying an invalid request. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | The content of the draft note | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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 minimal annotations (only openWorldHint), the description carries the behavioral disclosure burden and does so well: it states that the tool 'changes remote GitLab state,' requires necessary project/group permission, and reports validation, conflict, permission, or rate-limit errors instead of silently applying invalid requests. This gives agents a clear picture of side effects and failure behavior, though it does not explicitly mention that draft notes remain unpublished until a separate publish action.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the core purpose, followed by usage, side-effect, and identifier guidance. It is not bloated, though the final sentence contains somewhat boilerplate wording about pagination fields that does not apply to this tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a complex nested schema with 7 parameters and no output schema, the description adequately covers the essential context: what the tool does, when to use it, that it mutates remote state, that permissions are required, and how errors surface. It does not explain the draft-note lifecycle or how position/discussion parameters relate to GitLab semantics, but the schema itself provides detailed documentation for those fields.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all parameters thoroughly and the baseline is 3. The description adds only generic guidance about providing numeric IDs or URL-encoded paths and using required identifiers; this mostly restates the schema's project_id description. The mention of 'group_id' and 'pagination fields' is not directly relevant to this tool's schema, so it adds little semantic value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Create a draft note for a merge request.' It also distinguishes this creation tool from update/edit tools by stating to use it for new resources and to choose the corresponding update/edit tool when the resource already exists. This clearly separates it from siblings like update_draft_note and publish_draft_note.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance: use it for a new resource or action, and choose the corresponding update or edit tool when the resource already exists. However, it does not name the specific sibling tools or explain when to prefer this over related create tools like create_note or create_merge_request_note, so the exclusion guidance is generic rather than concrete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_groupA
Create new group or subgroup. Use this for a new resource or action; choose the corresponding update or edit tool when the resource already exists. It changes remote GitLab state and requires the necessary project or group permission; GitLab returns validation, conflict, permission, or rate-limit errors instead of silently applying an invalid request. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | The name of the group | |
| path | Yes | The path of the group | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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 provide openWorldHint, so the description carries the burden of behavioral disclosure. It does this well by stating that the tool 'changes remote GitLab state,' requires permission, and that GitLab returns validation, conflict, permission, and rate-limit errors rather than silently accepting invalid requests. It does not cover idempotency or duplicate handling, but the major behavioral traits are disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is reasonably brief and front-loads the core purpose, but the final sentence about identifiers and pagination is boilerplate that does not apply to this schema. It adds noise without earning its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers purpose, when to use, mutation side effects, permissions, and error behavior. However, with no output schema, it never states what a successful create returns, and the irrelevant parameter guidance leaves a gap. It is sufficient for a competent call, but not fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds a confusing and partially misleading sentence referencing 'project_id' or 'group_id' and 'pagination fields' that do not appear anywhere in the input schema. It also adds no real semantic value to important parameters like parent_id beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Create new group or subgroup.' This unambiguously distinguishes it from sibling creation tools like create_repository, create_issue, or create_merge_request, and clarifies that it covers both top-level groups and subgroups.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says to use this tool for new resources and to choose the corresponding update or edit tool when the resource already exists. The guidance is clear, though it does not name the exact sibling update tool, which keeps it from being a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_issueA
Create a new issue. Use this to open a new issue; use update_issue for an existing issue and create_issue_note to add discussion without changing issue fields. The operation creates remote project data, requires issue creation permission, and returns the new issue or a validation, permission, or duplicate-related error.
| 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) | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| issue_type | No | The type of issue. One of issue, incident, test_case or task. | issue |
| project_id | Yes | Project ID or complete URL-encoded path to project | |
| description | No | Issue description | |
| assignee_ids | No | Array of user IDs to assign | |
| milestone_id | No | Milestone ID to assign |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only provide openWorldHint, so the description carries most of the behavioral disclosure burden. It clearly states the operation creates remote project data, requires issue creation permission, and returns the new issue or validation/permission/duplicate errors. This gives an agent meaningful expectations about side effects and failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded, with the primary action first and the usage alternatives following. The only minor redundancy is 'Create a new issue' followed by 'Use this to open a new issue,' but overall it is tightly written and information-dense.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having 9 parameters and no output schema, the description covers the core behavioral contract: creation, permission requirement, expected return value, and likely error categories. Optional parameters are fully covered by the schema, so nothing essential is missing for agent decision-making.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so parameters are already well-documented in the input schema. The description adds no parameter-specific semantics beyond the high-level mention of the result and error cases, which is consistent with the baseline 3 for full schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource ('Create a new issue') and immediately differentiates itself from sibling tools: update_issue for existing issues and create_issue_note for discussion-only additions. An agent can confidently select this tool without inspecting sibling schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit guidance is provided: use this tool to open a new issue, update_issue for an existing issue, and create_issue_note for adding discussion without changing issue fields. This directly answers when-to-use and when-not-to-use, with named alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_issue_emoji_reactionA
Add an emoji reaction to an issue (e.g. thumbsup, rocket, eyes). Use this for a new resource or action; choose the corresponding update or edit tool when the resource already exists. It changes remote GitLab state and requires the necessary project or group permission; GitLab returns validation, conflict, permission, or rate-limit errors instead of silently applying an invalid request. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Name of the emoji without colons (e.g. 'thumbsup', 'rocket', 'eyes') | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| issue_iid | Yes | The IID of an issue | |
| project_id | Yes | Project ID or complete URL-encoded path to project |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only provide openWorldHint, so the description carries the behavioral burden. It explicitly discloses that the tool changes remote GitLab state, requires permissions, and surfaces validation, conflict, permission, or rate-limit errors rather than silently succeeding. This is useful beyond the annotations and matches the annotation semantics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action and examples are front-loaded and readable, but the description includes boilerplate such as 'use required identifiers and pagination fields exactly as documented' and a generic new-vs-update rule that is not specifically tailored to emoji reactions. Some sentences add noise rather than tool-specific value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple create operation with no output schema, the description covers the essential facts: mutation, permission needs, error behavior, and identifier format. It does not describe the response or duplicate-reaction behavior, but this is not required given the tool's simplicity and the schema coverage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema already documents all parameters including the emoji name examples. The description restates the project_id format mentioned in the schema and adds no new parameter-level semantics. Baseline 3 applies because the schema already carries the documentation weight.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action and resource: 'Add an emoji reaction to an issue', with concrete examples ('thumbsup', 'rocket'). The issue scope distinguishes it from sibling reaction tools for merge requests and notes, so an agent can identify the correct target without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear creation context: use this for a new resource/action and prefer update/edit tools for existing resources. It also notes permission requirements and error behavior. It does not explicitly name alternate siblings like create_issue_note_emoji_reaction, so it stops short of full alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_issue_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 |
|---|---|---|---|
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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?
With only openWorldHint=true in annotations, the description does valuable work by stating that the call 'changes remote GitLab state,' requires permissions, and that GitLab returns validation/conflict/permission/rate-limit errors rather than silently accepting invalid requests. It does not describe idempotence or the side effect on existing links, but the error and permission context is strong.
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 action, then supplies when-to-use guidance and side-effect/error behavior. The final 'use required identifiers and pagination fields' sentence is slightly boilerplate and references a pagination concept not reflected in the schema, costing 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 state-changing create tool with no output schema and minimal annotations, the description covers purpose, when to use, permissions, and failure behavior. It could add what happens on success or how defaults like link_type behave, but nothing essential for invoking the tool 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 describes 100% of parameters, so the description is not required to re-document them. It adds only a generic reminder to use numeric IDs or URL-encoded paths, which mostly restates the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence names a precise action and resource: 'Create an issue link between two issues.' It is clearly distinct from sibling tools like get_issue_link, delete_issue_link, create_issue, and update_issue, so an agent can select 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?
It explicitly says to use this tool for a new resource or action and to choose the corresponding update/edit tool when the resource already exists. That is an explicit when/when-not rule plus a pointer to alternatives, exceeding the minimum.
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 | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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 only include openWorldHint, which is a minimal hint about side effects. The description carries the burden and discloses that the operation 'creates remote discussion content', requires note permission, and returns the note or a missing-issue/thread/permission error. This goes beyond the sparse annotation and gives the agent a clear behavioral model, including side effects, authorization, and error cases.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, but the second sentence partially repeats the first ('add a note to an existing issue, optionally as a reply to a discussion') before adding the guidance. It is still concise and front-loaded with the primary action, though the redundancy prevents a perfect score.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (6 parameters, no output schema, minimal annotations), the description covers the core purpose, usage guidance, permission requirement, and error outcomes. It doesn't explain the jmespath or created_at parameters, but the schema already defines them, and the description is otherwise sufficient for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents all 6 parameters with descriptions (100% coverage). The description adds no parameter-specific detail beyond what the schema provides; the only related phrase, 'optionally replying to a discussion thread', merely restates what discussion_id already says in the schema. With full schema coverage, a baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Add a note to an issue, optionally replying to a discussion thread', which is a specific verb+resource action. It explicitly differentiates from siblings by naming update_issue for issue fields and create_note for the generic endpoint, so an agent can immediately distinguish this tool from related ones without inspecting schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides explicit when-to-use guidance: 'Use this to add a note to an existing issue, optionally as a reply to a discussion; use update_issue for issue fields and create_note only when the generic endpoint is required.' This also covers when not to use it and names the alternatives, leaving no ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_issue_note_emoji_reactionA
Add an emoji reaction to an issue note. Pass discussion_id for discussion thread replies. Use this for a new resource or action; choose the corresponding update or edit tool when the resource already exists. It changes remote GitLab state and requires the necessary project or group permission; GitLab returns validation, conflict, permission, or rate-limit errors instead of silently applying an invalid request. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.
| 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) | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| issue_iid | Yes | The IID of an issue | |
| project_id | Yes | Project ID or complete URL-encoded path to project | |
| discussion_id | No | The ID of a discussion thread. Required for notes that are discussion replies; omit for top-level notes. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explicitly discloses that the call mutates remote GitLab state, requires project/group permission, and surfaces validation, conflict, permission, or rate-limit errors rather than failing silently. The openWorldHint annotation is weak, so this behavioral and error-mode context is meaningful and goes beyond the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first two sentences are sharp, but the third and fifth are generic boilerplate that could apply to any create tool, and the final sentence references group_id and pagination not present in the schema. The core information is front-loaded, but the extra sentences dilute the description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutating tool with no output schema and only an openWorldHint annotation, the description provides the key operational facts: what resource is targeted, when discussion_id is required, what permissions are needed, and what error classes to expect. It does not describe the success return value, but that is a minor gap for a create action whose schema already documents required identifiers.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All six parameters are already described in the schema, so the baseline is 3. The description adds a useful clarification for discussion_id ('required for notes that are discussion replies') but repeats project_id schema text and introduces irrelevant references to group_id and pagination fields that do not exist in this schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence names the exact action and resource: adding an emoji reaction to an issue note, which distinguishes it from issue-level reaction and MR note reaction siblings. The discussion_id mention further clarifies the target as a note in a discussion thread.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The only tool-selection guidance is a generic 'use this for a new resource... choose update/edit tool when it already exists' line, which is not tailored to this resource and is misleading because no update-emoji-reaction sibling exists. It does not explicitly route agents away from create_issue_emoji_reaction or create_merge_request_note_emoji_reaction, and the discussion_id guidance is about a parameter rather than tool choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_labelA
Create a new label in a project. Use this for a new resource or action; choose the corresponding update or edit tool when the resource already exists. It changes remote GitLab state and requires the necessary project or group permission; GitLab returns validation, conflict, permission, or rate-limit errors instead of silently applying an invalid request. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.
| 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 | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| priority | No | The priority of the label | |
| project_id | Yes | Project ID or URL-encoded path | |
| description | No | The description of the label |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With only openWorldHint in annotations, the description carries the disclosure burden and meets it well: it states that the tool 'changes remote GitLab state,' requires 'the necessary project or group permission,' and that GitLab returns 'validation, conflict, permission, or rate-limit errors instead of silently applying an invalid request.' This gives concrete behavioral expectations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and is reasonably compact. However, the final sentence contains boilerplate about identifiers and pagination fields that adds little specific value and could be trimmed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers purpose, usage timing, side effects, permissions, error behavior, and identifier format, which is strong for a create operation. Since there is no output schema, it could have explicitly stated that the created label is returned, but the absence is a minor gap given the otherwise thorough context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents every parameter. The description adds only general guidance about numeric IDs or URL-encoded paths, which mostly repeats the schema's project_id description; the mention of 'pagination fields' is generic and not represented in this schema, so it does not meaningfully improve parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Create a new label in a project.' It also distinguishes itself from update/edit tools by saying to 'choose the corresponding update or edit tool when the resource already exists,' which separates it from siblings like update_label and delete_label.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use this tool ('for a new resource or action') and when not to ('choose the corresponding update or edit tool when the resource already exists'). It also adds operational context about required permissions and remote state changes, giving an agent clear selection criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_merge_requestA
Create a new merge request. Use this to open a new merge request from an existing source branch to a target branch; use update_merge_request after it exists. The operation creates remote review state, requires project access, and returns the new merge request or a validation, permission, branch, or duplicate-related error.
| 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. | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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?
Annotations only include openWorldHint, so the description carries the behavioral burden. It discloses that the operation 'creates remote review state' (side effect), 'requires project access' (permission prerequisite), and describes return behavior including error categories. These are meaningful, non-obvious behavioral traits not in the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no fluff. The purpose is front-loaded, followed by usage guidance, then behavioral context. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 14-parameter creation tool with no output schema, the description adequately covers purpose, lifecycle sequencing, side effects, permission requirements, and error outcomes. It provides enough for an agent to invoke the tool and interpret the response correctly without needing the schema for high-level semantics.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description only reuses terms like 'source branch' and 'target branch' that are already explained in the schema; it adds no additional parameter-level meaning, but does not need to given full schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the specific action ('Create a new merge request'), the resource ('merge request'), and the context (from existing source branch to target branch). Explicitly differentiates from the sibling `update_merge_request` by stating the lifecycle order, so an agent can clearly distinguish when to create vs. update.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance: 'Use this to open a new merge request from an existing source branch to a target branch; use `update_merge_request` after it exists.' This gives a clear when-to-use condition and names the alternative, making tool selection unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_merge_request_discussion_noteA
Add a new discussion note to an existing merge request thread. Use this to reply inside an existing merge request discussion; use create_merge_request_thread to start a new thread and create_merge_request_note for a top-level note. The operation creates remote review content, requires note permission, and returns the new note or a missing-discussion/position/permission error.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | The content of the note or reply | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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 provide only openWorldHint, leaving behavioral disclosure to the description. The description clearly states that the operation creates remote review content, requires note permission, and returns either the new note or specific error types. This meaningfully exceeds what the annotation alone communicates.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: purpose, sibling differentiation, and behavioral/auth/error disclosure. The most important usage constraint is front-loaded and there is no unnecessary repetition of schema or annotation content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still covers the return value and error cases. Combined with full schema descriptions for all six parameters, the tool definition gives an agent everything needed to select and invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds contextual framing like 'existing' and 'reply', but it does not add substantive parameter-level semantics beyond what the schema already documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Add') and a clear resource ('a new discussion note to an existing merge request thread'). It also explicitly contrasts the tool with create_merge_request_thread and create_merge_request_note, so an agent can distinguish it from its nearest siblings without inspecting schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states exactly when to use this tool: to reply inside an existing merge request discussion. It names the alternatives for starting a new thread and for creating a top-level note, giving clear routing guidance with no ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_merge_request_emoji_reactionA
Add an emoji reaction to a merge request (e.g. thumbsup, rocket, eyes). Use this for a new resource or action; choose the corresponding update or edit tool when the resource already exists. It changes remote GitLab state and requires the necessary project or group permission; GitLab returns validation, conflict, permission, or rate-limit errors instead of silently applying an invalid request. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Name of the emoji without colons (e.g. 'thumbsup', 'rocket', 'eyes') | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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 explicitly states it 'changes remote GitLab state' and requires permission, and discloses that GitLab returns validation, conflict, permission, or rate-limit errors rather than silently applying invalid requests. This provides meaningful behavioral context beyond the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is structured and front-loads purpose, but contains some fluff and inaccuracies, such as referencing 'group_id' when the schema only includes project_id, and mentioning 'pagination fields' which are irrelevant. It could be tightened without losing value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with no output schema, the description covers purpose, usage guidance, side effects, permission requirements, and error behavior. Minor confusion from the group_id/pagination references doesn't hinder overall completeness, but the omission of return value specifics is acceptable given no output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the description adds limited value. It does clarify the project_id format ('numeric ID or complete URL-encoded path'), which is already in the schema, and mentions 'pagination fields' that don't apply to this tool (no pagination). No significant extra meaning is added.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Add an emoji reaction to a merge request') with examples (thumbsup, rocket, eyes), and explicitly differentiates from update/edit tools for existing resources. This clearly distinguishes it from siblings like delete_merge_request_emoji_reaction and list_merge_request_emoji_reactions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides clear guidance: use for new resources/actions, and use an update/edit tool when the resource already exists. This tells the agent when to use it vs alternatives, though it doesn't name specific alternative tools. It also notes permission requirements and error behavior, which helps in deciding applicability.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_merge_request_noteA
Add a new note to a merge request. Use this for a new resource or action; choose the corresponding update or edit tool when the resource already exists. It changes remote GitLab state and requires the necessary project or group permission; GitLab returns validation, conflict, permission, or rate-limit errors instead of silently applying an invalid request. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | The content of the note or reply | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| project_id | Yes | Project ID or complete URL-encoded path to project | |
| merge_request_iid | Yes | The IID of a merge request |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses that the tool changes remote GitLab state, requires permissions, and returns validation/conflict/permission/rate-limit errors. This goes beyond the openWorldHint annotation, which only indicates the world is open. It doesn't contradict annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded with the primary action. It includes necessary usage guidance and error behavior without excessive detail. Slightly dense but each sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (4 params, no output schema), the description covers the key aspects: action, usage, permissions, errors, and identifier format. It doesn't explain return values, but with no output schema and a simple note-creation operation, this is acceptable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all parameters. The description adds guidance on providing numeric ID or URL-encoded path for project_id/group_id, which is useful but not extensive. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Add a new note to a merge request') and distinguishes it from update/edit tools for existing resources. It also differentiates from sibling tools like create_merge_request_discussion_note and create_issue_note by specifying the merge request context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to use this for a new resource/action and to choose the corresponding update or edit tool when the resource already exists. It also mentions required permissions and error behavior, giving clear context for when to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_merge_request_note_emoji_reactionA
Add an emoji reaction to a merge request note. Pass discussion_id for discussion thread replies. Use this for a new resource or action; choose the corresponding update or edit tool when the resource already exists. It changes remote GitLab state and requires the necessary project or group permission; GitLab returns validation, conflict, permission, or rate-limit errors instead of silently applying an invalid request. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.
| 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) | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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?
With only openWorldHint in annotations, the description carries the burden of behavioral disclosure. It clearly states that the call changes remote GitLab state, requires project/group permission, and returns validation, conflict, permission, or rate-limit errors instead of silently succeeding. It also notes the discussion-thread behavior. Idempotency and response format are not covered, but the main operational risks are disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first sentences are tight and front-loaded with the core purpose and the discussion_id tip. The later sentences, especially 'When project_id or group_id is accepted...', read as generic boilerplate not specific to this tool and add unnecessary length. Reasonably organized but not lean.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given six parameters, no output schema, and minimal annotations, the description covers a lot: purpose, mutation safety, permissions, error behavior, discussion replies, and new-vs-update selection. It does not name exact sibling tools or describe the returned object, but those are minor gaps for a create-reaction tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description reiterates the discussion_id behavior that the schema already explains and adds generic project_id/group_id identifier guidance, though group_id is not actually a parameter of this tool. This adds only marginal value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence states a specific verb and resource: 'Add an emoji reaction to a merge request note.' This immediately distinguishes it from siblings like create_merge_request_note or create_merge_request_emoji_reaction. The description also contrasts it with update/edit tools for existing resources.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says to use this tool for a new resource or action and to choose the corresponding update/edit tool when the resource already exists, which provides clear when/when-not guidance. It also explains when discussion_id is needed. However, it does not name the specific sibling tools or mention when deletion would be the right alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_merge_request_threadA
Create a new thread on a merge request. Use this to start a review thread on a merge request; use create_merge_request_note for an unthreaded note and create_merge_request_discussion_note to reply to an existing thread. The operation creates remote review content, requires note permission, and returns the discussion or a position/permission/validation error.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | The content of the thread | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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=true, so the description carries most of the behavioral burden. It states that the operation 'creates remote review content,' requires note permission, and returns a discussion or error. This adds useful transparency about side effects and failure modes, beyond what openWorldHint implies.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: the first states the core action, the second distinguishes siblings, and the third covers behavior and errors. No filler or redundancy; the structure front-loads the purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complex nested schema and openWorldHint annotation, the description covers purpose, alternatives, permissions, and expected return/error behavior. It does not explain how to construct a position object, but the schema covers that in depth, so the description is complete enough for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with rich descriptions on position, line_range, and required fields. The description itself adds no parameter-level meaning beyond the schema, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Create a new thread on a merge request.' It explicitly differentiates from siblings by naming create_merge_request_note for unthreaded notes and create_merge_request_discussion_note for replies, so an agent can immediately tell them apart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: 'Use this to start a review thread' and names the exact alternatives for other cases. It also mentions the permission requirement ('requires note permission'), which is essential context for deciding whether this is the right tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_noteA
Create a new note (comment) to an issue or merge request. Use this for a top-level comment on an issue or merge request when no typed discussion operation is needed; use create_merge_request_thread or create_issue_note for threaded replies. The operation creates remote discussion content, requires note permission, and returns the created note or a target/permission/validation error.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | Note content | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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, so the description carries the burden of behavioral disclosure. It adds useful context: the operation creates remote discussion content, requires note permission, and returns the created note or a target/permission/validation error. This goes beyond the minimal 'creates a note' statement.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no waste. The opening states the operation and resource, the second sentence routes to alternatives, and the third covers remote effect, permissions, and return value. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a creation tool with full schema coverage and no output schema, the description gives the key operational details: top-level scope, alternatives, remote side effect, permission requirement, and possible return/error outcomes. Nothing essential is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all five parameters including the enum for noteable_type. The description adds no per-parameter syntax or format detail but reinforces the overall purpose; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Create') and resource ('a new note (comment) to an issue or merge request'), and distinguishes itself from sibling tools by explicitly framing itself as the top-level comment operation. The description clarifies it is not for threaded replies, so an agent can tell it apart from create_merge_request_thread and create_issue_note.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use guidance: 'Use this for a top-level comment on an issue or merge request when no typed discussion operation is needed'. It also names alternatives for threaded replies, giving clear routing and exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_or_update_fileA
Create or update a file in a GitLab project. Use this for a single repository file when you know whether the target path is new or already exists; use push_files for a multi-file commit. Optional encoding (text or base64) defaults to GITLAB_REPO_FILE_ENCODING so existing callers stay unchanged. The operation creates or updates remote content in a commit, requires repository write permission, and returns the commit result or a conflict/validation error.
| 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. | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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?
With no readOnly/destructive annotations to rely on, the description discloses that the operation mutates remote content in a commit, requires repository write permission, and returns a commit result or conflict/validation error. This gives the agent the key safety and outcome information it needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, all functional: purpose/routing, encoding behavior, and permission/return summary. No filler or repeated information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having 10 parameters and no output schema, the description covers what an agent needs: when to use it, what it does, required permissions, and the kind of result or error to expect. Optional parameters are fully covered by the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all parameters. The description adds the encoding default and permission context but does not meaningfully enrich the other parameters beyond the schema baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear verb-resource pair ('Create or update a file in a GitLab project') and explicitly positions itself as the single-file counterpart to `push_files`. An agent can distinguish this from its siblings immediately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the intended use case (single repository file) and names the alternative (`push_files` for a multi-file commit), which is explicit routing guidance. It also adds the encoding default behavior for backward compatibility, giving practical context for existing callers.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_repositoryA
Create a new GitLab project. Use this for a new resource or action; choose the corresponding update or edit tool when the resource already exists. It changes remote GitLab state and requires the necessary project or group permission; GitLab returns validation, conflict, permission, or rate-limit errors instead of silently applying an invalid request. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Repository name | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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?
Beyond the sparse openWorldHint annotation, the description discloses that the call changes remote GitLab state, requires project/group permission, and reports validation, conflict, permission, or rate-limit errors rather than silently succeeding. This is substantial behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose and usage are front-loaded and each sentence serves a distinct function. The final sentence is somewhat generic boilerplate, but the overall description remains compact.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a moderate-complexity create tool with no output schema, the description covers lifecycle state, permissions, error behavior, and alternative-tool usage. The schema handles parameter details, though the description could have named update_project or clarified namespace_id instead of mentioning absent project_id/group_id.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds only generic advice about project_id/group_id and pagination fields, which are not present in this input schema, so it does not meaningfully enrich the parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Create a new GitLab project', which names a specific verb, resource, and lifecycle stage. It also explicitly distinguishes this create action from update/edit tools, so it is unambiguous against siblings like update_project.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It says to use this for a new resource and to choose the corresponding update/edit tool when the resource already exists, providing an explicit when-not condition. It does not name update_project directly, but the alternative is clear from context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_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 |
|---|---|---|---|
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| project_id | Yes | Project ID or complete URL-encoded path to project | |
| branch_name | Yes | Name of the branch to delete |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructive behavior, and the description adds operationally important context: deletion is permanent, it applies to a remote branch, it requires branch-delete permission, and it can return protected-branch, missing-resource, or permission errors. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences deliver the core action, safety caveats, permission requirement, and expected results with no filler. The most important warning is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter, side-effectful deletion tool, the description covers prerequisites, irreversibility, permissions, and the possible result/error classes without requiring an output schema. Nothing essential for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the description does not need to repeat parameter details. It adds only contextual reassurance about branch confirmation rather than new parameter-level semantics, which matches the baseline for fully covered schemas.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear action and target ('Delete branch from project') and later specifies the effect ('permanently removes a remote branch'). It distinguishes delete_branch from get_branch/list_branches/protect_branch rather than merely restating the name.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit prerequisites ('use get_branch or list_branches before deletion'), a required confirmation step, and a clear exclusion ('never use it to remove branch protection'). The when-to-use guidance is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_draft_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 |
|---|---|---|---|
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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 only indicate destructiveHint and openWorldHint. The description adds crucial behavioral context: 'may be irreversible,' 'requires the necessary project or group permission,' and 'returns validation, conflict, permission, or rate-limit errors.' This goes beyond what annotations convey, directly informing the agent of risks and error handling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is multi-sentence but every sentence carries weight: purpose, safety, usage, and parameter guidance. It's front-loaded with the core action and includes relevant caveats. Slightly verbose due to the combined guidance, but no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive tool with no output schema, the description covers safety, permissions, error types, and parameter usage. It doesn't specify the success response format (e.g., 204 No Content), but that's a minor gap given the other rich context. The description is complete enough for an agent to call it safely and correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers all 4 parameters at 100% coverage, so the schema already documents each field. The description adds a general note to 'provide the numeric ID or complete URL-encoded path described by the schema' and 'use required identifiers and pagination fields exactly as documented,' which is helpful but doesn't elaborate beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear verb+resource ('Delete a draft note') and explicitly contrasts it with get/list tools for inspection. It distinguishes from siblings like update_draft_note and publish_draft_note without needing to name them, making the purpose unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance: 'Use this only after verifying the target' and 'choose a get or list tool first when you need to inspect state without changing it.' It also mentions prerequisites (project/group permission) and the irreversible nature, covering both when-to-use and when-not-to-use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_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 |
|---|---|---|---|
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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?
Beyond the annotations, the description specifies permanent data removal, the need for delete permission, and the categories of errors that may be returned (missing-resource, permission, policy). This is exactly the kind of behavioral context that annotations alone do not convey, and it does not contradict the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no filler. The first sentence states the action and the key qualifier; the second provides usage routing and behavioral warnings. Every clause earns its place and the most critical scoping information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive operation with full schema coverage and the key annotation already present, the description covers purpose, when to use, permanence, permission requirement, and possible errors. It does not detail the exact shape of the deletion result, but with no output schema that is not strictly required. Slightly more could be said about the result payload, hence 4 rather than 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the parameters and their descriptions already carry the full semantic load. The tool description adds no extra parameter-specific explanation, so a baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with the specific verb-resource pair 'Delete an issue,' and goes further to contrast with `update_issue`, making the tool's scope unmistakable. This clearly distinguishes it from the many issue-related siblings such as `get_issue`, `create_issue`, and `update_issue`.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: only after confirming the issue and intended permanent removal. It explicitly names the alternative, `update_issue`, for closing or editing without deletion. This leaves no room for an agent to guess when this tool is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_issue_emoji_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 | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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 meaningful behavioral context beyond the destructiveHint annotation: it clarifies the operation may be irreversible, requires the necessary project or group permission, and returns validation, conflict, permission, or rate-limit errors. This is consistent with the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is organized and front-loaded with the purpose, followed by usage guidance and behavior. The final sentence is somewhat boilerplate and repeats schema wording, but the description remains appropriately sized and readable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple delete operation, it covers purpose, when to use, side effects, permission requirements, and error classes. It does not describe the success return value, but the absence of an output schema makes that a minor gap rather than a serious omission.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all parameters. The description mostly echoes the schema's project_id guidance and adds a general 'pagination fields' clause that is not actually schema-specific, adding little extra meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence states a specific verb and resource: 'Remove an emoji reaction from an issue.' It is clearly distinguished from MR reaction tools, though it does not explicitly call out the closely related note-reaction sibling, so a fully explicit sibling differentiation is missing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear usage condition: 'Use this only after verifying the target' and directs agents to get/list tools when inspection is needed. This is helpful but does not name the specific sibling (e.g., list_issue_emoji_reactions) that would provide the needed award_id.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_issue_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 |
|---|---|---|---|
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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?
While annotations declare destructiveHint and openWorldHint, the description goes further by stating the operation changes issue relationships, requires issue-edit permission, and returns an error when the link is missing or access is denied. These details add meaningful 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, front-loaded with the action, then the verification recommendation, then permission and error behavior. Every sentence carries relevant information and there is no 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?
For a delete operation with no output schema, the description covers the mutation, permission requirement, and error conditions. It also tells the agent how to verify the link exists before deleting. It does not detail the exact response shape, but the 'returns the result or an error' statement is sufficient for an agent to invoke and interpret the 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 parameters are already documented by the schema. The description adds the useful framing that an issue link is a relationship between two issues, but it does not explain individual parameter formats or the link ID lookup beyond naming list_issue_links/get_issue_link. This matches the baseline for full 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?
The description states a precise verb and resource: 'Delete an issue link' and clarifies it removes 'an existing relationship between two issues.' It distinguishes the tool from siblings like list_issue_links and get_issue_link by explicitly naming them as verification steps, and the destructive intent is clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: remove an existing relationship between two issues. It also directs the agent to list_issue_links or get_issue_link to verify the link first, providing a concrete workflow. It does not explicitly contrast with create_issue_link, but the 'remove existing relationship' phrasing makes the usage boundary clear enough.
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 | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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?
Annotations already mark destructiveHint, but the description adds irreversibility, permission requirements, and specific error types (validation, conflict, permission, rate-limit), going well beyond the structured data. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action, then provides conditions and warnings in a logical order. It is appropriately sized without redundancy, though slightly longer than strictly necessary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers purpose, usage guidance, destructive nature, permissions, errors, and parameter guidance. Lacks return-value details, but that is acceptable for a delete operation without an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema provides full descriptions for all 6 parameters (100% coverage). The description adds a minor clarification about project_id/group_id formats and pagination, but does not add significant new semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the specific action: removing an emoji reaction from an issue note, and clarifies the discussion_id case. It clearly distinguishes from sibling tools that target merge request notes or issue-level emoji.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance to verify the target first and use get/list tools for inspection before mutation. Also explains when to pass discussion_id. However, it does not name specific alternative tools for note-level vs issue-level emoji removal, leaving some inference to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_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 |
|---|---|---|---|
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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 mark destructiveHint=true and openWorldHint=true, but the description adds meaningful behavioral context: it changes or removes remote GitLab data, may be irreversible, requires permissions, and may return validation, conflict, permission, or rate-limit errors. This is valuable beyond the annotations and does not contradict them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first sentence is strong and front-loaded, and the safety and error information is useful. However, the final sentence contains redundant boilerplate ('described by the schema', 'exactly as documented') and references pagination fields irrelevant to this tool, making the definition less tight than it should be for a simple delete operation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The definition covers purpose, when to use it, destructive scope, irreversibility, permissions, and likely error types. The main gaps are the absence of a success return description (no output schema is present) and the misleading mention of group_id/pagination, which slightly undermines completeness for such a simple tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description mostly restates the schema's project_id guidance ('numeric ID or complete URL-encoded path'), and it mentions group_id and pagination fields that do not exist in this tool's schema, adding confusion rather than concrete parameter value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence uses a specific verb and resource: 'Delete a label from a project.' It clearly distinguishes this from read-only siblings and from update_label/create_label by naming the destructive action and stating it operates on a project label.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly instructs when to avoid using the tool ('only after verifying the target') and directs the agent to get or list tools when inspection is needed. It also frames destructive usage with permission requirements, giving the agent a clear decision boundary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_merge_request_discussion_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 | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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?
Beyond the destructiveHint annotation, the description states that the operation 'changes or removes remote GitLab data and may be irreversible,' requiring permissions and returning specific error classes. This adds meaningful context about side effects and failure modes that annotations alone do not convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded, with the purpose in the first sentence and usage guidance in the second. The final sentence contains some generic boilerplate about 'pagination fields' that is not fully relevant to the schema, slightly reducing efficiency.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the destructive nature and the absence of an output schema, the description covers purpose, usage verification, permissions, irreversibility, and error types. It does not describe success return values, but for a delete operation this is a minor omission amid strong contextual coverage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all parameters. The description adds guidance on project_id format but mentions group_id and pagination fields that do not appear in the schema, introducing a slight mismatch. Overall, the description contributes little beyond the schema's existing parameter documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Delete a discussion note on a merge request,' stating a specific verb and resource. This clearly distinguishes the operation from sibling tools like delete_merge_request_note or update_merge_request_discussion_note by narrowing to the discussion-note context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly instructs to verify the target first and to choose a get or list tool when inspection is needed without changing state. It also names the permission requirement and outlines the error types, giving clear when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_merge_request_emoji_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 | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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 destructiveHint=true and openWorldHint=true, and the description reinforces that it changes or removes remote GitLab data and may be irreversible. It adds context about permission requirements and possible error responses (validation, conflict, permission, rate-limit), which goes beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is reasonably concise and front-loaded with the core action, then adds usage guidance and parameter notes. It is slightly dense but every sentence adds value; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive mutation tool with no output schema, the description covers the key context: when to use it, safety caveats, permissions, error types, and identifier handling. It does not detail the return value, but that is less critical for a delete operation and the annotations cover the destructive nature.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all parameters. The description adds guidance on providing numeric IDs or URL-encoded paths and using required identifiers exactly as documented, but it does not add significant new meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Remove an emoji reaction from a merge request') with a specific verb and resource, and it is distinguishable from sibling tools like create_merge_request_emoji_reaction and delete_merge_request_note_emoji_reaction. The target resource (merge request emoji reaction) is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly instructs to verify the target first and suggests using a get or list tool when inspection is needed without changing state. It also notes the required permissions and error types, giving clear context for when to use this tool versus alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_merge_request_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 | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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 this as destructive, and the description adds useful details: it changes or removes remote GitLab data, may be irreversible, requires permissions, and may return validation/conflict/permission/rate-limit errors. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is appropriately sized and front-loaded with the core action, followed by relevant safety and permission guidance. Each sentence adds value, though the project_id/group_id sentence is slightly more verbose than necessary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive tool with four well-documented parameters and no output schema, this description covers the essential operational context: safety, reversibility, permissions, error behavior, and identifier format. A response-format note would be a minor addition but is not required.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema carries the parameter documentation burden. The description adds minor guidance about project_id/URL-encoded paths and required identifiers, but mostly repeats or references schema content rather than enriching parameter meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Delete an existing merge request note.' It is clearly distinct from create/update note tools, though it does not explicitly name or differentiate itself from the closely related delete_merge_request_discussion_note sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives concrete usage context: verify the target first, and use a get/list tool instead when inspection is needed without mutation. It does not explicitly enumerate all alternative delete/update tools, but the condition for choosing a read-only tool is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_merge_request_note_emoji_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 | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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 include destructiveHint=true and openWorldHint=true. The description adds context beyond these: it states the operation 'changes or removes remote GitLab data and may be irreversible,' mentions required permissions, and enumerates possible error types (validation, conflict, permission, rate-limit). This is valuable behavioral information that goes beyond the annotation flags and helps the agent understand consequences and error handling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is reasonably concise and front-loaded with the core action, followed by usage guidance, risks, and parameter notes. Each sentence adds value, though it is slightly verbose. The structure is logical: action, special case, when-to-use, risk/permission, and parameter format. It is not as tight as the best examples but is not bloated either.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the essential aspects for a destructive tool: what it does, when to use it, risks, permissions, and error handling. It does not explicitly describe the success response, but that is often not critical for a delete operation, and the annotations cover safety. The mention of pagination fields is slightly ambiguous for a delete tool, but overall the description is adequate given the schema richness and annotation context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents each parameter. The description does not add significant meaning beyond the schema. It repeats the discussion_id guidance ('Pass discussion_id for discussion thread replies') which the schema already states, and it mentions URL-encoded paths for project_id which is already in the schema. No new parameter semantics are provided beyond what the structured schema offers.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action: 'Remove an emoji reaction from a merge request note.' It uses a specific verb and resource, and distinguishes from sibling tools like delete_merge_request_emoji_reaction by scoping to notes and mentioning discussion_id for thread replies. An agent can immediately understand what this tool does and how it differs from similar delete operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage guidance: 'Use this only after verifying the target; choose a get or list tool first when you need to inspect state without changing it.' This tells the agent when to avoid this tool and what alternative category to use. It also explains when to pass discussion_id. However, it does not name specific sibling tools (e.g., list_merge_request_note_emoji_reactions) as alternatives, which would be more actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
discover_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. | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint and openWorldHint, but the description adds critical context: it only changes the session's tool registry, returns an active-tool summary, and does not modify GitLab data. This goes beyond the annotations and fully discloses side effects, so the agent can safely invoke it without concern for persistence.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and includes a necessary list of categories. While the category list is long, it is directly relevant for the agent to know valid values. The phrasing is efficient, with no fluff, though it could be slightly tightened by moving the category list to the end.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a meta-tool with no output schema, the description explains the return (active-tool summary), the session-scoped mutation, and the two-phase usage pattern. All information needed to decide and call the tool correctly is present, including the exact categories and the no-data-change guarantee.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters are well-documented. The description adds value by enumerating all valid category names and explaining the omission behavior for `category`, which is not in the schema. It also clarifies the optional JMESPath filtering role implicitly by context, though the schema already covers it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool discovers and activates tool categories, lists the exact available categories, and explains its meta-purpose of managing the session's tool registry. It distinguishes itself from sibling tools by being the only one that modifies the available toolset, not operating on GitLab data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use: when a needed opt-in category is not exposed, and gives a two-step workflow: omit `category` to inspect, then call with a category to activate. It also clarifies session-scoped behavior and that it does not alter GitLab data, leaving no ambiguity about alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
download_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 | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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?
It discloses behavior beyond the readOnlyHint annotation: read-only with respect to GitLab, remote mode returning base64 for images or a download URL, local mode saving to a path, and possible attachment/permission errors. This gives the agent a clear model of side effects and output. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly written sentences front-load the core purpose and key mode hint, then add behavioral and error context. No redundant filler; every clause contributes useful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter tool with no output schema, the description covers return format, modes, save behavior, read-only guarantee, and error cases. The main minor gap is that the mapping from 'remote mode' vs 'local mode' to specific parameters is implicit rather than explicit, though local_path makes this reasonably clear.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already explains all parameters. The description adds value by clarifying local_path's role and the mode-based behavior, but it does not add meaningful detail about secret, filename, project_id, or jmespath beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Download an uploaded file from a project' and 'retrieve a previously uploaded project attachment'. It clearly identifies the tool's function and differentiates it from file/content-related siblings like get_file_contents or push_files.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use it ('Use this to retrieve a previously uploaded project attachment'), describes the two modes, and notes the access prerequisite ('requires project access'). It does not name exclusions or alternatives, but there is no obvious sibling for attachment retrieval, so the guidance is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fork_repositoryA
Fork a project to your account or specified namespace. Use this to create a copy of an existing project in the current user's namespace or a permitted namespace; use search_repositories or get_project to inspect projects without copying them. The operation creates a new project, requires fork permission, and returns the forked project or a namespace/permission error.
| Name | Required | Description | Default |
|---|---|---|---|
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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?
Annotations only include `openWorldHint`, so the description carries most behavioral disclosure. It discloses the side effect (creates a new project), a permission prerequisite (fork permission), and the possible return/error outcomes (forked project or namespace/permission error). It does not explicitly say the original project is untouched, but 'copy' implies this and the key behavioral facts are present.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, no filler; the core action and destination are front-loaded, followed by alternatives and behavioral notes. Every sentence contributes useful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with only one required parameter and no output schema, the description covers the operation, destination, permission requirement, and likely error cases. It could add more on idempotency or output details, but it is sufficient for correct invocation in most cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds semantic value by clarifying that `namespace` defaults to the current user's namespace and must be permitted, and that `project_id` refers to an existing project to be copied. This goes beyond the raw schema entries.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('fork a project'), the resource ('existing project'), and the destination ('your account or specified namespace'). It also names the siblings it is not (`search_repositories`, `get_project`) for inspection without copying, so an agent can disambiguate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit when-to-use ('Use this to create a copy...') and names alternative tools for inspection (`search_repositories` or `get_project`). This directly tells an agent how to choose this tool over related siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_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 |
|---|---|---|---|
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| project_id | Yes | Project ID or complete URL-encoded path to project | |
| branch_name | Yes | Name of the branch |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, and the description reinforces this with 'read-only and does not mutate GitLab data'. It adds useful behavioral context beyond annotations by listing error conditions: 'missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors.'
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the purpose and usage guidance, and each sentence contributes. The final sentence is somewhat generic boilerplate about identifiers and pagination that could be trimmed, but overall it is concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers when to use, safety, errors, and identifier format. With no output schema, it gives a hint of return content ('commit, protection status') but doesn't enumerate all fields. Still, for a simple get-one-resource tool, this is sufficiently complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%; the description adds no new meaning for branch_name or jmespath. It repeats the project_id format ('numeric ID or complete URL-encoded path') that the schema already documents, so it stays at the baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Get branch details (commit, protection status)'. It also distinguishes from discovery tools by stating this is for a known resource or result, making it clear which sibling tools (list_branches, search) are alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use the tool versus alternatives: 'Use this for a known resource or result; choose the corresponding list or search tool when you need to discover multiple resources.' This removes ambiguity and routes the agent to the appropriate sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_branch_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 | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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 mark readOnlyHint=true, but the description adds concrete detail: 'It is read-only and does not mutate GitLab data' and enumerates error conditions like missing resources, invalid identifiers, insufficient permission, and rate limits. This goes beyond the annotations and gives the agent actionable expectations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the core purpose, then adds usage guidance, safety, and parameter notes in a logical order. Every sentence contributes useful information, though the final sentence about path encoding and pagination is slightly generic and could be trimmed without losing much.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple read-only nature, the annotations, and the fully documented schema, the description covers the main use case, alternatives, error behavior, and parameter handling. It doesn't describe the output format, but no output schema exists and the diff structure is likely evident from the tool name. Overall it is sufficient for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already explains each parameter. The description adds value by specifying that project_id should be a numeric ID or complete URL-encoded path and by reminding the agent to use required identifiers and pagination fields exactly as documented. It doesn't deeply elaborate each parameter, but it supplements the schema meaningfully.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Get diffs between two branches or commits.' It also distinguishes itself from discovery tools by stating it is for a known resource or result, which separates it from siblings like list_merge_request_diffs and list_commits.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use the tool ('for a known resource or result') and when not to ('choose the corresponding list or search tool when you need to discover multiple resources'). This gives clear routing guidance without needing to infer context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ci_catalog_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. | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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=true, so the read-only claim is redundant, but the description adds valuable behavioral context: missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. This goes beyond the annotations and is useful for an agent deciding whether to call the tool or handle failures.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first two sentences are concise and high-value, but the final sentence is generic boilerplate that references nonexistent parameters and does not earn its place. The description would be stronger if it ended after the error-handling sentence or corrected the parameter guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only single-resource retrieval tool with 100% schema coverage, the description is largely complete: it explains scope, alternatives, error behavior, and safety. The main gap is the stale parameter note, which slightly undermines the otherwise solid context. An output schema is absent, but the description at least names the returned content (versions and components).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds misleading guidance: it references `project_id` or `group_id`, which do not exist in the schema (the schema uses `id` and `full_path`). The instruction to 'use required identifiers and pagination fields' is also vague and not backed by the schema, which has no required parameters. The description does not clarify the actual id/full_path trade-off beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Get details for a GitLab CI/CD Catalog resource, including versions and components.' It also explicitly distinguishes itself from list/search discovery tools by saying to use those when discovering multiple resources. This clearly differentiates it from the sibling list_ci_catalog_resources.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use guidance: 'Use this for a known resource or result; choose the corresponding list or search tool when you need to discover multiple resources.' This names the condition and points to an alternative, leaving little inference for the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_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 | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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, and the description reinforces non-mutating behavior while adding useful error conditions: missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. This goes beyond the annotation baseline without contradicting it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first sentence is concise and front-loaded, and the second provides useful routing. However, the final sentence includes generic boilerplate about group_id and pagination fields that do not apply to this tool's schema, adding noise. The description is adequate but not tightly scoped to this specific tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only lookup with no output schema, the description covers the core need: what it does, when to use it, important error behaviors, and identifier requirements. The only minor gap is lack of any hint about the return value shape, but this is not necessary for such a straightforward get-by-id tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents each parameter. The description adds only a slight reinforcement of the project_id identifier format and a generic instruction to use identifiers/pagination as documented. It does not meaningfully explain sha, stats, or jmespath beyond what the schema provides, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description begins with a precise verb and object: 'Get details of a specific commit.' It also explicitly scopes the tool to known resources/individual results and contrasts it with list or search tools for discovery, clearly distinguishing it from siblings like list_commits.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use the tool ('for a known resource or result') and when not to ('choose the corresponding list or search tool when you need to discover multiple resources'). It also provides concrete guidance on identifier formats, which helps the agent choose and populate the correct call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_commit_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 | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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?
Annotations already declare readOnlyHint=true, but the description adds non-redundant behavioral details: missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. This clarifies the error contract beyond what annotations provide. It does not describe return formatting, but that is covered by schema fields like full_diff.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a few sentences long but each sentence earns its place: purpose, usage delineation, read-only/error note, parameter guidance. It is front-loaded with the primary action and then adds necessary context. Slightly verbose but not bloated; it avoids redundancy with annotations by noting error behavior instead of repeating read-only (though it does repeat read-only). Overall, well-structured and efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a specific-commit diff tool with no output schema, the description covers purpose, usage boundaries, error behavior, and parameter guidance. It lacks explicit mention of the response format, but the full_diff parameter implies pagination and the diff itself is a standard git structure. Given the schema covers all parameters and annotations cover safety, this description is sufficiently complete for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds extra guidance on parameter usage: 'provide the numeric ID or complete URL-encoded path described by the schema' and 'use required identifiers and pagination fields exactly as documented'. This goes beyond the schema's basic field descriptions, clarifying the expected format and constraint that parameters must be used exactly as documented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States specific verb 'Get changes/diffs' and resource 'a specific commit'. Clearly differentiates from list/search tools by explicitly saying 'Use this for a known resource or result' and directing to 'the corresponding list or search tool' for discovery. Distinguishes from siblings like get_commit or list_merge_request_diffs without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use (known resource) and when-not-to (discover multiple resources) guidance, and mentions error conditions. Does not name specific sibling tools but the 'corresponding list or search tool' is contextually clear. Overall, strong usage direction with only minor lack of exact sibling names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_draft_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 |
|---|---|---|---|
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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 mark readOnlyHint=true and openWorldHint=true. The description adds useful behavioral context beyond that: it is read-only, does not mutate GitLab data, and documents that missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and usage guidance are front-loaded, and the description is compact. The third sentence is somewhat generic and contains a slight mismatch (group_id/pagination), which keeps it from being perfectly concise, but the overall structure is clear and efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-resource read operation with three required identifiers, the description covers purpose, selection guidance, read-only safety, error behavior, and identifier formatting. It does not describe the return value, but the tool name and schema make this reasonably inferable, and no output schema exists to elaborate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all parameters. The description adds guidance about supplying numeric IDs or URL-encoded paths and using identifiers as documented, but it also includes a generic "group_id or pagination" reference that does not match this tool's actual schema, so it cannot earn higher credit.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: "Get a single draft note from a merge request." It also distinguishes itself from list/search tools by scoping use to "a known resource or result," so an agent can tell it apart from sibling tools like list_draft_notes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs when to use this tool versus alternatives: use it for a known resource or result, and choose the corresponding list or search tool when discovering multiple resources. This is direct when-to-use guidance with a clear exclusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_file_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) | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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 declare readOnlyHint=true, so the description does not need to repeat safety semantics. It adds behavior beyond the annotations by explaining the entry structure: contiguous source-line ranges map to the commit with id, author, authored_date, and message. It does not cover pagination or edge cases, but the read-only hint plus output-shape context is meaningful.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two well-structured sentences. The first front-loads the action and resource; the second communicates the return shape and the optional range limitation. Every phrase contributes information, and there is no filler or duplication of schema text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given there is no output schema, the description supplies the essential return semantics by naming the fields a caller can expect in each entry. The schema covers all parameters, and the read-only annotation covers the safety profile. Missing details such as pagination or behavior on nonexistent refs are minor for a straightforward blame call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema itself documents all six parameters including range_start, range_end, ref, and file_path. The description adds only a light hint that range_start/range_end limit the blame to specific lines, which is useful but does not materially go beyond the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Get git blame for a file at a given ref.' This clearly separates it from read-content tools like get_file_contents and commit-history tools like get_commit-repository. It also states the central output concept (line ranges mapped to commits), removing ambiguity about what GitLab blame returns.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear operational context: run blame at a specific ref dat and optionally constrain the result to a range of lines with range_start/range_end. It does not explicitly name sibling alternatives or say when not to use this tool, but 'git blame' is a distinct enough operation that the usage context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_file_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 | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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?
Annotations already declare readOnlyHint=true, and the description reinforces this while adding useful behavior: missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. This is valuable context beyond the structured annotations, though it partially duplicates the read-only hint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with the core purpose and usage guidance front-loaded. The description is efficient, but some boilerplate like 'exactly as documented' and the duplication of the readOnlyHint annotation keep it just short of perfect conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only fetch tool with no required parameters and no output schema, the description covers selection criteria, error behavior, and identifier formatting. It leaves the exact shape of file versus directory output somewhat implicit, but the name and first sentence convey the core return type adequately.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all parameters and the baseline is 3. The description adds little beyond that, mostly reiterating identifier-format guidance already present in the schema and mentioning group_id even though it is not a schema parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action ('Get contents of a file or directory') with a clear resource scope ('from a GitLab project'). It also distinguishes itself from list/search siblings by positioning itself as the tool for a known resource or result rather than discovery.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs to use this tool for a known resource/result and to choose the corresponding list or search tool when discovering multiple resources. This gives a usable decision rule for tool selection without leaving the agent to infer when this tool applies.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_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 |
|---|---|---|---|
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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, the description discloses that the operation requires issue read permission, that it returns a slim milestone by default unless full_response=true, and that it returns an error for invalid identifiers, missing issues, or denied access. These are concrete behavioral details that help an agent predict outcomes without calling the tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences with no filler. The core purpose is front-loaded, the alternative tools are mentioned exactly once, and every sentence contributes either scoping, usage guidance, or behavioral context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-parameter read-only tool with no output schema, the description covers what the tool does, when to use it, what the default response looks like, how to get a fuller response, permissions, and error conditions. Nothing essential for correct invocation is missing; remaining details live in the fully-covered parameter schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema itself thoroughly documents full_response (including the slim milestone fields) and jmespath. The description restates the full_response behavior but does not materially add to what the schema already provides, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Get details of a specific issue.' It immediately differentiates from siblings by framing the scope as a single issue and later explicitly names `list_issues` and `my_issues` as discovery alternatives. This leaves no ambiguity about what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit routing guidance: use this tool to inspect one issue's fields, and use `list_issues` or `my_issues` to discover issues first. This tells the agent exactly when to invoke this tool versus the alternative list tools, covering the primary decision point.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_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 |
|---|---|---|---|
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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 declare readOnlyHint and openWorldHint, and the description reinforces safe read-only behavior. It adds useful behavioral context by listing the error conditions: missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, with the purpose front-loaded and no filler. Minor deductions for repeating the read-only fact already present in annotations and for the slightly generic closing sentence about group_id and pagination fields.
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 single-resource GET with a fully documented schema and safety annotations, the description covers selection rationale, read-only behavior, and error handling. Nothing material is missing for an agent to invoke this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already explains each parameter. The description adds value by telling the agent to provide the numeric ID or complete URL-encoded path and to follow the documented identifiers exactly. The conditional mention of group_id and pagination fields is slightly generic because neither appears 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?
The description opens with a specific verb and resource ('Get a specific issue link'), which is distinct from the sibling list/create/delete issue-link tools. The phrase 'specific' plus the contrast with list/search makes the targeted single-resource operation unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says to use the tool for a known resource or result and to choose the corresponding list or search tool when multiple resources must be discovered. This clear when/when-not guidance prevents an agent from selecting it for discovery tasks.
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 |
|---|---|---|---|
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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?
Annotations already provide readOnlyHint=true and openWorldHint=true. The description adds that missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors, which is useful behavioral context. It doesn't describe response format or other side-effects, but for a read-only tool with annotations, this is acceptable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a few sentences long and front-loads the primary purpose. It includes necessary clarifications without being verbose. The additional guidance on identifiers and pagination fields is a bit generic but not overly long. Good structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool is a simple get-by-id operation with 4 parameters (all documented in schema) and read-only annotations, the description covers the core usage. It doesn't explain return structure, but no output schema exists. The error behavior is mentioned. It could be more specific about the 'include_ancestor_groups' parameter behavior, but that is in the schema. Overall adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so each parameter is documented in the schema. The description adds a note about providing numeric ID or URL-encoded path for project_id/group_id, which adds value. However, this is only a minor addition; most parameter meaning comes from the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it gets a single label from a project, a specific verb and resource. It distinguishes itself from list/search tools by explicitly mentioning known resource vs discovery. However, it doesn't name a specific sibling like list_labels, so it's not fully differentiating.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear direction: use this for a known resource or result, and choose the corresponding list or search tool for discovery. This is a clear when-to-use statement. It doesn't explicitly exclude alternatives by name, but the guidance is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_merge_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 |
|---|---|---|---|
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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 provide readOnlyHint=true, so the statement 'does not mutate GitLab data' is redundant. However, the description adds valuable behavioral details about error conditions (missing resources, invalid identifiers, insufficient permission, rate limits) and notes that include_summaries triggers extra API calls and a larger response. These go beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose but includes extraneous details like the 'When project_id or group_id is accepted' sentence, which is not applicable to this tool since only project_id exists. It is somewhat rambling and could be trimmed, but the core information is present.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers read-only behavior, error handling, and include_summaries effects, but the parameter inaccuracies (branchName vs source_branch, group_id) create gaps and potential confusion. Without an output schema, the description could also mention the general return shape, but overall it is adequate for a single-resource get tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description introduces inaccuracies: it says 'mergeRequestIid or branchName required' while the schema has merge_request_iid and source_branch, and neither is required (only project_id is). It also references 'group_id' which is not in this tool's schema. This misleads the agent about parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool fetches details of a single merge request and distinguishes it from list/search tools by saying 'Use this for a known resource or result; choose the corresponding list or search tool when you need to discover multiple resources.' The verb and resource are specific, and the mention of include_summaries adds functional clarity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells when to use this tool (known resource/result) versus list/search alternatives. It also clarifies when include_summaries is beneficial, and notes that identifiers must be provided exactly as documented. This is strong, actionable guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_merge_request_approval_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 |
|---|---|---|---|
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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 provide readOnlyHint=true, and the description reinforces this by saying 'It is read-only.' It adds useful behavioral detail by listing error conditions: missing requests, unsupported GitLab versions, and permission failures are reported as errors. It does not describe the full shape of the approval-state response, but the error disclosure is meaningful beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no filler. It front-loads the core purpose, then provides usage guidance, safety confirmation, and error behavior in a compact, well-ordered way. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only retrieval tool with rich annotations and complete schema coverage, the description covers purpose, usage, safety, and error conditions. The only minor gap is that it does not describe the specific fields contained in the 'approval-state response,' which would be more important if no output schema existed. Still, the essential context for correct selection and invocation is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all three parameters. The description adds no additional parameter-specific meaning, such as how project_id is resolved or how jmespath interacts with the result. Baseline 3 is appropriate because the schema carries the parameter documentation burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb-resource relationship: 'Get merge request approval details including approvers.' It also names the inspection purpose ('inspect approval rules and approvers before deciding whether a merge request can be merged'), which distinguishes it from sibling tools like approve_merge_request and unapprove_merge_request.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells the agent when to use this tool ('before deciding whether a merge request can be merged') and points to the alternative for changing state ('use `approve_merge_request` to change approval state'). This is direct, actionable guidance with no ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_merge_request_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 |
|---|---|---|---|
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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 annotations already declare readOnlyHint=true, and the description reinforces this while adding useful behavior: it reports conflicts without resolving them, requires access to the project and merge request, and returns GitLab conflict data or an error when evaluation fails. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three front-loaded sentences each carry distinct information: what the tool does, when to use it, and what to expect. There is no filler or restatement of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only conflict inspection tool, the description covers purpose, usage timing, access requirements, read-only behavior, and error outcomes. The schema covers parameters, so nothing essential is missing for an agent to invoke this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all parameters including the optional jmespath filter are already documented in the schema. The description does not add parameter-level detail, which is acceptable given the schema's full coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Get the conflicts of a merge request.' It clearly distinguishes the tool from the sibling merge_merge_request by explicitly noting it reports conflicts and does not resolve them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a concrete trigger ('before attempting merge_merge_request') and clarifies that the tool is for inspection only. This tells an agent when to use it and implicitly when not to use the merge tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_merge_request_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 | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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 declare readOnlyHint=true, and the description reinforces read-only behavior. It also adds useful behavioral context by listing error cases such as missing resources, invalid identifiers, insufficient permissions, and rate limits, which goes beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the core purpose and usage. The final sentence is somewhat generic, but overall the structure is efficient and readable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers read-only behavior, error cases, and high-level selection guidance, which is reasonably complete given the annotations. However, the parameter inconsistencies and lack of information about the diff output shape leave some gaps for an agent invoking this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, but the description introduces confusion: it says 'mergeRequestIid or branchName required' while the schema uses merge_request_iid and source_branch and only marks project_id as required. It also mentions group_id, which does not appear in the schema, and references pagination fields that are not present in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves changes/diffs of a merge request and frames it for a known resource rather than discovery. It distinguishes from list/search siblings by saying to use those when discovering multiple resources, though it doesn't name them explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives direct usage guidance: use this for a known resource/result combo and use list/search tools for discovery. It lacks explicit named alternatives or negative conditions, but the provided context is still actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_merge_request_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 |
|---|---|---|---|
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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 readOnlyHint annotation already covers safety, and the description reinforces it with 'It is read-only.' It also adds behavioral context beyond annotations by describing the outcome: returns the discussion item or an error for invalid identifier, missing discussion, or insufficient permission.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the core purpose, then adds targeted usage and behavior information. Every sentence earns its place with no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-discussion read tool with three required identifiers and a fully documented schema, the description covers selection, alternatives, return behavior, and error conditions. Nothing essential for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all four parameters. The description adds little beyond restating that a discussion is fetched by identifier, so it provides no meaningful extra parameter meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Get a single discussion item for a merge request.' It also explicitly distinguishes itself from siblings by naming `mr_discussions` for collections and `get_merge_request_note` for flat notes, so an agent can clearly tell this tool apart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: fetch one known discussion by discussion identifier. It names the exact alternatives for collection and flat note use cases, leaving no ambiguity about which sibling tool to choose.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_merge_request_file_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. | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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?
Annotations already declare readOnlyHint=true and openWorldHint=true. The description adds value by detailing error behavior: 'missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors.' This goes beyond the annotations and helps the agent anticipate failure modes. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is relatively compact with the purpose front-loaded. However, it includes generic boilerplate about group_id and pagination fields that are not in the schema, and the parenthetical about required parameters is redundant and potentially misleading. This reduces efficiency and clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The schema and annotations cover much of the necessary context, and the description adds usage and error information. However, the misleading statement about required parameters undermines completeness; an agent might try to supply merge_request_iid or source_branch instead of the actually required project_id and file_paths. This is a significant gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline would be 3. However, the description actively misleads by stating 'mergeRequestIid or branchName required' while the schema requires project_id and file_paths. It also references 'group_id' and 'pagination fields' which do not exist in this schema. This introduces confusion rather than adding semantic value, so a 2 is warranted.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Get diffs for specific files from a merge request', identifying the exact verb, resource, and scope. It distinguishes itself from siblings by explicitly noting to use list/search tools when discovering multiple resources, making its purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance: 'Use this for a known resource or result; choose the corresponding list or search tool when you need to discover multiple resources.' This clearly indicates when to use this tool versus alternatives. It also instructs to use required identifiers exactly as documented. However, it does not name specific sibling tools like get_merge_request_diffs, so it lacks some specificity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_merge_request_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 | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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 useful behavior beyond the annotation: it returns the note object or an error for invalid identifier, missing note, or insufficient permission. This helps set expectations without contradicting the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. The primary action is front-loaded, and the usage guidance and behavioral expectations are packed efficiently into the second sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-object read tool with no output schema, the description is complete: it states the resource, the lookup key, the read-only nature, the return value, likely error conditions, and relevant alternatives. No additional context is needed for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the parameters are already documented in the input schema. The description adds little beyond identifying note_id as the identifier to use, but it does not provide additional semantics or format details beyond what the schema already contains.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Get a specific note for a merge request.' It clearly differentiates this tool from get_merge_request_notes and mr_discussions by scope (single known note vs collection vs threaded context).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use this tool ('fetch one known merge request note by note identifier') and directly names the alternatives ('use get_merge_request_notes for a collection and mr_discussions for threaded context'). This gives an agent clear routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_merge_request_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 | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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 declare readOnlyHint=true, and the description reinforces this with 'It is read-only.' It adds useful behavioral context beyond annotations by specifying that the tool returns note records and that GitLab reports invalid identifiers, missing resources, pagination, and permission errors. This helps set error-handling expectations, though it does not detail response shapes or pagination behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no filler. The core action is front-loaded, the sibling distinction follows immediately, and the behavioral/error note is concise. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is complete for tool selection and invocation: it states behavior, scope, the key sibling alternative, and error reporting. With no output schema, saying it 'returns note records' is a minimal but sufficient return-value hint. It could mention that results are flat and how pagination manifests, but this is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the parameters are already documented in the schema. The description adds no parameter-specific meaning (e.g., how `sort` or `order_by` interact, or what `jmespath` filters). Baseline 3 is appropriate because the schema carries the full parameter-semantics burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('List notes for a merge request') and immediately differentiates from the sibling tool `mr_discussions` by characterizing itself as returning flat notes. This makes the tool's scope unmistakable and distinct from discussion-thread operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use this tool vs. an alternative: 'use mr_discussions when thread structure and resolution state are required.' This gives the agent a clear decision rule and excludes the overlapping sibling, leaving no ambiguity about selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_merge_request_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. | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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, and the description reinforces this by stating it does not mutate GitLab data. It also adds useful error-behavior context for missing resources, invalid identifiers, insufficient permissions, and rate limits, which goes beyond the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded with purpose, which is good. However, the final sentence contains generic boilerplate about group_id and pagination fields that are not present in this schema, reducing precision and making the description slightly less disciplined than it could be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-resource read-only getter, the description covers purpose, usage boundaries, safety, and error behavior. It does not describe the response contents, but given the simple resource model and the absence of an output schema, the description is still sufficient for an agent to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the parameters are already documented in the schema. The description adds little beyond restating the path-encoding rule for project_id and includes boilerplate mentions of group_id and pagination fields that do not actually apply to this tool's schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with a specific verb and resource: 'Get a specific version of a merge request.' It also clarifies the intended scope by contrasting with list/search tools for discovery, which helps distinguish this tool from siblings like list_merge_request_versions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says to use this tool for a known resource/result and directs the agent to a list/search tool when discovery is needed. It gives clear when-to-use guidance, though it does not name the exact sibling tool like list_merge_request_versions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_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 |
|---|---|---|---|
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| namespace_id | Yes | Namespace ID or full 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 while adding concrete failure modes: missing resources, invalid identifiers, insufficient permission, and rate limits returned as errors. This is useful context beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first three sentences are tight and front-loaded, but the final sentence about project_id/group_id and pagination fields is boilerplate that does not apply to this schema. Not every sentence earns its place, so it falls below the higher conciseness bar.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter read-only tool, the description covers known-resource usage, error behavior, and non-mutation clearly. It is mostly complete, but the inapplicable parameter/pagination sentence introduces confusion and prevents a perfect score.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents namespace_id and jmespath, giving a baseline of 3. However, the description's reference to 'project_id or group_id' and 'pagination fields' is misleading because neither exists in this tool's schema, and it does not add accurate parameter-level meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Get'), resource ('namespace'), and addressing mechanism ('by ID or path'), and explicitly differentiates from list/search tools for discovery. The clarification that groups are namespaces with kind='group' adds scope precision.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs to use this tool for a known resource or result and to choose the corresponding list or search tool when discovery of multiple resources is needed. This directly tells an agent when to select this tool over alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_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 |
|---|---|---|---|
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| project_id | Yes | Project ID or URL-encoded path |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true, and the description reinforces this by stating the operation does not mutate GitLab data. It adds useful behavioral context by enumerating error conditions: missing resources, invalid identifiers, insufficient permission, and rate limits. This is meaningful added value beyond the structured annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is appropriately sized and front-loaded with the core purpose. The final sentence about identifiers and pagination fields is somewhat boilerplate and adds limited value, but overall the structure is clear and readable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-resource retrieval tool with read-only annotations, the description covers the core behavior, the intended invocation context, error outcomes, and identifier requirements. Nothing critical is missing for an agent to select and invoke this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both project_id and jmespath. The description mostly restates the project identifier guidance ('numeric ID or complete URL-encoded path') that the schema already provides, offering little additional semantic value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies a specific verb ('Get details') and resource ('a specific project'), and explicitly contrasts itself with list/search tools for discovering multiple resources. This makes it easy to distinguish from siblings like list_projects or search_repositories.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says to use this tool for a known resource or result and to choose a list or search tool when discovering multiple resources. The guidance is clear, though it refers to 'the corresponding list or search tool' generically rather than naming exact sibling alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_project_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 | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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 declare readOnlyHint=true, and the description reinforces this with 'does not mutate GitLab data.' It goes beyond annotations by disclosing error behavior: 'missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors.' This adds useful context that an agent cannot infer from the schema or annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose in the first sentence, then provides usage boundaries and behavioral details. It is dense but efficient; the third sentence packs both error behavior and parameter conventions into one long sentence, but every clause carries meaningful information. Minor structural improvement could split that sentence, but it remains readable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only, single-project listing tool with 100% schema coverage, the description covers purpose, usage boundaries, error behavior, and identifier formatting. There is no output schema, but the description does not describe the shape of returned events; however, 'List events' implies a standard event list and the tool's safety profile is already covered by annotations. The missing return-shape detail is a minor gap rather than a blocker.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already has 100% description coverage for all 9 parameters, so the baseline is 3. The description adds extra value by explaining how to provide project_id or group_id ('numeric ID or complete URL-encoded path described by the schema') and by emphasizing that pagination fields should be used exactly as documented. This goes beyond the schema's individual parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('List events for a project') and immediately disambiguates from discovery tools: 'Use this for a known resource or result; choose the corresponding list or search tool when you need to discover multiple resources.' This clearly distinguishes it from siblings like list_events and list_issues.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly defines when to use this tool ('for a known resource or result') and when not to ('choose the corresponding list or search tool when you need to discover multiple resources'). It also provides concrete guidance on providing identifiers and using pagination fields, leaving no ambiguity about invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_protected_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 |
|---|---|---|---|
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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?
Beyond the annotations (readOnlyHint=true, openWorldHint=true), the description discloses concrete error semantics: missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. This adds genuine behavioral context an agent cannot infer from the annotations alone; nothing contradicts them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core purpose and followed by usage and error guidance. Minor template residue ('When project_id or group_id is accepted' mentions group_id, which is not a parameter here; 'pagination fields' is irrelevant) keeps it from being perfectly lean, but overall it is compact and well ordered.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple 3-parameter read tool with strong annotations and full schema coverage, the description covers purpose, when to use it, error behavior, and identifier formatting. The main gap is the absence of any return-shape guidance given there is no output schema, but the purpose sentence names the key result fields (access levels, force push settings).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description largely restates what the schema already says about project_id (numeric ID or URL-encoded path) rather than adding new meaning; the generic instruction about 'pagination fields' doesn't apply since this tool has no pagination parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Get details of a single protected branch (access levels, force push settings).' It also distinguishes itself from siblings by scoping to a single known resource versus discovery-oriented list/search tools, so an agent can tell it apart from list_protected_branches immediately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ('known resource or result') and when-not-to-use ('need to discover multiple resources') guidance, which is clear and actionable. The alternative is pointed to generically as 'the corresponding list or search tool' rather than named (e.g., list_protected_branches), so it stops just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_repository_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 | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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 provide readOnlyHint and openWorldHint, lowering the bar. The description adds valuable context by confirming no mutation and enumerating error conditions (missing resources, invalid identifiers, insufficient permission, rate limits), which goes beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four sentences, each serving a distinct purpose: action, usage guidance, behavioral transparency, and parameter handling. It is front-loaded with the primary purpose and contains no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 8 parameters, 100% schema coverage, annotations, and no output schema, the description adequately covers purpose, usage, safety, and error behavior. Minor gaps: the unsupported reference to group_id could confuse, and it does not explicitly describe the return structure, but the schema and clear purpose compensate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all parameters; the description only reinforces how to provide project_id/path and pagination. The mention of 'group_id' is extraneous since it is not in this schema, but it does not materially harm parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action and resource: 'List files and directories in a repository.' It also differentiates from discovery-focused siblings by advising to use other list or search tools when discovering multiple resources, making the tool's niche clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says to use this tool for a known resource or result and to choose 'the corresponding list or search tool' when discovery is needed. It also instructs to use required identifiers and pagination fields exactly as documented, giving actionable usage direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_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 | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark readOnlyHint=true, so the read-only claim is redundant, but the description adds useful behavioral context: it does not mutate GitLab data, and missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. This supplements what annotations convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, with the purpose front-loaded and usage guidance following. It is mostly efficient, though the final sentence about pagination fields is slightly boilerplate and does not fully apply to this simple lookup tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple single-resource lookup with one required parameter, the description covers purpose, when to use it, read-only behavior, error cases, and identifier handling. Nothing essential is missing for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds little beyond the schema: the guidance about project_id or group_id paths does not apply to this tool's actual parameters, and jmespath is only described in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Get user details by ID.' It clearly distinguishes itself from list/search tools that discover multiple resources, and the sibling list contains get_users and search-like tools, so an agent can route correctly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to use this tool for a known resource or result and to choose the corresponding list or search tool when discovering multiple resources. This gives the agent actionable selection criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_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 |
|---|---|---|---|
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| usernames | Yes | Array of usernames to search for |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as readOnly and openWorld, so the description's read-only/no-mutation statement is redundant. However, it adds useful behavioral detail by disclosing that missing resources, invalid identifiers, insufficient permissions, and rate limits surface as errors. This goes beyond the annotations and helps an agent anticipate failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and remains reasonably compact. The final sentence about identifiers and pagination is somewhat generic and not fully applicable to this schema, but it does not significantly bloat the text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter read-only tool, the description covers purpose, usage context, error behavior, and read-only status. The lack of an output schema is offset by the clear statement that user details are returned. The irrelevant project_id/pagination guidance is a minor blemish but does not make the description incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers both parameters (usernames and jmespath) at 100%, so the baseline is 3. The description adds little parameter-specific meaning; its mention of project_id/group_id and pagination fields does not match this tool's actual schema and is mostly generic boilerplate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Get GitLab user details by usernames.' It also clarifies the intended scope by saying to use it for a 'known resource or result' rather than for discovery. However, it does not explicitly differentiate itself from the sibling get_user, so it is clear but not fully distinguished.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit direction: use this tool for a known resource or result, and use a 'corresponding list or search tool' when discovery is needed. This provides clear context for when to use the tool, though it does not name specific sibling tools or explain when get_user would be preferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
health_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 |
|---|---|---|---|
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds meaningful behavioral context beyond the readOnlyHint annotation: it does not mutate GitLab state, version lookup failures do not fail the health check, and the returned fields differ based on authentication status. It also specifies the source endpoint and the exact fields reported. This is strong transparency for an agent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose, immediately followed by return-value details, failure behavior, usage guidance, and an explicit alternative. Every sentence carries useful information; there is no filler or vague boilerplate.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple health-check tool with one optional parameter and no output schema, the description explains what is always returned, what is returned only when authenticated, and how failures are handled. It also covers non-mutation and when to use whoami, making the tool complete from an agent's perspective.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents the single jmespath parameter with 100% coverage, so the description does not need to explain it in depth. The description adds no new semantic detail about jmespath itself, but the baseline schema coverage is sufficient. A score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: verifying server status and authentication, plus reporting GitLab version details when authenticated. It clearly distinguishes itself from whoami, noting that whoami is the tool to use when the authenticated user's identity is the goal. The purpose is unambiguous and easy for an agent to act on.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says to use this tool to verify server connectivity and authentication before making GitLab requests, and names whoami as the alternative when user identity is the goal. This gives the agent clear selection criteria and exclusions, which is exactly what usage guidance should provide.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_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 | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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, so the description's read-only claim adds limited value. However, it goes beyond annotations by disclosing that missing resources, invalid identifiers, insufficient permission, and rate limits surface as errors, which helps an agent anticipate failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the first sentence, and the usage guidance follows immediately. The final sentence about 'project_id or group_id' is a bit generic and slightly redundant with the schema, keeping it from a perfect score.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers what the tool does, when to use it, error behavior, and parameter identification guidance, which is sufficient for a simple list operation. There is no output schema, but for a branch-listing tool this is not a serious gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema carries the parameter documentation burden. The description adds some guidance about project_id being a numeric ID or URL-encoded path and reminds about pagination, but this is largely restating or slightly genericizing the schema content.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action ('List branches in project') and a distinguishing detail ('with search filter'), and explicitly contrasts with the corresponding get tool for single resources. This makes it easy to tell apart from sibling tools like get_branch and list_protected_branches.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use guidance: use for a collection of resources, and choose the get tool when the single resource is already known. It also clarifies read-only behavior and error conditions, leaving little room for agent misselection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_ci_catalog_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 | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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 and openWorldHint=true. The description reinforces the read-only nature and adds valuable behavioral context about error conditions: missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. This goes beyond the annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no filler. The purpose is front-loaded, the alternative is named, and the error behavior is stated compactly. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers purpose, usage boundaries, read-only behavior, and error handling, which is strong for a list tool. The slight mismatch in the identifier parameter name prevents a perfect score, and there is no return-shape description, though no output schema exists to clarify that.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds only generic advice about pagination and identifiers, and its mention of 'project_id' or 'group_id' does not match the actual schema parameters (e.g., group_ids, not group_id). Thus it adds little parameter-level meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'List GitLab CI/CD Catalog resources/components visible to the user.' It also explicitly distinguishes itself from the single-resource get tool, so an agent can tell this list operation apart from get_ci_catalog_resource.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear when-to-use guidance: 'Use this for a collection of resources; choose the corresponding get tool when you already know the single resource to inspect.' It also mentions pagination and identifier handling, giving the agent actionable context for invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_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 | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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?
Annotations already declare readOnlyHint=true, and the description goes beyond that by enumerating failure modes (missing resources, invalid identifiers, insufficient permission, and rate limits returned as errors). It does not describe response shape or pagination internals, but the added error behavior is meaningful.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences are front-loaded with the core action and usage rule, then safety and error details. The last sentence is slightly redundant ('described by the schema' and 'exactly as documented') but the overall length is tight and focused.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers purpose, usage boundary, read-only safety, error behavior, and identifier/pagination care, which is enough for a list operation without an output schema. The group_id reference is a flaw, and the description does not explain filter interactions, leaving minor gaps for a 14-parameter tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already covers all 14 parameters, so the bar for added meaning is modest. However, the description's identifier guidance mostly repeats the schema, and its claim that 'project_id or group_id is accepted' is not supported by the schema, which lists only project_id. This makes the parameter guidance partially misleading.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'List repository commits with filtering options.' It explicitly positions this tool as the collection-level operation and distinguishes it from the corresponding get tool for a single resource, so an agent can tell it apart from get_commit and similar siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Directly says when to use this tool ('Use this for a collection of resources') and when to choose an alternative ('choose the corresponding get tool when you already know the single resource to inspect'). It also adds operational context: read-only behavior, error conditions, and identifier/pagination care.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_commit_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 | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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 mark readOnlyHint=true, and the description adds that the tool does not mutate GitLab data and describes error behavior for missing resources, invalid identifiers, insufficient permission, and rate limits. This is useful operational context beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact sentences, with the core purpose first and operational notes after. Some boilerplate is present, such as the generic 'collection of resources' phrasing, but it is not excessive.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has 12 parameters and no output schema, but every parameter is documented and the description covers read-only behavior, error conditions, and pagination. Missing details like default latest-only status are already implied by the schema's `all` parameter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already handles parameter meaning; the description mostly repeats project_id and pagination guidance. The mention of group_id is not present in this schema and adds slight noise rather than new semantic value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action and resource: 'List statuses for a commit,' and contrasts it with a get-tool pattern for single resources. This clearly distinguishes it from siblings like list_commits or create_commit_status.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to use this tool when retrieving a collection and to choose the corresponding get tool when a single resource is known, providing a when/when-not rule. It does not name the exact get sibling, so the guidance is slightly generic.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_draft_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 |
|---|---|---|---|
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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 this as read-only, and the description reinforces that and adds useful error behavior: missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. This goes beyond the structured annotations by setting caller expectations for failure modes, though it does repeat the read-only point.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is organized with the purpose first, followed by usage, behavioral, and parameter guidance. Every sentence contributes, though the closing identifier/pagination sentence is somewhat generic and could be trimmed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-required-parameter list tool with readOnly annotations, the description covers purpose, selection criteria, safety, error behavior, and identifier formatting. Without an output schema, it could still be more explicit about the response shape or pagination behavior, but the core information an agent needs to call it correctly is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the structured definitions already explain project_id, merge_request_iid, and jmespath. The description repeats the numeric-ID-or-URL-encoded-path guidance and says to use identifiers exactly as documented, but it adds no new parameter semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'List draft notes for a merge request,' giving a specific verb and resource and scoping it to merge requests. It also distinguishes the collection operation from 'the corresponding get tool,' so an agent can separate it from get_draft_note without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use this tool ('for a collection of resources') and when to choose another ('choose the corresponding get tool when you already know the single resource to inspect'). It also directs callers to follow the documented identifier and pagination conventions, which aids correct invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_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 | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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 GitLab data' and enumerates error conditions (missing resources, invalid identifiers, insufficient permission, rate limits). This goes beyond the readOnlyHint annotation by specifying how failures are surfaced, which helps an agent anticipate outcomes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded and the main usage note is efficient. However, the sentence about project_id/group_id references parameters absent from the schema, so it is filler that could mislead an agent and should be removed. This prevents the description from earning full marks for conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 9 parameters and no output schema, the description covers usage, safety, and error behavior, but it leaves gaps. It does not clarify the relationship with the get_project_events sibling, and the project_id/group_id sentence is irrelevant to this tool's schema. An agent would still rely heavily on the schema for invocation details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds generic guidance about project_id/group_id and pagination fields, but those identifiers are not in the schema, making the guidance potentially confusing rather than additive. It does not meaningfully enrich the already-documented parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'List events for the authenticated user' which clearly identifies the verb, resource, and scope. It explicitly distinguishes itself from sibling get tools by instructing to 'choose the corresponding get tool when you already know the single resource to inspect,' making it unambiguous as a collection-oriented list tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides a clear when-to-use guideline: 'Use this for a collection of resources' and an exclusion: 'choose the corresponding get tool when you already know the single resource to inspect.' However, it does not name specific siblings like get_project_events, so an agent might still need to infer the exact alternative for project-scoped events.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_group_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 | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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?
The annotations already declare readOnlyHint=true, and the description reinforces non-mutation while adding useful behavioral detail about errors for missing resources, invalid identifiers, insufficient permission, and rate limits. This goes beyond the annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the main action first, and most sentences carry real guidance: collection scope, read-only/error behavior, and identifier handling. The only minor redundancy is stating both 'read-only' and 'does not mutate,' but it does not bloat the description significantly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a filtered list tool with rich schema descriptions and readOnlyHint/openWorldHint annotations, the description provides adequate context: scope, error behavior, pagination handling, and identifier guidance are covered. Without an output schema, it does not describe the return shape, but the core invocation context is sufficiently complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema schema coverage is 100%, so the schema already documents all parameters in detail. The description adds a general identifier-format guideline, but no additional meaning for specific filter parameters beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the imperative verb 'List' with the explicit resource 'group iterations' and mentions filtering options. It clearly communicates that this is the collection-oriented counterpart to a single-resource get tool, making it distinguishable from siblings that target one resource.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use the tool: use it for a collection of resources, and directs the agent to a get tool when a single resource is already known. It does not name a specific sibling alternative, but the when-to-use guidance is clear and selection-relevant.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_group_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 | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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?
Annotations already declare readOnlyHint=true and openWorldHint=true, and the description reinforces that it is read-only and does not mutate GitLab data. It adds useful behavioral context by disclosing that missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors, which goes beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is reasonably concise and front-loaded with the core purpose, followed by usage guidance and behavioral notes. It is slightly dense with multiple clauses in the last sentence, but every sentence earns its place and there is no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with 100% schema coverage and no output schema, the description covers purpose, usage, error behavior, and identifier guidance. It does not describe the return format, but the absence of an output schema and the read-only nature make this a minor gap rather than a critical one.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all parameters. The description adds general guidance about using numeric IDs or URL-encoded paths and pagination fields, but does not add specific meaning beyond the schema for individual parameters. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists members of a GitLab group with optional name or username search, and explicitly distinguishes it from the corresponding get tool for single resources. This makes its purpose unambiguous and differentiates it from siblings like list_project_members.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says to use this for a collection of resources and to choose the corresponding get tool when you already know the single resource to inspect. It also provides guidance on identifiers and pagination fields, giving clear when-to-use and how-to-use context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_group_merge_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 | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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?
It confirms read-only behavior, which matches the readOnlyHint annotation, and adds useful error behavior: missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. This goes beyond the annotations by telling the agent what failure modes to expect, without contradicting any annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the primary purpose. The third sentence is somewhat long and includes a mildly redundant instruction to use fields exactly as documented, but it still earns its place by disclosing error behavior and ID format requirements.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's 28 parameters and no output schema, the description reasonably covers the essential call context: scope, when to use it, read-only safety, error conditions, and identifier format. The schema handles the exhaustive parameter details, so nothing critical is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage, so the description does not need to repeat parameter details. The note about numeric IDs versus URL-encoded paths mirrors the schema's group_id description, and the instruction to use required identifiers and pagination fields is general rather than additive. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies a specific verb, resource, and scope: 'List merge requests across all projects of a group and its subgroups.' It clearly distinguishes this group-scoped list operation from the single-resource get tool mentioned in the second sentence, and the name itself differentiates it from project-level or global list siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: use it for a collection of resources, and use the corresponding get tool when a single resource is already known. It does not explicitly compare against the sibling list_merge_requests tool, but the group/subgroup scope and the get-tool contrast provide clear context for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_group_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 | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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 carry readOnlyHint and openWorldHint, so the bar is lower; the description adds value beyond them by disclosing error behavior (missing resources, invalid identifiers, insufficient permission, rate limits returned as errors). No contradiction with annotations — the read-only claim aligns with readOnlyHint=true.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose is front-loaded in the first sentence, and the description is compact at three sentences. However, phrases like 'read-only and does not mutate GitLab data' are redundant, and the final sentence is generic boilerplate that could apply to nearly any tool, diluting the value of the prose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 19-parameter tool with no output schema, the description covers purpose, routing, safety, and error behavior, leaving parameter details to the fully documented schema. It is adequate but incomplete: it does not describe the return format or pagination response shape, which matters since no output schema exists to fill that gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds minor guidance about supplying numeric IDs or URL-encoded paths, but this largely restates the schema's 'Group ID or path' note and is somewhat generic boilerplate. It also references project_id, which is not a parameter in this schema, introducing slight inaccuracy.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource ('List projects in a group') and explicitly contrasts itself with the 'corresponding get tool' for single-resource inspection, which differentiates it from siblings like get_project. However, it does not distinguish itself from the close sibling list_projects, leaving a plausible alternative ambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear decision rule: use for a collection of resources, and switch to the get tool when a single resource is known. This is explicit routing guidance, but it omits exclusions relative to list_projects and other list tools, so it falls short of fully covering when-not-to-use scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_issue_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) | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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?
The description states it is read-only (matching readOnlyHint=true) and adds error behavior: invalid identifiers, missing issues, and permission failures are reported as errors. It also says it returns discussion items. While annotations already cover the read-only safety profile, the error reporting adds value beyond annotations. It doesn't contradict annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. The core purpose is front-loaded, and the sibling differentiation and error behavior are compactly included. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers purpose, usage, and error behavior, and the schema covers parameters and pagination. It does not describe the exact structure of returned discussion items, but for a list tool with no output schema, this is a minor gap. The tool is adequately specified for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all five parameters are already fully documented in the schema. The description adds no extra parameter-level detail, but given the complete schema, the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (list discussions) and the target (an issue), and explicitly differentiates it from `list_issues` and `get_issue`, so an agent can immediately tell what this tool does and how it differs from close siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit usage guidance: use this to inspect threaded discussions, use `list_issues` for issue records, and `get_issue` for single issue fields. This provides both when-to-use and when-not-to-use with named alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_issue_emoji_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 |
|---|---|---|---|
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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 annotations already declare readOnlyHint and openWorldHint, so the bar for additional behavioral disclosure is lower. The description adds concrete error conditions (missing resources, invalid identifiers, insufficient permission, rate limits) and explicitly states it does not mutate data, providing useful operational context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences with the core purpose front-loaded. The first two sentences are tight and informative; the third is a generic template clause that introduces off-schema references, but overall the structure is efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only list operation, the description covers purpose, read-only behavior, error handling, and a rough usage rule. However, the inaccurate `group_id`/pagination references and silence about the response shape leave minor gaps that an agent must infer or discover elsewhere.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents the parameters. The description's parameter guidance is mostly redundant, and it references `group_id` and 'pagination fields' that do not appear anywhere in the input schema. This can mislead an agent rather than clarify.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'List all emoji reactions on an issue,' a specific verb+resource pair. This clearly distinguishes it from sibling tools like list_issue_note_emoji_reactions and the merge request reaction counterparts, leaving no ambiguity about what is listed.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description advises using this tool 'for a collection of resources' and suggests a get tool when a single resource is known. However, no corresponding get tool for emoji reactions actually exists, and the description does not explicitly contrast with create/delete or note-scoped siblings. The guidance is directionally useful but lacks concrete alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_issue_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 |
|---|---|---|---|
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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 provide readOnlyHint=true and openWorldHint=true; the description repeats the read-only claim but goes beyond by enumerating error conditions: missing resources, invalid identifiers, insufficient permission, and rate limits. This is useful context, though it does not detail return 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 front-loaded with purpose and selection guidance. The first three sentences are dense and useful, but the final sentence is boilerplate that largely repeats the schema and introduces an irrelevant group_id reference, so it is not perfect.
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 list tool, it covers purpose, when to use it, error behavior, and ID formatting. There is no output schema, but the name and verb make the return type clear; the only minor gap is the unactionable pagination/group_id 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?
Schema description coverage is 100%, so the schema carries parameter documentation. The description only adds generic ID-format guidance and mentions group_id/pagination fields that are not present in the schema, providing little per-parameter value beyond 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 and resource ('List all issue links for a specific issue') and explicitly contrasts itself with the single-resource 'get' tool, so an agent can distinguish it from siblings like get_issue_link 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?
It states when to use this tool ('for a collection of resources') and when not to ('choose the corresponding get tool when you already know the single resource to inspect'). This is explicit selection guidance against the obvious alternative.
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) | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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?
Annotations already declare readOnlyHint=true, and the description reinforces this by saying the tool 'is read-only and does not mutate GitLab data.' It additionally discloses error behavior for missing resources, invalid identifiers, insufficient permissions, and rate limits, which adds value beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is only four sentences and front-loads the core purpose first. It is appropriately concise, though the final generic sentence about project_id/group_id and pagination is not specific to this tool and adds minor noise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a straightforward read-only list tool with all parameters schema-documented, the description is largely complete. It covers collection-vs-single use, discussion_id handling, and error behavior, though it does not describe the expected return payload since no output schema is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3 and the schema already documents all parameters. The description adds discussion_id context already present in the schema, but also includes a boilerplate note about group_id which is not a parameter in this schema, reducing its added value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'List all emoji reactions on an issue note.' It also distinguishes a collection use case from a single-resource get tool, clearly separating it from sibling list/get tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says to pass discussion_id for discussion thread replies and directs the agent to 'choose the corresponding get tool when you already know the single resource to inspect.' This gives concrete when-to-use versus alternative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_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 | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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?
Even though annotations already mark readOnlyHint=true, the description adds meaningful behavioral context: it is paginated, requires issue read permission, and returns issue records or GitLab errors for invalid identifiers, missing resources, or rate limits. This goes beyond the annotation and helps the agent anticipate failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences with no wasted words. It front-loads the core purpose, immediately covers the default behavior, then adds alternative routing and safety/error context in a tight structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 22-parameter tool with no output schema, the description covers the essential context: what it lists, how scope works, when to use siblings, pagination, permissions, and expected return/error behavior. The rich schema fills in the remaining parameter details, so nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and every parameter already has a meaningful description. The tool description adds only light semantic value by mentioning the default scope and optional project_id filtering, but it does not need to explain the many other parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb and resource: 'List issues' and 'list GitLab issues, optionally scoped with project_id'. It also gives the default scope and explicitly distinguishes itself from get_issue and my_issues, so an agent can confidently select it over sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage guidance is explicit: it says to use get_issue when the issue iid is already known and my_issues for issues assigned to the current user. It also clarifies the default behavior (created by current user) and how to broaden it with scope='all'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_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 | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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?
The description adds that the tool is read-only and does not mutate GitLab data, which aligns with readOnlyHint=true. It goes beyond annotations by disclosing that missing resources, invalid identifiers, insufficient permission, and rate limits are surfaced as errors, which is useful behavioral context. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the purpose and usage guidance, but the third sentence mixes generic identifier advice with pagination and includes a conditional about group_id that does not apply to this schema. It is relatively concise but could be tightened by removing the irrelevant group_id clause.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool is a simple read-only list with all parameters documented in schema, the description covers the key distinctions and error behavior. It doesn't describe the return format, but for a list tool that may be acceptable. The advice about projection and pagination is present, so an agent has enough to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All 7 parameters already have descriptions in the schema (100% coverage), so the description's role is supplementary. It reiterates that project_id accepts a numeric ID or URL-encoded path (already in schema) and advises using pagination fields as documented, adding little new meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the action ('List labels') and the resource ('for a project'), which is specific. It also distinguishes this collection-oriented tool from the get tool for single resources, differentiating it from siblings like get_label. The mention of group_id is slightly tangential because the schema only accepts project_id.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use this tool ('for a collection of resources') and when to choose the alternative ('when you already know the single resource to inspect'). This is direct usage guidance versus siblings. It also instructs to use required identifiers and pagination fields as documented, reinforcing correct invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_merge_request_changed_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 |
|---|---|---|---|
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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?
Annotations already declare readOnlyHint=true, and the description reinforces it by saying 'does not mutate GitLab data'. It adds behavioral context on error handling (missing resources, invalid identifiers, insufficient permission, rate limits), which is valuable beyond annotations. No contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is reasonably concise with key info front-loaded: purpose and scope first, then usage guidance and error handling. It is a bit dense with multiple clauses but each sentence adds value. It could be split for readability but is not bloated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (5 params, no output schema) and the strong annotation coverage, the description covers purpose, usage, error behavior, and identifier handling. It does not detail the return format (e.g., array of strings), but with no output schema that might be expected; still, the lack of explicit return description is a minor gap given the tool's simple output.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds guidance on using numeric ID or URL-encoded paths for project_id/group_id and mentions pagination fields, which is extra clarity. It also implies which parameters are alternative identifiers (mergeRequestIid or branchName) despite not listing all in the schema. This exceeds the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('List'), resource ('changed file paths'), and scope ('in a merge request'), and distinguishes from the 'get' tool by noting it is for a collection of resources. The description also clarifies what it does NOT include ('without diff content'), preventing confusion with diff-related siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the main use case (listing a collection) and contrasts with the 'get' tool for a single resource. It also notes required identifiers and error conditions, but does not explicitly mention when NOT to use this tool beyond the sibling distinction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_merge_request_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. | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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 already declare readOnlyHint=true, but the description adds value by explicitly stating it does not mutate GitLab data and by enumerating error conditions such as missing resources, invalid identifiers, insufficient permission, and rate limits. This is useful context beyond the annotations, though not exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is reasonably front-loaded with the action and pagination, and the read-only/error sentence adds useful context. However, the final sentence repeats schema guidance, references group_id outside the schema, and the parenthetical identifier requirement is unclear, adding noise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
It covers purpose, pagination, read-only behavior, error handling, and the collection-vs-single guidance. But with no output schema, it does not describe what a returned diff list looks like, and it muddies identifier requirements; for a 7-parameter tool this is only partially complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds unreliable semantics: 'mergeRequestIid or branchName required' conflicts with the schema's only required parameter being project_id, 'branchName' is not a schema parameter, and group_id is mentioned though absent from the schema. The URL-encoded path advice mostly duplicates the schema, so the net contribution is negative and potentially misleading.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('List merge request diffs with pagination') and identifies the tool as the collection-oriented alternative to a get tool. However, the parenthetical claiming 'mergeRequestIid or branchName required' uses names that do not match the schema and could confuse an agent, so it does not earn a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says to use this for a collection of resources and to choose the corresponding get tool when inspecting a single resource. It does not name the exact sibling tool or cover alternatives like changed-files tools, but it gives clear enough when-to-use direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_merge_request_emoji_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 |
|---|---|---|---|
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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 supply readOnlyHint=true, and the description adds concrete value beyond it: 'read-only and does not mutate GitLab data,' plus enumerated error conditions (missing resources, invalid identifiers, insufficient permission, rate limits). This aligns with both readOnlyHint and openWorldHint, and no contradiction exists between description and annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, front-loaded with the core purpose, followed by usage routing, safety/error disclosure, and parameter guidance. Each sentence earns its place, though the final sentence contains boilerplate (group_id, pagination) that is not actually applicable to this schema, keeping it just short of top marks.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter list tool with 100% schema coverage, readOnlyHint=true, and no output schema, the description covers selection criteria, safety posture, and error conditions—the essentials an agent needs. Residual gaps (unnamed note-level sibling, no return-format hint) are minor given the schema richness; the inapplicable group_id line is the main noise.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all three parameters, setting the baseline at 3. The description reinforces the project_id format ('numeric ID or complete URL-encoded path described by the schema'), but introduces a conditional reference to group_id that does not exist in this schema and a generic pagination directive with no pagination fields present—mild noise that prevents it from exceeding the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'List all emoji reactions on a merge request,' which matches the tool name precisely and distinguishes it from single-resource get tools. It frames collection vs. single-resource tooling, but refers generically to 'the corresponding get tool' rather than naming the most confusable sibling, list_merge_request_note_emoji_reactions, so the name must carry that differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides an explicit selection rule: use for a collection of resources, switch to a get tool when a single resource is already known. This is actionable and clear, though the get-tool alternative is generic; it does not point at a concrete sibling for note-level emoji reactions or the create/delete emoji tools, leaving some routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_merge_request_note_emoji_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) | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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?
While readOnlyHint already flags safety, the description adds concrete behavioral detail by stating the tool 'does not mutate GitLab data' and enumerating error outcomes (missing resources, invalid identifiers, insufficient permission, rate limits). This goes beyond the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and each sentence adds a distinct piece of information. The final sentence contains minor boilerplate (mentioning group_id and pagination fields that are not in the schema), but overall it remains efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with no output schema, the description covers scope, read-only behavior, error handling, and identifier formats. It falls slightly short of full completeness because the generic group_id/pagination mention could confuse an agent, and it doesn't describe the result shape.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaningful guidance: discussion_id is 'Required for notes that are discussion replies' and project_id can be a numeric ID or URL-encoded path. This clarifies the schema rather than repeating it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'List all emoji reactions on a merge request note.' It also distinguishes the collection-oriented tool from a hypothetical get tool, and the name plus content differentiates it from siblings like list_merge_request_emoji_reactions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives an explicit collection-vs-single rule ('Use this for a collection of resources; choose the corresponding get tool when you already know the single resource to inspect') and explains when discussion_id is required. It does not explicitly contrast with list_merge_request_emoji_reactions, but the name makes the MR-note scope clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_merge_request_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) | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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 provide readOnlyHint and openWorldHint, so the description's 'read-only' claim adds little, but it does add value by stating 'requires project access' and describing error conditions (invalid identifiers, missing resources, rate limits). This goes beyond what annotations convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no wasted words. Purpose is front-loaded, followed by usage guidance and behavioral notes. Very efficient and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list tool with no output schema and annotations present, the description covers purpose, usage, access requirements, and error conditions. It is sufficiently complete for an agent to invoke this tool correctly; a small gap is not detailing return structure, but that's not required given no output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema already documents all parameters. The description mentions pagination, which ties to page/per_page, but does not add significant semantic detail beyond the schema. Baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('List pipelines for a merge request with pagination') and explicitly differentiates from list_pipelines. It clearly identifies the MR-scoped scope, distinguishing it among many siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit usage guidance: 'Use this to inspect pipelines associated with one merge request; use `list_pipelines` for project-wide pipeline filtering.' Also notes that project access is required, giving a clear prerequisite.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_merge_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 | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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?
The read-only claim repeats what readOnlyHint already provides. The description does add some behavioral context by stating that missing resources, invalid identifiers, insufficient permissions, and rate limits are returned as errors, and by calling out pagination fields. However, these are generic API behaviors and no unexpected effects are disclosed beyond that; the added value over the annotations is modest.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is reasonably organized, leading with the main purpose and then giving usage context. However, the read-only sentence largely duplicates the existing annotation, and the closing instruction about identifiers and pagination is vague filler. The group_id mention also creates confusion without adding useful structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 26 documented parameters, full schema coverage, and no required parameters, the schema does most of the heavy lifting. The description covers the key decision point (project_id vs no project_id) and general error behavior, but it does not describe the return shape, which matters here because there is no output schema. It also omits any mention of the list_group_merge_requests alternative, so the overall context is adequate but not complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3 because the schema already documents all 26 parameters. The description adds only a high-level explanation of project_id's optional role and a generic instruction to follow documented identifiers and pagination fields. The mention of 'group_id' is misleading because group_id is not in the schema, slightly reducing the semantic value of the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: listing merge requests, with behavior depending on presence or absence of project_id. It also distinguishes this from single-resource 'get' tools via the collection-vs-single framing. However, it does not explicitly distinguish itself from the closely related sibling list_group_merge_requests, and the mention of group_id is confusing since group_id is not in the input schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives practical guidance: use this for a collection of resources and use the corresponding get tool when a single resource is already known. It also explains the project_id vs no-project_id scoping. It stops short of naming the specific alternative tool (get_merge_request) or addressing when list_group_merge_requests should be chosen, so guidance is good but not fully explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_merge_request_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 |
|---|---|---|---|
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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 provide readOnlyHint and openWorldHint, so the description's read-only statement is partially redundant. However, it adds useful behavioral detail by stating that missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors, which is beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences front-load the purpose and selection guidance, followed by behavior and parameter notes. It is compact and readable, though the final sentence includes boilerplate that references group_id and pagination fields not present in the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list operation with fully documented parameters, the description gives enough to select and invoke the tool correctly: purpose, sibling distinction, error behavior, and identifier format. Without an output schema, it doesn't describe exact response shape, but the list nature of the operation makes that reasonably inferable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema carries most parameter documentation. The description mostly paraphrases project_id and gives a generic 'as documented' instruction without adding substantive meaning. The mention of group_id and pagination fields is slightly inaccurate since neither appears in the schema, preventing a higher score.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence names a specific action and resource: 'List all versions of a merge request.' It also distinguishes itself from the single-resource 'get' variant, which separates it from sibling tools like get_merge_request_version.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs to use this tool for a collection and to choose the corresponding get tool when the single resource is already known. It also covers read-only usage and error conditions, making the selection context clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_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 | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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 set readOnlyHint=true, so read-only is redundant, but the description adds valuable error semantics: 'missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors.' This goes beyond the annotation and helps the agent anticipate failure modes. It does not explain openWorldHint, but that's already covered by the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose is front-loaded, but the description is longer than necessary. The sentence about project_id/group_id is boilerplate and not relevant to this schema, and the 'kind' filter sentence is misleading. With some trimming and removal of inaccurate references, it could be much tighter.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a list tool with no required parameters and full schema coverage, the description covers purpose and error behavior. However, the false parameter hints (kind, project_id, group_id) and the lack of any statement about the return shape (list of namespaces) leave the agent with uncertain guidance when calling the tool correctly. The inaccuracies make it less complete than it appears.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description introduces parameters that do not exist in the schema: 'kind', 'project_id', and 'group_id'. This actively misleads the agent into trying non-existent arguments. It adds no clarification for the actual parameters (page, owned, search, jmespath, per_page) beyond their schema descriptions, and the generic closing sentence about identifiers adds no value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies the exact resource and action: 'List all namespaces (users and groups) available to the current user.' It explicitly distinguishes this collection-style tool from a single-resource get tool ('choose the corresponding get tool when you already know the single resource to inspect'), making it easy to tell apart from get_namespace and verify_namespace.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives an explicit when-to-use rule: 'Use this for a collection of resources' and when-not: 'choose the corresponding get tool when you already know the single resource to inspect.' It also provides a filter hint ('Filter by kind='group' for groups only') to narrow results, which is a clear usage scenario even if the parameter isn't in the schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_project_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 | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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 annotations already declare readOnlyHint=true, and the description reinforces the read-only/non-mutating nature. It adds useful behavioral context beyond the annotations by stating that missing resources, invalid identifiers, insufficient permission, and rate limits are surfaced as errors. No contradiction with annotations exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and usage guidance are front-loaded in three sentences, and the text avoids parameter-by-parameter repetition. The final sentence is somewhat generic ('exactly as documented') and the group_id mention adds slight noise, preventing a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 8 parameters and no output schema, the description supplies the safety profile, error behavior, and identifier formatting guidance while leaving field details to the high-coverage schema. The stray group_id reference and the unnamed single-resource alternative leave a small completeness gap, but the tool remains safely invocable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the description is not required to document each parameter and adds little beyond the schema. The identifier guidance largely restates the schema's project_id description, and the reference to group_id is potentially misleading because this schema only accepts project_id.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with 'List members of a GitLab project', a specific verb+resource statement that clearly states what the tool does. The collection-vs-single-resource contrast further distinguishes it from the get_* siblings before the schema is even considered.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use guidance: use it for a collection and prefer a get tool when a single resource is already known. However, the alternative is only named generically ('the corresponding get tool'), and it does not explicitly contrast this tool with the sibling list_group_members.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_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 | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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?
The description explicitly states it is read-only and does not mutate GitLab data, and enumerates error conditions: missing resources, invalid identifiers, insufficient permission, and rate limits. While annotations already convey readOnlyHint, the description adds concrete error semantics, which is valuable for an agent deciding how to handle failures.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no filler. The core action, scope, usage guidance, safety note, and error behavior are all conveyed efficiently, with the most important information front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is complete enough for a list tool: it covers scope, read-only behavior, error semantics, and points to the schema for identifiers and pagination. It does not describe the return shape, but given no output schema and the obvious meaning of 'list projects,' the omission is minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3 even without additional parameter details in the description. The description's mention of project_id/group_id and URL-encoded paths is generic and not directly applicable to this tool's actual schema, so it adds little beyond the structured parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb and resource: 'List projects accessible by the current user.' It also distinguishes the collection-oriented purpose from a single-resource get tool, saying to choose the 'corresponding get tool when you already know the single resource.' This makes the tool's intent unambiguous and separates it from siblings like get_project.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides clear context: use for a collection of resources, and choose a get tool for a known single resource. It also instructs to use required identifiers and pagination fields as documented. However, it does not explicitly differentiate when to use this over the sibling list_group_projects, so the guidance is good but not fully exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_protected_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 | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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 clearly states the operation is read-only and does not mutate GitLab data, which is useful even though readOnlyHint=true already exists. It goes beyond annotations by describing error behavior for missing resources, invalid identifiers, insufficient permission, and rate limits, giving the agent expectations for failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is reasonably compact and front-loaded with the core purpose. The sentences about read-only behavior and parameter usage are useful, though the group_id reference feels like boilerplate and could be trimmed without losing value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list operation, the description covers the main use case, differentiates from the singular get tool, and provides error expectations. It does not describe the return format or explicitly name the sibling get_protected_branch, but given the tool is a straightforward collection listing and there is no output schema, the current level is sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all parameters. The description adds some reinforcement about numeric ID or URL-encoded paths and pagination usage, but it largely restates what the schema says. The mention of group_id is a slight mismatch because the schema only accepts project_id, so it adds minor confusion but no substantive new meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a precise verb and resource ('List protected branches in a project') and immediately distinguishes itself from the singular get tool by saying to use that when the agent already knows the single resource. The name itself could be ambiguous among siblings like list_branches, but the description resolves it by naming the resource type and search filter.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells the agent when to use this tool (for a collection of resources) and when not to ('choose the corresponding get tool when you already know the single resource to inspect'). It also instructs to use required identifiers and pagination fields exactly as documented, which is clear operational guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_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 | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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?
Annotations already declare readOnlyHint and openWorldHint, but the description adds concrete error behavior: missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. This is valuable, non-redundant context beyond the structured annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each serving a distinct purpose: operation statement, usage/error snapshot, parameter/identifier guidance. The description is front-loaded with the core action and contains no filler or redundant restatements.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and nine optional parameters, the description covers purpose, usage, error behavior, and parameter encoding. It does not describe the return shape, but for a list operation this is largely inferable; the missing output details are a minor gap given the solid coverage of invocation concerns.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and already documents all parameters, so the baseline would be 3. However, the description's guidance on project_id/group_id says to provide 'the numeric ID or complete URL-encoded path described by the schema' – yet the schema types these as numbers and never mentions URL-encoded paths. This is potentially misleading and could cause an agent to pass a string where a number is expected. The reference to 'required identifiers' is also confusing because no parameters are required.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the exact operation: 'List GitLab to-do items for the current user.' It clearly identifies the resource (to-do items) and distinguishes from single-resource get tools with the explicit guidance to 'choose the corresponding get tool when you already know the single resource to inspect.' This differentiates it from siblings like list_issues or get_issue without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use context: for a collection of resources, and when to instead use a get tool for a single known resource. It also instructs on identifier handling and pagination field usage, covering the practical conditions under which the tool should be invoked.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mark_all_todos_doneB
Mark all pending GitLab to-do items as done for the current user. Use this for the specific operation described; choose a sibling tool when you need a different resource or lifecycle action. It changes remote GitLab state and requires the necessary project or group permission; GitLab returns validation, conflict, permission, or rate-limit errors instead of silently applying an invalid request. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.
| Name | Required | Description | Default |
|---|---|---|---|
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description does add useful behavioral context beyond the minimal openWorldHint annotation by stating that it 'changes remote GitLab state,' requires permission, and that GitLab returns validation/conflict/permission/rate-limit errors. However, it also references 'project_id or group_id' and 'pagination fields' that are absent from this tool's schema, which introduces confusion and weakens the disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first sentence is strong, but the remaining three sentences are padded with generic instructions that could apply to almost any tool in the sibling set. The irrelevant project_id/group_id and pagination guidance should not be present, making the description longer without earning its space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one optional parameter and no output schema, the description covers the core operation, mutation, permission requirements, and error behavior. It is adequate, but the misapplied generic text and lack of any mention of the response or distinction from mark_todo_done leave meaningful gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema fully documents the only parameter, jmespath, so the description does not need to repeat it. But the only parameter-related guidance it gives mentions 'project_id or group_id,' 'required identifiers,' and 'pagination fields' – none of which exist in this tool's actual schema. This actively misleads rather than adding meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise verb-object-scope statement: 'Mark all pending GitLab to-do items as done for the current user.' This clearly identifies the resource, action, and target, and the word 'all' distinguishes it from the singular sibling mark_todo_done without needing to inspect its schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The only guidance is generic boilerplate: 'Use this for the specific operation described; choose a sibling tool when you need a different resource or lifecycle action.' It does not mention the closely related mark_todo_done sibling or explain when to choose one versus the other, so an agent gets no actionable disambiguation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mark_todo_doneB
Mark a GitLab to-do item as done. Use this for the specific operation described; choose a sibling tool when you need a different resource or lifecycle action. It changes remote GitLab state and requires the necessary project or group permission; GitLab returns validation, conflict, permission, or rate-limit errors instead of silently applying an invalid request. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The ID of the to-do item | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description states that the tool mutates remote GitLab state, requires project or group permission, and surfaces validation, conflict, permission, or rate-limit errors rather than silently succeeding. This exceeds the sparse openWorldHint annotation with actionable behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose sentence is front-loaded, but two of the four sentences are boilerplate: the generic sibling-selection instruction and the parameter guidance about identifiers and pagination that do not apply to this tool's schema. The instructions are not tailored enough to earn their place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-id mutation with no output schema, the description covers the operation, state change, authorization prerequisite, and error behavior. It does not describe the return payload or idempotency, but those are comparatively minor for this simple action.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents both id and jmespath at 100%, so the baseline is 3; however, the description adds no schema-level meaning and instead mentions project_id, group_id, and pagination fields that do not exist in this schema. This generic filler is potentially misleading.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence names a specific verb and resource: mark a GitLab to-do item as done. It is clear which lifecycle action this covers, but it does not explicitly distinguish itself from sibling mark_all_todos_done, so it misses the top score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It tells the agent to use the tool for the 'specific operation described' and to choose a sibling for a different resource or lifecycle action, which gives general guidance. It does not name mark_all_todos_done as the single-item vs bulk alternative, so the routing guidance is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
merge_merge_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 | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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 flag openWorldHint and destructiveHint, but the description goes further: it explains the operation changes repository state, may squash commits, schedule auto-merge, or delete the source branch, requires merge permission, and returns a merge result or mergeability error. This goes well beyond the annotations and provides actionable behavioral context about side effects and permissions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is not extremely short but every sentence contributes: purpose, usage condition, side effects, permission, SHA guidance. It is front-loaded with the core purpose and conditional usage. There is no redundant content, though it could be slightly tighter without losing meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, open-world tool with 10 parameters and no output schema, the description covers all essential aspects: when to use, side effects, permission requirement, error behavior, and the critical SHA parameter guidance. Nothing an agent needs to call it correctly is missing, given the schema already details each parameter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema documents all parameters. The description adds extra semantic value by explicitly instructing to pass `sha` from get_merge_request and warning about GitLab 19.2+ groups, which is not fully in the schema. This is helpful cross-tool wiring, though the description does not add much beyond that because the schema already describes each parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states clearly that the tool merges a merge request, and explicitly differentiates it from approve_merge_request, which is the relevant sibling. The verb 'merge' plus the resource 'merge request' is specific and unambiguous, so an agent can immediately distinguish this from sibling operations like approval or update.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description specifies when to use (only after checking approval, conflict, and pipeline state) and when not to (use approve_merge_request for approval). It also names the alternative tool explicitly. This gives an agent clear decision logic for tool selection, which is more than typical guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mr_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) | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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 the description reinforces this while adding valuable context: it returns threaded discussion items and reports invalid IDs, missing resources, and permission failures as errors. This goes beyond the structured annotations and helps the agent anticipate failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loads the core purpose, then adds usage guidance and behavioral context. There is minor redundancy between 'List discussion items' and 'list complete discussion threads,' but overall each sentence contributes useful information without excessive length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with a well-covered schema and no output schema, the description provides enough context: what it returns, when to use an alternative, and how errors surface. It does not describe response shape, but that is not required here given the tool's simplicity and the absence of side effects.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already has 100% description coverage for all five parameters, so the baseline is 3. The description does not add parameter-specific meaning beyond its general references to merge requests, but it also does not need to since the schema fully documents each parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb and resource: 'List discussion items for a merge request' and specifies that it returns 'complete discussion threads.' It distinguishes itself from the sibling tool `get_merge_request_notes` by contrasting flat notes with threaded discussions, making the purpose unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly provides usage guidance: use this tool for complete discussion threads and use `get_merge_request_notes` when only flat notes are needed. This gives an agent a clear decision rule between two closely related tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
my_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 | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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?
Annotations already declare readOnlyHint=truebull; the description adds beyond that by stating the tool is paginated, requires authentication, and can return permission/rate-limit errors. This is useful behavioral context not present in the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded, but the first sentence is effectively repeated inside the second sentence ('list issues assigned to the authenticated user' appears twice). One redundant clause keeps this from being highly concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with fully documented parameters, the description covers routing, authentication, pagination, and error behavior. There is no output schema, but the description gives enough about return value shape ('assigned issue records') for an agent to proceed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 12 parameters including defaults and enum choices. The description adds no parameter-level detail, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb and resource: 'List issues assigned to the authenticated user.' It also explicitly distinguishes itself from list_issues and get_issue, so an agent can select correctly without inspecting other tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit routing guidance: use list_issues for project-wide/author-scoped listing, get_issue for a single issue. This clearly tells an agent when to use this tool versus its closest alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_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 | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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?
The description goes beyond the destructiveHint and openWorldHint annotations by disclosing the permission requirement ('requires maintainer-level permission'), the possible side effects ('may enable force-push or code-owner settings'), and the return format ('returns the protection rule or a validation/permission error'). This adds significant behavioral context that annotations do not convey, and it does not contradict them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, tightly written paragraph of three sentences. The main purpose is front-loaded, followed by usage guidance and behavioral details. Every sentence adds necessary information with no fluff or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's 9 parameters (the schema fully documents them), no output schema, and annotations that already signal destructiveness and open world, the description covers all critical operational aspects: purpose, usage, permission, side effects, and return behavior. An agent has enough information to correctly invoke this tool and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with each parameter (including access level meanings) already described in the schema. The tool description does not add any parameter-specific semantics beyond what the schema provides, so the baseline of 3 is appropriate. It does not clarify interactions between parameters (e.g., the effect of setting push_access_level to 0), but that is not required given full schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Protect a repository branch' and specifies the actions (set push/merge/unprotect access levels). It distinguishes from siblings like get_protected_branch by explicitly naming it as the inspection tool, and the name contrasts with unprotect_branch. The scope (branch or wildcard) is also made explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides explicit when-to-use guidance: 'Use this to create or update protection rules for a branch or wildcard; use get_protected_branch to inspect existing rules first.' This directly routes the agent to the correct sibling and implies this tool is for modification, not inspection. No exclusions are missing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
publish_draft_noteA
Publish a single draft note. Use this for the specific operation described; choose a sibling tool when you need a different resource or lifecycle action. It changes remote GitLab state and requires the necessary project or group permission; GitLab returns validation, conflict, permission, or rate-limit errors instead of silently applying an invalid request. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.
| Name | Required | Description | Default |
|---|---|---|---|
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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?
With only openWorldHint set, the description adds valuable behavioral context: the call mutates remote GitLab state, requires project or group permission, and returns validation, conflict, permission, or rate-limit errors rather than silently applying invalid requests. This meaningfully compensates for the lack of readOnly/destructive hints and does not contradict the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The tool purpose is front-loaded and useful, and the mutation/error-behavior content earns its place. However, several phrases are boilerplate, such as 'Use this for the specific operation described' and 'use required identifiers and pagination fields exactly as documented.' It is reasonably sized, but not every sentence adds meaningful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple four-parameter mutation, the description covers the core behavioral contract: remote state change, permissions, and error behavior. It does not describe what a successful publish returns, and because there is no output schema, that gap is left uncovered by the structured data. The generic boilerplate also weakens its completeness for this specific tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents every parameter and the baseline of 3 is appropriate. The description mostly repeats generic guidance about numeric IDs or URL-encoded paths, and the references to group_id and 'pagination fields do not cleanly match this schema. It adds no real semantic value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening clause names a specific verb and resource: 'Publish a single draft note.' The word 'single' distinguishes it from bulk publishing, and the lifecycle framing clarifies this is the publish action rather than create/update/delete. It does not explicitly name sibling tools like bulk_publish_draft_notes, so it stops just short of full differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives only generic routing advice: 'Use this for the specific operation described; choose a sibling tool when you need a different resource or lifecycle action.' It never names the concrete alternative for publishing multiple draft notes or for editing a draft note first. The intended usage is implied by the operation, but not made explicit for the sibling set.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
push_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 | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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 already flag destructiveHint, but the description adds concrete behavioral context: it writes repository history on the selected branch, requires repository write permission, and reports commit results or validation/conflict/protected-branch errors. It also discloses that GITLAB_PERMISSION_MODE=modify rejects delete and move, which is useful and non-obvious.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five compact sentences front-load the purpose and alternative, then cover defaults, restrictions, and behavior. Every sentence earns its place, with no filler or redundant restatement.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a complex multi-file mutation with no output schema, the description covers the core invocation context: atomic commit behavior, write permission, branch-history side effects, error classes, and permission-mode restrictions. This is enough for an agent to select and call the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the field-level details are already well documented. The description adds valuable aggregate semantics: each file defaults to action 'create', action and encoding are per-file and additive, and the permission-mode constraint on delete/move. This goes beyond simply restating the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Push multiple files in a single commit.' It explicitly distinguishes itself from create_or_update_file, which is for single-path updates. An agent can immediately tell what this tool does and how it differs from a likely sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use guidance: use push_files for several atomic file changes, and use create_or_update_file when only one path is involved. This direct alternative-routing leaves no ambiguity about selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resolve_merge_request_threadA
Resolve a thread on a merge request. Use this to mark an existing merge request review thread resolved; use update_merge_request_discussion_note when the note text itself must change. The operation changes review state, requires permission to resolve discussions, and returns the updated discussion or a missing-thread/permission error.
| Name | Required | Description | Default |
|---|---|---|---|
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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 provide only openWorldHint=true, so the description carries the burden. It clearly states the operation changes review state, requires permission to resolve discussions, and returns the updated discussion or a missing-thread/permission error. This discloses side effects, authorization needs, and failure modes. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, purpose first, then usage distinctioncomm and behavior/error summary. Every clause is informative with no filler. Front-loaded with the action and resource.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schemacorpor, the description explains the return value and error cases. It covers purpose, usage boundaries, permissions, state-change impact, and failure modes. Required parameters are all schema-documented, and optional jmespath needs no special explanation. Highly complete for a tool of this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds general context (review thread, state change) but does not add parameter-level semantics beyond what the schema already provides for project_id, merge_request_iid, discussion_id, or resolved. It is adequate but not compensatory.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action (resolve), a precise resource (existing merge request review thread), and immediately distinguishes it from the sibling update_merge_request_discussion_note. An agent can tell exactly what this tool does without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use this tool (to mark a thread resolved) and when to use the alternative update_merge_request_discussion_note (when note text must change). This is direct when-to-use and when-not-to-use guidance, naming the exact sibling tool. No inference required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_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 | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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 provide readOnlyHint=true and openWorldHint=true, so the bar is lower. The description adds useful behavioral detail: it is read-only, does not mutate GitLab data, and returns errors for missing resources, invalid identifiers, insufficient permissions, and rate limits. This is solid but not exhaustive; for example, no detail on result ordering or empty searches is given.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and includes routing, safety, and error semantics in a compact form. The last sentence is somewhat generic and mentions identifiers not present in the schema, so it is not perfectly tight, but overall every sentence contributes.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a search tool with readOnly/openWorld annotations and full schema coverage, the description covers purpose, routing, safety, and error behavior. It does not describe what fields are searched or how matches are ranked, and there is no output schema, so an agent may still need to infer some return semantics.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all parameters and the baseline is 3. The description adds general guidance about numeric IDs/URL-encoded paths and pagination fields, but project_id/group_id are not actually present in the schema, so that guidance is somewhat detached from the real parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource ('Search for GitLab projects') and explicitly contrasts discovery with typed get/list tools when the identifier is already known. This clearly distinguishes search_repositories from siblings such as get_project and list_projects.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It says when to use the tool ('discover matching content') and when not to ('choose a typed get or list tool when the target identifier is already known'). This gives an explicit routing rule with no ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unapprove_merge_requestA
Unapprove a merge request. Use this to remove the current user's approval from an existing merge request; use merge_merge_request only when you intend to merge. The operation changes review state and requires approval permission, and GitLab returns the updated result or an error when the request or approval is unavailable.
| Name | Required | Description | Default |
|---|---|---|---|
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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?
Annotations only include openWorldHint=true, so the description carries the burden of behavioral disclosure. It states that the operation 'changes review state' (explicit mutation) and 'requires approval permission' (auth requirement). It also describes the return behavior: 'GitLab returns the updated result or an error when the request or approval is unavailable.' This is valuable context beyond the schema. It does not detail reversibility or side effects, but for a simple unapprove action, this is adequate. Given the sparse annotations, a 4 is justified.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences: purpose, usage guidance, and behavior. It is front-loaded with the key action and keeps each sentence purposeful. No filler or repetition. While it could be slightly more compact, it is efficient and well-structured. A minor deduction for not being as tight as possible, but overall it is strong, so a 4.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a straightforward tool with two required parameters and no output schema, the description covers the essentials: what it does, when to use it, required permissions, and the nature of the result (updated result or error). It also mentions the effect on review state. There is no missing critical information an agent would need to invoke it correctly. A 4 is fitting given the simplicity of the tool; it could be a 5 if it also mentioned that it only removes the current user's approval (not others'), but that is implied by 'current user's approval' in the text.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already has 100% description coverage: `project_id` is described as 'Project ID or complete URL-encoded path to project' and `merge_request_iid` as 'The IID of the merge request to unapprove.' The tool description does not add any parameter-specific semantics beyond the schema. It mentions the current user's approval in the context, but that relates to the operation, not to a parameter. Since the schema fully documents both required parameters, the baseline of 3 applies without additional value from the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear and specific action: 'Unapprove a merge request.' It uses a precise verb and resource, and immediately distinguishes itself from `merge_merge_request` by explicitly stating that tool is only for merging. This makes it unambiguous which sibling it is not, and the purpose is evident without needing to inspect the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives direct when-to-use guidance: 'Use this to remove the current user's approval from an existing merge request.' It also provides an exclusion: 'use `merge_merge_request` only when you intend to merge.' This distinguishes it from a key sibling. However, it does not mention the alternative `approve_merge_request` (the inverse operation), which could be relevant if the user wants to add approval instead. Since the purpose is already clear from the name, this is a minor gap, so a 4 is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unprotect_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 |
|---|---|---|---|
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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?
The annotations already flag destructiveHint and openWorldHint, and the description adds meaningful context on top: it changes repository security controls, requires permission to manage protected branches, and reports errors for missing branches or policy restrictions. This gives the agent clear expectations beyond the structured metadata.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no wasted words, front-loading the primary action first, then the alternative, then behavioral and error context. Every sentence contributes useful information for selection or invocation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity, full schema coverage, and existing annotations, the description is complete: it covers purpose, alternative usage, permissions, security implications, and error conditions. No output schema exists, but the mention of return error cases helps compensate without over-explaining.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents project_id and branch_name clearly. The description adds context about the operation's purpose but no new parameter-specific semantics beyond what the schema provides. This matches the baseline of 3 for full schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Remove protection from a previously protected branch.' It clearly distinguishes itself from protect_branch by noting that protect_branch changes access levels without removing the rule, so an agent can select the correct sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use this tool: to remove protection from an existing branch, and names the alternative for a different goal: use protect_branch to change access levels without removing the rule. This is direct when/when-not guidance with no inference required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_default_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 |
|---|---|---|---|
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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?
Annotations declare destructiveHint=true and openWorldHint=true, and the description goes beyond them by detailing the collateral effects (clone, MR, CI defaults), permission requirement (project maintainer), and expected return (updated project or validation/permission error). No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with zero filler: the first front-loads the purpose and the second packs usage, effects, permission, and return behavior. Every clause adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive mutation tool, the description covers what it does, how it differs from a sibling, what side effects occur, permission needed, and the return value. No output schema exists, but the return type is explicitly described. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both required parameters. The description adds no new parameter-specific information (e.g., format, constraints), resting on the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Change') and resource ('default branch of a project'), and explicitly differentiates from the sibling `create_branch`, making the tool's purpose unambiguous even without inspecting the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use ('change which branch GitLab treats as the project's default') and when-not-to-use ('use create_branch to create a branch rather than changing project defaults'), naming the alternative directly. It also states the high-level effect (affects clone, MR, CI defaults) and required permission, giving agents full routing context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_draft_noteA
Update an existing draft note. Use this for an existing resource; choose the corresponding create tool for a new resource and a note tool for discussion-only text. It changes remote GitLab state and requires the necessary project or group permission; GitLab returns validation, conflict, permission, or rate-limit errors instead of silently applying an invalid request. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | The content of the draft note | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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?
With only openWorldHint in annotations, the description carries the burden. It discloses that the tool mutates remote GitLab state, requires permissions, and that GitLab returns validation, conflict, permission, or rate-limit errors rather than silently succeeding. This is meaningful behavioral context beyond the sparse annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single paragraph with a clear front-loaded purpose. It is reasonably concise, but includes some redundancy (e.g., referencing pagination fields that don't exist) and could be tightened without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has a complex position object, but the schema thoroughly documents it. The description covers mutation, permissions, and error behavior, which are the key non-schema contexts. It doesn't mention alternatives like publish or delete, but those are different operations. Given the schema's richness, the description is largely complete for calling the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds a note about providing numeric IDs or URL-encoded paths, but that duplicates the schema's own description for project_id. It also references pagination fields, but this tool has none. It does not add semantics for the complex position object beyond what the schema already explains.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear verb and resource: 'Update an existing draft note.' It then explicitly differentiates from the create tool for new resources and from a note tool for discussion-only text, which distinguishes it from sibling tools like create_draft_note and create_note/update_merge_request_note.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use guidance: 'Use this for an existing resource; choose the corresponding create tool for a new resource and a note tool for discussion-only text.' It also notes permission requirements and error behavior, but it doesn't reference other draft-note siblings like publish_draft_note or delete_draft_note. The guidance is clear enough for the primary alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_issueA
Update an issue. Returns a slim confirmation by default; set full_response=true for the complete updated issue object. Use this to change fields on an existing issue; use update_issue_description_patch for a targeted description edit that avoids sending the full body, and use create_issue_note for discussion. The operation mutates issue state, requires issue-edit permission, and returns the updated issue or a validation/permission/conflict error.
| 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) | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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 carry `openWorldHint: true`, so the description carries the full behavioral disclosure burden. It discloses that the operation mutates issue state, requires issue-edit permission, returns the updated issue or validation/permission/conflict errors, and explains the slim vs. full response behavior. This substantially exceeds what annotations alone provide and contains no contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences and front-loads the primary action and response behavior before moving to usage distinctions and side effects. Every sentence earns its place: no filler, no repetition of schema details, and the most decision-relevant information appears first.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and sparse annotations, the description is thorough: it covers mutability, permission requirements, return values, error types, and response-shape options. It also provides enough usage context to route between related tools. Nothing an agent needs to call this correctly and safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 15 parameters. The description adds meaningful semantics for `full_response` by explaining the default slim confirmation and the specific fields it returns, which goes beyond the schema's one-line description. This warrants a 4 rather than a baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Update') and resource ('an issue'), and clearly identifies the tool's scope: changing fields on an existing issue. It also distinguishes itself from sibling tools like `update_issue_description_patch` and `create_issue_note`, so an agent can tell them apart without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use this tool ('change fields on an existing issue') and names two alternatives with their use cases: `update_issue_description_patch` for targeted description edits avoiding full-body sends, and `create_issue_note` for discussion. This gives both positive and negative routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_issue_description_patchA
Apply a patch (search/replace or unified diff) to an issue description. Reduces token usage by allowing small changes without sending the full description. Supports dry_run to preview changes and create_note to summarize updates. Use this for a targeted search/replace or unified-diff change to an issue description; use dry_run before applying an uncertain patch and create_note when an audit summary is wanted. It changes the issue description when not dry-running, requires issue-edit permission, and returns the patch result or a mismatch/validation/permission error.
| 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 | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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?
With only openWorldHint in annotations, the description carries the transparency burden and does well: it discloses the side effect ('changes the issue description when not dry-running'), the permission requirement ('requires issue-edit permission'), and possible outcomes ('patch result or a mismatch/validation/permission error'). This goes well beyond the sparse annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action and is generally efficient. However, the dry_run/create_note functionality is stated twice ('supports dry_run... create_note' and 'use dry_run... create_note'), creating slight redundancy without much added information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description adequately covers the return value ('returns the patch result or ... error') and the key side-effect/permission context. It relies on the thoroughly documented schema for parameter details, which is reasonable at 100% coverage, though a bit more detail on duplicate-match failure for allow_multiple could strengthen it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds mild value by explaining dry_run as 'preview changes' and create_note as 'summarize updates,' and by mapping patch_type to 'search/replace or unified diff,' but it does not substantially extend what the schema already documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'apply a patch ... to an issue description.' It also distinguishes itself from a full-description update by noting it 'reduces token usage by allowing small changes without sending the full description,' which differentiates it from sibling tools like update_issue.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says 'use this for a targeted search/replace or unified-diff change to an issue description' and gives conditional guidance for dry_run and create_note. It does not explicitly name the alternative full-update tool or state 'do not use for full rewrites,' but the targeted-change framing makes the intended use clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_issue_noteA
Modify an existing issue thread note. Use this for an existing resource; choose the corresponding create tool for a new resource and a note tool for discussion-only text. It changes remote GitLab state and requires the necessary project or group permission; GitLab returns validation, conflict, permission, or rate-limit errors instead of silently applying an invalid request. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | The content of the note or reply | |
| note_id | Yes | The ID of a thread note | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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?
With only openWorldHint in annotations, the description takes on the burden of explaining side effects. It clearly states that the tool changes remote GitLab state and requires project or group permission. It also discloses that GitLab returns validation, conflict, permission, or rate-limit errors instead of silently applying invalid requests, which is useful behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is reasonably concise and front-loads the core purpose and usage. However, the final sentence includes generic and partially incorrect guidance about group_id and pagination fields, so not every sentence earns its place. Structurally it is adequate but not tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the action, usage context, permission requirements, and error behavior, which is useful for a mutating tool with minimal annotations. However, with no output schema, it does not mention what a successful response contains or how the updated note is returned. It is complete enough for basic invocation but leaves some uncertainty about the result shape.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all parameters, meaning the description does not need to explain them. The description actually introduces inaccuracies: it mentions group_id and pagination fields, but the schema only includes project_id and no pagination parameters. This could confuse an agent into looking for fields that do not exist, lowering the score below the baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Modify an existing issue thread note.' It also distinguishes this from creating a new resource via the corresponding create tool, which helps separate it from siblings like create_issue_note. However, it does not explicitly name the exact sibling alternative, so it falls short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context: use it for an existing resource, and use a create tool for a new resource. It also explains that the tool changes remote GitLab state and requires appropriate permissions, which helps an agent decide whether this is appropriate. It lacks explicit exclusions for other sibling tools like merge-request note update tools, so it is not a perfect 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_labelA
Update an existing label in a project. Use this for an existing resource; choose the corresponding create tool for a new resource and a note tool for discussion-only text. It changes remote GitLab state and requires the necessary project or group permission; GitLab returns validation, conflict, permission, or rate-limit errors instead of silently applying an invalid request. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.
| Name | Required | Description | Default |
|---|---|---|---|
| color | No | The color of the label given in 6-digit hex notation with leading '#' sign | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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, so the description carries most of the behavioral burden. It clearly discloses that the tool changes remote GitLab state, requires project or group permission, and that GitLab returns validation, conflict, permission, or rate-limit errors instead of silently applying invalid requests. It could add more detail about patch semantics or response content, but it meaningfully surpasses the annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose, then covers usage, behavior, and parameter guidance in a logical order. The final sentence about identifiers and pagination is somewhat boilerplate and slightly inconsistent with the schema, adding minor noise, but overall the description is still appropriately compact.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutating 7-parameter tool with sparse annotations and no output schema, the description covers the essentials: what it does, when to use it, remote state changes, required permissions, and error behavior. It does not describe return values or detailed update semantics, and the group_id/pagination clause is slightly mismatched, but an agent can select and invoke the tool correctly using the description plus the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All 7 parameters have schema descriptions, so the schema already does the heavy lifting. The description's extra guidance about numeric IDs, URL-encoded paths, and using required identifiers is generic rather than parameter-specific, and it mentions group_id and pagination fields not present in the schema. This adds only marginal value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence names a specific operation ('Update an existing label in a project') with a clear verb and resource. It also distinguishes itself from create and note tools by explicitly targeting an existing resource, and sibling tools confirm it is the update counterpart to create_label.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says to use this tool for an existing resource and to choose the corresponding create tool for new resources or a note tool for discussion-only text. This gives an agent clear when-to-use and when-not-to-use guidance relative to alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_merge_requestA
Update a merge request (mergeRequestIid or branchName required). Use this for an existing resource; choose the corresponding create tool for a new resource and a note tool for discussion-only text. It changes remote GitLab state and requires the necessary project or group permission; GitLab returns validation, conflict, permission, or rate-limit errors instead of silently applying an invalid request. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.
| 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 | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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?
Annotations only include openWorldHint, so the description carries the burden. It discloses that the tool changes remote GitLab state, requires project or group permission, and returns validation/conflict/permission/rate-limit errors rather than silently succeeding. This is useful, though it does not mention destructive effects like remove_source_branch or what happens on merged MRs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose and usage distinction, and stays compact. Minor boilerplate like 'use required identifiers and pagination fields exactly as documented' is vague and could be trimmed, but overall it is efficient and well-ordered.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 15-parameter mutation tool with no output schema, the description gives high-level context: mutates remote state, needs permissions, and surfaces error types. However, it omits critical specifics such as valid identifier combinations, the meaning of state_event/remove_source_branch, and does not resolve the misleading required-field statement. The schema carries much of the parameter detail, but the description is not fully complete for safe invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description misleadingly states 'mergeRequestIid or branchName required' while the schema's required list contains only project_id, and 'branchName' does not appear as a parameter. This contradiction undermines guidance. The useful note about project_id/group_id path encoding is outweighed by the incorrect required-field claim.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Update a merge request', a specific verb and resource, and immediately distinguishes this tool from create and note tools. It clearly identifies this as the mutation tool for existing merge requests against siblings like create_merge_request and update_merge_request_note.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells the agent to use the corresponding create tool for new resources and a note tool for discussion-only text, providing clear when-not guidance. It also notes permission requirements and describes error behavior, so the agent knows when this tool is appropriate versus alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_merge_request_discussion_noteA
Update a discussion note on a merge request. Use this for an existing resource; choose the corresponding create tool for a new resource and a note tool for discussion-only text. It changes remote GitLab state and requires the necessary project or group permission; GitLab returns validation, conflict, permission, or rate-limit errors instead of silently applying an invalid request. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | The content of the note or reply | |
| note_id | Yes | The ID of a thread note | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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 include openWorldHint, so the description carries the full behavioral burden. It clearly states that this changes remote GitLab state, requires project/group permission, and surfaces validation, conflict, permission, and rate-limit errors rather than silently succeeding.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured: purpose first, then usage alternatives, then behavioral warnings retries and identifier guidance. It is somewhat longer than necessary and includes a generic 'pagination fields' phrase that does not apply here, but the content is relevant and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter mutation tool without an output schema, the description conveys purpose, usage, side effects, authorization, error handling, and identifier format. It does not describe the success return payload or the exact interaction of body and resolved, but the schema covers parameter semantics and the description is sufficient for correct selection and invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3 and the description adds little beyond the schema. It offers generic advice on numeric IDs or URL-encoded paths and required identifiers, but it also mentions pagination fields that do not exist in this schema and adds no per-parameter meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific action and resource: 'Update a discussion note on a merge request.' It also differentiates from likely siblings by stating that it is for an existing resource, pointing to the corresponding create tool for new resources and a note tool for discussion-only text.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when to use this tool versus create and note tools, and it explains required permissions and error behavior. It also instructs on how to supply project identifiers, covering both context and exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_merge_request_noteA
Modify an existing merge request note. Use this for an existing resource; choose the corresponding create tool for a new resource and a note tool for discussion-only text. It changes remote GitLab state and requires the necessary project or group permission; GitLab returns validation, conflict, permission, or rate-limit errors instead of silently applying an invalid request. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | The content of the note or reply | |
| note_id | Yes | The ID of a thread note | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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 only include openWorldHint, so the description carries the burden. It discloses that the operation modifies remote state, requires permissions, and returns errors (validation, conflict, permission, rate-limit) rather than silently applying invalid requests. This is clear behavioral context, though it could mention idempotency or side effects more explicitly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single coherent paragraph, starts with the primary action, and avoids fluff. It includes necessary context without being overly verbose, though it could be trimmed slightly to improve scannability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutating tool with no output schema, it adequately covers permissions, error handling, and identifier formatting. It does not describe the return value, but that's not required. It is complete enough for an agent to call correctly, with only minor gaps around success behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers 100% of parameters, so baseline is 3. The description adds value by advising to provide numeric IDs or complete URL-encoded paths and to use required identifiers exactly as documented. However, it references 'project_id or group_id' while the schema only includes project_id, a slight inconsistency that reduces the bonus.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Modify an existing merge request note.' It explicitly distinguishes from the create tool ('choose the corresponding create tool for a new resource') and from discussion-only notes, making the purpose unambiguous and differentiated from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance: use for existing resources, create tool for new resources, note tool for discussion-only text. It also specifies permission requirements and error behavior, covering when and how to invoke the tool versus alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_projectA
Update project settings such as description, visibility, default branch, and feature access levels. Use this for an existing resource; choose the corresponding create tool for a new resource and a note tool for discussion-only text. It changes remote GitLab state and requires the necessary project or group permission; GitLab returns validation, conflict, permission, or rate-limit errors instead of silently applying an invalid request. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Project display name | |
| path | No | Project path/slug | |
| topics | No | Project topics | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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?
The description clearly states that it changes remote GitLab state, requires appropriate project or group permissions, and that GitLab returns validation, conflict, permission, or rate-limit errors rather than silently applying invalid requests. This is valuable context beyond the openWorldHint annotation and directly informs the agent of side effects and error handling behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose and usage, but it contains extraneous and potentially confusing details (group_id and pagination fields that do not exist in the schema). It is not as concise or accurate as it could be; each sentence should earn its place, and the last sentence slightly derails the focus.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 24 parameters and no output schema, the description covers purpose, usage, and error behavior, but it incorrectly references group_id and pagination fields, which are not part of the input schema. This inaccuracy could mislead an agent about the tool's actual scope. It also does not clarify that only project_id is required, though that is visible in the schema. Overall it is mostly complete but has notable gaps and a distracting error.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description does not add meaningful parameter semantics beyond the schema; it repeats that project_id can be a numeric ID or URL-encoded path (already documented in schema) and oddly references group_id and pagination fields, which are not present in the schema. This does not genuinely enhance understanding of the parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb ('Update') and resource ('project'), then lists concrete examples of settings (description, visibility, default branch, feature access levels). It also distinguishes itself from create and note tools for new resources and discussion-only text, so an agent can tell it apart from its primary siblings without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says to use it for an existing resource and to choose the corresponding create tool for a new resource and a note tool for discussion-only text. However, it does not mention the more directly overlapping sibling 'update_default_branch' as a specialized alternative for changing just the default branch, leaving that differentiation to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_markdownB
Upload a file for use in markdown content. Use this for the specific operation described; choose a sibling tool when you need a different resource or lifecycle action. It changes remote GitLab state and requires the necessary project or group permission; GitLab returns validation, conflict, permission, or rate-limit errors instead of silently applying an invalid request. When project_id or group_id is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.
| Name | Required | Description | Default |
|---|---|---|---|
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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?
The annotations provide only openWorldHint, so the description carries most of the behavioral burden. The description adds meaningful context: the operation changes remote GitLab state, requires project or group permission, and surfaces validation, conflict, permission, or rate-limit errors rather than silently applying invalid requests. It could go further by explaining what a successful upload returns, but the core mutation and error behavior are clearly disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is reasonably short and front-loads the purpose in the first sentence. The second sentence is largely generic boilerplate about choosing a sibling tool, and the final sentence mixes parameter advice with error behavior, including references to fields not present in the schema. It is not bloated, but contains some filler that does not earn its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple three-parameter tool with two required parameters and no output schema, the description covers the key operational facts: what it does, that it mutates state, that permissions are required, and what kinds of errors can occur. The main gaps are the lack of any description of the return value and the misleading mention of group_id and pagination fields that are absent from the schema, leaving moderate room for agent confusion.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3 even without extra parameter guidance. The description adds some useful emphasis on numeric ID or URL-encoded path handling for project_id, matching the schema. However, it also refers to group_id and pagination fields that do not appear in the input schema, which slightly confuses the otherwise adequate parameter guidance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb and resource: 'Upload a file for use in markdown content.' It is clear enough about the tool's basic job, and the mention of changing remote GitLab state adds useful scope. However, the sibling-tool sentence is generic and does not name any concrete alternative, so it does not meaningfully distinguish this tool from similar file-related tools like create_or_update_file or push_files.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no real when-to-use guidance beyond the boilerplate 'Use this for the specific operation described; choose a sibling tool when you need a different resource or lifecycle action.' This does not tell an agent when this tool is preferred, when to avoid it, or which sibling should be chosen instead. The instruction is essentially a restatement of the obvious and provides no actionable decision support.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_ci_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 | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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 declare readOnlyHint=true, and the description reinforces this consistently. It adds genuine value beyond annotations by disclosing error behavior: 'missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors.' This is exactly the kind of failure-mode context an agent needs and that structured fields don't provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured: purpose first, then usage guidance, then behavioral details. Three sentences carry real information with minimal waste. Small deductions for the redundant restatement of the read-only annotation and the stray `group_id` reference, but overall tight and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description bears the burden of explaining what the agent should expect back, yet it never describes the lint response format (valid/invalid indicators, errors, warnings, jobs). It also fails to differentiate from the near-twin sibling `validate_project_ci_lint`. Coverage of usage timing, safety, and error modes is solid, so the tool is usable, but these gaps keep it at adequate rather than complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds little beyond the schema: the guidance to 'provide the numeric ID or complete URL-encoded path' merely restates the schema's own 'Project ID or URL-encoded path' description. The mention of `group_id` is actually confusing since no such parameter exists in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence states a specific verb and resource: 'Validate provided GitLab CI/CD YAML content for a project.' It also implicitly distinguishes itself from mutation tools via the 'without applying it' framing. However, sibling `validate_project_ci_lint` exists and the description never differentiates this tool from that near-twin, so an agent cannot tell which lint validator to pick.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use this to check configuration without applying it; choose a create or update tool only after validation succeeds' provides explicit workflow sequencing and a clear when-to-use directive. It stops short of naming specific alternative tools or stating when NOT to use this tool in favor of `validate_project_ci_lint`, leaving that sibling distinction unaddressed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_project_ci_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 | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| 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?
Annotations already declare readOnlyHint=true and openWorldHint=true, and the description reinforces that it is read-only and does not mutate GitLab data. It adds useful behavioral context by disclosing that missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors, which goes beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is reasonably concise and front-loaded with the core purpose. It includes necessary usage guidance and behavioral notes without excessive verbosity. The sentence about identifiers and pagination is slightly generic but still earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only validation tool with full schema coverage and annotations declaring safety, the description covers the essential context: what it does, when to use it, and what errors to expect. It does not describe the return format, but no output schema exists and the tool's purpose is straightforward validation, so this is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all six parameters. The description adds general guidance about providing numeric IDs or URL-encoded paths and using required identifiers and pagination fields exactly as documented, but it does not add specific meaning beyond the schema for individual parameters. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Validate') and resource ('.gitlab-ci.yml configuration for a project'), and distinguishes it from the sibling 'validate_ci_lint' by specifying it operates on an existing project configuration. It clearly conveys the tool's purpose and scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says to use this tool to check configuration without applying it, and to choose a create or update tool only after validation succeeds. It also provides guidance on identifiers and pagination fields, giving clear context for when and how to use the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_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 | |
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. | |
| parent_id | No | Parent namespace ID; required to correctly resolve paths in nested namespaces where the same path may exist under different parents |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so the read-only safety profile is covered. The description adds the nested-parent resolution behavior, but it does not disclose what the tool returns or how it behaves when the path does not exist.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no filler. The core purpose is front-loaded and the parent_id guidance is relevant, necessary context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple existence check with complete schema coverage and read-only annotations, the description covers the essential edge case. It could be more explicit about the return format, but 'verify if exists' sufficiently implies the intended behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all parameters are already documented. The description mostly restates the parent_id rationale already provided in the schema rather than adding genuinely new semantic meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the action and resource: 'Verify if a namespace path exists.' It also adds meaningful context about parent_id scoping. It does not explicitly distinguish this tool from sibling namespace tools like get_namespace or list_namespaces, but the verification purpose is clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives useful guidance on when parent_id is required, specifically for nested namespaces where the same path can exist under different parents. However, it does not explain when to choose this tool over alternatives or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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 |
|---|---|---|---|
| jmespath | No | Optional JMESPath expression filtering the JSON result before return. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true Fowler, so the read-only nature is covered. The description adds value by stating that the operation returns 'the current user profile' and that missing credentials or permission failures surface as errors. This gives the agent insight into failure behavior beyond the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded, with the primary purpose first, followed by alternative tool guidance and one behavioral qualifier. Minor redundancy exists between 'Get current authenticated user details' and 'returns the current user profile', but overall it is efficient and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple, zero-required-parameter tool with a fully documented optional parameter Scott, the description covers purpose, scope, alternative tools, and error behavior. No output schema exists, but the description sufficiently indicates what the call returns and what can go wrong, so nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single `jmespath` parameter is fully described by the schema with 100% coverage, and the description does not add any parameter-specific details. Per the baseline rule, a score of 3 is appropriate when the schema already handles parameter documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Get current authenticated user details' with a specific verb and resource, and explicitly differentiates from `get_user` and `get_users` by scoping this tool to the authenticated user. An agent can immediately tell this apart from sibling lookup tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use this tool ('identify the authenticated GitLab user') and when to use alternatives ('use `get_user` or `get_users` when looking up another user'). This is clear, actionable guidance that covers both selection and exclusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
118 tool updates
v2.1.66- Changed
approve_merge_request1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
bulk_publish_draft_notes1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
create_branch1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
create_commit_status1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
create_draft_note1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
create_group1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
create_issue1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
create_issue_emoji_reaction1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
create_issue_link1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
create_issue_note1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
create_issue_note_emoji_reaction1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
create_label1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
create_merge_request1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
create_merge_request_discussion_note1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
create_merge_request_emoji_reaction1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
create_merge_request_note1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
create_merge_request_note_emoji_reaction1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
create_merge_request_thread1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
create_note1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
create_or_update_file1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
create_repository1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
delete_branch1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
delete_draft_note1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
delete_issue1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
delete_issue_emoji_reaction1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
delete_issue_link1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
delete_issue_note_emoji_reaction1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
delete_label1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
delete_merge_request_discussion_note1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
delete_merge_request_emoji_reaction1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
delete_merge_request_note1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
delete_merge_request_note_emoji_reaction1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
discover_tools1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
download_attachment1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
fork_repository1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
get_branch1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
get_branch_diffs1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
get_ci_catalog_resource1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
get_commit1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
get_commit_diff1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
get_draft_note1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
get_file_blame1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
get_file_contents1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
get_issue1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
get_issue_link1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
get_label1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
get_merge_request1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
get_merge_request_approval_state1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
get_merge_request_conflicts1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
get_merge_request_diffs1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
get_merge_request_discussion1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
get_merge_request_file_diff1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
get_merge_request_note1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
get_merge_request_notes1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
get_merge_request_version1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
get_namespace1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
get_project1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
get_project_events1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
get_protected_branch1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
get_repository_tree1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
get_user1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
get_users1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
health_check1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
list_branches1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
list_ci_catalog_resources1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
list_commit_statuses1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
list_commits1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
list_draft_notes1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
list_events1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
list_group_iterations1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
list_group_members1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
list_group_merge_requests1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
list_group_projects1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
list_issue_discussions1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
list_issue_emoji_reactions1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
list_issue_links1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
list_issue_note_emoji_reactions1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
list_issues1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
list_labels1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
list_merge_request_changed_files1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
list_merge_request_diffs1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
list_merge_request_emoji_reactions1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
list_merge_request_note_emoji_reactions1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
list_merge_request_pipelines1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
list_merge_request_versions1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
list_merge_requests1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
list_namespaces1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
list_project_members1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
list_projects1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
list_protected_branches1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
list_todos1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
mark_all_todos_done1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
mark_todo_done1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
merge_merge_request1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
mr_discussions1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
my_issues1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
protect_branch1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
publish_draft_note1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
push_files1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
resolve_merge_request_thread1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
search_repositories1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
unapprove_merge_request1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
unprotect_branch1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
update_default_branch1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
update_draft_note1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
update_issue1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
update_issue_description_patch1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
update_issue_note1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
update_label1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
update_merge_request1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
update_merge_request_discussion_note1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
update_merge_request_note1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
update_project1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
upload_markdown1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
validate_ci_lint1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
validate_project_ci_lint1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
verify_namespace1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
- Changed
whoami1 field changed- added
Input schema / properties / jmespathAdded value: +{ + "description": "Optional JMESPath expression filtering the JSON result before return.", + "type": "string" +}
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" +}
TDQS
Scored across 118 tools
The tool descriptions explicitly differentiate similar operations (e.g., get_merge_request_note vs. get_merge_request_notes vs. mr_discussions, and create_note vs. create_issue_note). While the sheer volume of tools creates some potential confusion, each description clearly states when to use it and which sibling tool to prefer. A few pairs like validate_ci_lint and validate_project_ci_lint are close but still distinguishable.
The vast majority follow a consistent verb_noun pattern (e.g., create_issue, update_issue, list_issues, get_issue). There are minor deviations like mr_discussions, whoami, health_check, and discover_tools, but these are understandable abbreviations or standalone names. No mixing of naming conventions is observed.
With 118 tools, this server is far beyond the typical scope and even the 'extreme mismatch' threshold of 50+ tools. While the toolset covers many GitLab features, the sheer count makes it heavy for an agent to navigate and likely overwhelms the model's context. The high number suggests insufficient consolidation of related operations.
The server provides comprehensive coverage across projects, issues, merge requests, branches, files, CI/CD, labels, users, and more, including full CRUD and lifecycle operations. It even includes edge cases like draft notes, emoji reactions, and CI validation. No obvious dead ends or missing core operations were identified for the domain.
Maintenance
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.2346 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.646 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.241MIT
- AlicenseNot gradedqualityAmaintenanceMCP server for interacting with GitLab API, supporting dynamic tool selection and enterprise-grade security.10MIT