GitLab MCP Server
GitLab MCP Server lets AI clients search, read, review, and manage GitLab projects, issues, merge requests, CI, todos, and activity via MCP over stdio or Streamable HTTP.
Search and inspect projects, groups, users, issues, merge requests, labels, notes, milestones, iterations, work items, group members, broadcast messages, and repository files.
Review merge requests with context bundles, diffs, commits, pipelines, jobs, reviewers/approvals, notes, and time tracking.
Create, update, and delete issues/notes; create/update merge requests; retry/cancel pipelines; manage todos; and administer broadcast messages where permissions allow.
Summarize user or group activity and surface review bottlenecks with analytics tools.
Run custom GraphQL queries and arbitrary REST read/write escape-hatch calls for uncovered endpoints.
Use per-request user credentials or configured fallback tokens, with read-only and write-gated operations.
Provides comprehensive GitLab integration with search across projects, issues, merge requests, users, and groups; code exploration and file browsing; issue and merge request management (create, update); and support for custom GraphQL queries with automatic schema discovery. Supports both GitLab.com and self-hosted instances.
Enables execution of custom GraphQL queries against GitLab's API with automatic schema introspection and discovery of available operations.
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 MCP Serversearch for open issues in the 'web-app' project"
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
A community Model Context Protocol server that lets AI clients search GitLab, read repositories, review merge requests, manage issues, and summarize team activity. Supports GitLab.com and self-managed GitLab through stdio and Streamable HTTP.
This project is independent of GitLab Inc. It does not require GitLab Duo. Individual tools remain subject to your GitLab version, tier, enabled features, token scopes, and role.
Start locally
Requires Node.js 22 or later. CI covers Node.js 22 and 24; the container uses Node.js 24.
Create a GitLab personal access token with
read_apifor reads orapifor reads and writes. The token can only access resources its owner is allowed to use.Add this server to your client's MCP configuration. Replace the token locally; keep the resulting file out of version control.
{
"mcpServers": {
"gitlab": {
"command": "npx",
"args": ["-y", "@ttpears/gitlab-mcp-server@4.0.0"],
"env": {
"GITLAB_URL": "https://gitlab.com",
"GITLAB_READ_TOKEN": "glpat-replace-locally"
}
}
}
}Restart or reconnect the client. Ask it to call
get_current_user, thensearch_projectswith{"searchTerm":"your-project","first":5}.
For writes, replace GITLAB_READ_TOKEN with GITLAB_TOKEN and use an api-scoped token. Setting both variables is a startup error. Stdio is the default; it communicates over stdin/stdout and does not open a listening port.
Related MCP server: GitLab MR MCP
Choose a setup
Use case | Setup |
Claude Code, Claude Desktop, VS Code, or another local client | |
Claude Desktop bundle | Download |
LibreChat with each user's PAT | |
Shared remote server with GitLab sign-in | |
Docker or a reverse proxy | |
Existing installation |
For a local HTTP smoke test without a shared token:
docker run --rm --name gitlab-mcp \
-p 127.0.0.1:8008:8008 \
-e GITLAB_URL=https://gitlab.com \
ghcr.io/ttpears/gitlab-mcp:4.0.0Connect an MCP client to http://localhost:8008/ and send Authorization: Bearer <your-GitLab-PAT> on every request. curl http://localhost:8008/health checks liveness. The published image currently targets Linux amd64. Configure HTTPS and user authentication before remote use; see the deployment guide.
What you can do
The server exposes 69 tools and 8 workflow prompts. The tool reference lists every tool, its input parameters, defaults, and write classification.
Task | Start with |
Find projects, groups, users, issues, or merge requests |
|
Identify a path and inspect code |
|
Review a change and its CI results |
|
Triage and update work |
|
Work with planning and notifications |
|
Summarize activity and review delays |
|
Manage group achievements |
|
Discover instance-specific API capabilities |
|
Try: “Find open bugs assigned to me,” “Review MR !42 in group/project,” or “Summarize this group's activity since Monday.” See workflows and pagination for exact tool-call examples and prompt names.
Read before sharing a server
GITLAB_TOKENis a fallback for reads and writes.GITLAB_READ_TOKENis a fallback for reads only. A shared fallback exposes that account's accessible data to callers using it.With neither fallback set, each operation needs user credentials through an HTTP PAT, OAuth, or
userCredentials.Host pinning, finite resource limits, and restrictions on custom GraphQL/REST tools are enabled by default. Tool annotations are client hints; GitLab permissions and the server's credential checks enforce access.
fetchAll: truefetches up tofirstitems. For complete results, keep following each connection'spageInfo.endCursorwhilehasNextPageis true.
See authentication and security for credential precedence, OAuth consent, encrypted Redis storage, and access boundaries.
Documentation
Field notes: Two session bugs that broke my GitLab MCP server.
Licensed under MIT.
Available Tools
69 toolsanalytics_group_summaryGroup Activity SummaryARead-onlyIdempotent
Aggregated activity summary for an entire group (optionally including subgroups) over a time window — totals by action type (pushes, MRs opened/merged, comments, approvals), with breakdowns by project, by contributor, and by day. Use this to answer "what did this team do" without fanning out across list_project_events yourself.
| Name | Required | Description | Default |
|---|---|---|---|
| group | Yes | Group full path (e.g. "my-group" or "my-group/sub-group") | |
| since | Yes | ISO date/datetime, inclusive lower bound (e.g. "2026-04-01" or "2026-04-01T00:00:00Z") | |
| until | No | ISO date/datetime, inclusive upper bound. Defaults to now. | |
| maxEvents | No | Global cap on events fetched across all projects. Defaults to 2000; envelope flags truncated:true if reached. | |
| maxProjects | No | Cap on projects scanned. Defaults to 500. | |
| topContributors | No | Cap on the byUser[] list (sorted by event count desc). Default 10. | |
| userCredentials | No | Your GitLab credentials (optional — falls back to the configured env token if not provided) | |
| includeSubgroups | No | Recurse into subgroup projects. Defaults to true. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive, so safety is covered. The description adds the substantive behavioral context that this is a pre-aggregated, fan-out-replacing call rather than a raw listing. It does not discuss cost/latency or permission scope for the group, and truncation behavior is left entirely to 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?
Two sentences, front-loaded with the scope and output shape, and the closing sentence converts that into a usage decision. No filler or repetition of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 eight parameters but full schema documentation and no output schema, the main risk is an unknown return shape, and the description fully enumerates it (totals by action type, breakdowns by project, contributor, day). An agent has enough to call this correctly without further reading.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter including maxEvents truncation semantics, maxProjects, topContributors, and includeSubgroups is already documented. The description only loosely echoes two of them ("optionally including subgroups", "by contributor"), adding no format or default detail beyond 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?
States a specific verb and resource (aggregated activity summary for a group), its scope (whole group, optionally subgroups, over a time window), and exactly what is produced (totals by action type plus breakdowns by project, contributor, and day). This clearly separates it from analytics_user_summary and from the raw event listings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 frames the use case ("answer 'what did this team do'") and names the alternative it replaces (fanning out across list_project_events). It does not mention when to prefer analytics_user_summary for a single person or when to drop to list_project_events for raw detail, so sibling routing is only partially covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analytics_review_bottlenecksReview BottlenecksARead-onlyIdempotent
Aggregate open (non-draft) merge requests across a group or project to surface review bottlenecks. Returns per-reviewer queue stats, age-bucket histogram, and the stalest MRs by updatedAt. MRs with no reviewer assigned are bucketed under "(unassigned)".
| Name | Required | Description | Default |
|---|---|---|---|
| group | No | Group full path (e.g. "my-group"). Mutually exclusive with `project`. | |
| maxMRs | No | Hard cap on MRs scanned. Envelope flags `truncated:true` if reached. | |
| project | No | Project full path (e.g. "my-group/my-project"). Mutually exclusive with `group`. | |
| topStalest | No | Cap on the stalest[] list. Default 20. | |
| staleAfterDays | No | An MR counts as "stale" if its updatedAt is older than this many days. Default 3. | |
| userCredentials | No | Your GitLab credentials (optional — falls back to the configured env token if not provided) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral detail beyond annotations: it only considers open non-draft MRs, returns per-reviewer queues, an age histogram, stalest MRs by updatedAt, and buckets unassigned MRs under '(unassigned)'.
Agents need to know what a tool does to the world 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 tight sentences with no filler. The core action and output shape are front-loaded before the unassigned-bucket detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, but the description adequately explains the return shape: per-reviewer queue stats, age-bucket histogram, and stalest MRs. It does not clarify the behavior if neither group nor project is supplied, despite zero required parameters, which is a minor remaining 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 all six parameters are already documented in the input schema. The description mentions group/project aggregation and the stalest output, but does not add parameter-level meaning beyond the schema's own mutual-exclusivity, defaults, and truncation notes.
Input schemas describe structure but not intent. Descriptions should explain non-obvious 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: aggregate open (non-draft) merge requests across a group or project to surface review bottlenecks. It also names the exact output categories, making it clearly distinguishable from simple MR-listing siblings like get_merge_requests.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 phrase 'to surface review bottlenecks' gives clear context for when to use this tool rather than raw MR retrieval. However, it does not explicitly exclude alternatives or name sibling analytics tools such as analytics_user_summary or analytics_group_summary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analytics_user_summaryUser Activity SummaryARead-onlyIdempotent
Aggregated activity summary for a user over a time window — totals by action type (pushes, MRs opened/merged, comments, approvals), breakdown by project and by day. Use this instead of list_user_events when you want counts rather than a raw event feed.
| Name | Required | Description | Default |
|---|---|---|---|
| user | Yes | Username (e.g. "alice") or numeric user ID | |
| since | Yes | ISO date/datetime, inclusive lower bound (e.g. "2026-03-01" or "2026-03-01T00:00:00Z") | |
| until | No | ISO date/datetime, inclusive upper bound. Defaults to now. | |
| maxEvents | No | Cap on events fetched. Defaults to 2000; returned envelope has truncated:true if reached. | |
| userCredentials | No | Your GitLab credentials (optional — falls back to the configured env token if not provided) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so the safety profile is covered. The description adds genuine value beyond that by disclosing the shape of the result (totals by action type plus project and day breakdowns), which is not derivable from the annotations. It stops short of covering truncation behavior or auth fallback, though both are documented in 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?
Two sentences, both earning their place: the first defines the output, the second routes against the sibling. The scoping information is front-loaded and there is 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?
With no output schema, the description usefully sketches the return content (action-type totals, project and day breakdowns), which is the main thing an agent needs to know before calling. It is slightly incomplete on result-envelope details such as truncation, but that is disclosed via the maxEvents schema entry.
Complex tools with many parameters or behaviors need more documentation. Simple 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 user, since, until, maxEvents and userCredentials are all fully documented in the schema, including defaults and the truncation flag. The description adds no parameter-level detail (e.g. the time-window semantics of since/until or the maxEvents cap), so this sits at the baseline where the schema does the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('Aggregated activity summary for a user over a time window') and enumerates exactly what is aggregated: totals by action type, breakdown by project and by day. It also explicitly separates itself from the raw-event sibling list_user_events, so an agent can pick it without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit routing rule: 'Use this instead of list_user_events when you want counts rather than a raw event feed.' Both the alternative and the condition that selects it are stated, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
award_achievementAward AchievementA
Award an achievement to a GitLab username. Multiple awards to the same user are allowed. Requires group Maintainer/Owner. GitLab notifies the recipient, who may need to accept before it appears on their profile.
| Name | Required | Description | Default |
|---|---|---|---|
| username | Yes | ||
| awardMessage | No | Optional award message, supported on instances exposing this mutation field. | |
| achievementId | Yes | Numeric achievement ID or gid://gitlab/Achievements::Achievement/<id>. | |
| userCredentials | No | Your GitLab credentials (optional — falls back to the configured env token if not provided) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the non-read-only, non-idempotent, non-destructive profile; the description adds genuinely new behavior: the notification side effect and that the recipient may need to accept before it appears on their profile. It does not describe failure modes or rate limits, but it generously extends the annotation profile.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, each front-loaded with a distinct fact: action, permission gate, duplicate behavior, notification consequence. 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 mutation tool with no output schema, the description gives the permission gate, idempotency-friendly duplicate note, and the recipient acceptance flow. It could mention what a successful award returns or error conditions, but the key decision inputs are covered.
Complex tools with many parameters or behaviors need more documentation. Simple 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 75%, and the schema already documents achievementId formats and userCredentials fallback behavior. The description adds no parameter-level detail beyond naming the username target, so the baseline 3 for schema-heavy coverage 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 ('Award an achievement to a GitLab username'), which the agent can immediately distinguish from sibling tools like revoke_achievement and create_achievement. The target entity (username) is 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 states the prerequisite permission (group Maintainer/Owner) and clarifies that repeated awards to the same user are permitted, which is exactly the kind of edge case an agent needs. It stops short of explicitly naming when to prefer revoke_achievement or create_achievement, so no explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browse_repositoryBrowse RepositoryBRead-onlyIdempotent
Browse repository files and folders - essential for exploring codebase structure
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | Git reference (branch, tag, or commit SHA) | HEAD |
| path | No | Directory path to browse (empty for root) | |
| projectPath | Yes | Full path of the project (e.g., "group/project-name") | |
| userCredentials | No | Your GitLab credentials (optional — falls back to the configured env token if not provided) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so safety is covered. The description adds nothing beyond that: no disclosure of whether the listing is recursive or one level, whether it is paginated or capped, or how the credential fallback behaves — all behaviorally relevant for a browse call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short, front-loaded sentence with no redundancy — the resource and purpose come first. The trailing 'essential for' framing is mild filler and the brevity borders on under-specification rather than tight completeness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 annotations covering the safety profile and the schema fully documented, the minimum is met. However, for a browse tool with no output schema, the description omits the shape of the result (file/folder entries) and depth/pagination behavior, which an agent needs to use the output 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%; all four parameters (projectPath, path, ref, userCredentials) are documented in the schema, so the baseline is 3. The description adds no semantics beyond that, such as default root behavior or ref handling, so it cannot push higher.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Browse repository files and folders') and adds the intent ('exploring codebase structure'), so an agent knows it is a structural listing operation. It never distinguishes itself from siblings like get_file_content or resolve_path, which are natural alternatives for related tasks.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 phrase 'essential for exploring codebase structure' implies the usage context but gives no explicit when-to-use rules. It does not say when to prefer this over get_file_content (for reading a file) or resolve_path (for locating a path), leaving routing to the agent's inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_achievementCreate AchievementA
Create a group achievement with name and optional description. Requires group Maintainer/Owner and enabled Achievements. Set avatars in GitLab UI; file uploads are not supported by this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| group | Yes | Group full path, for example my-group/sub-group. | |
| description | No | ||
| userCredentials | No | Your GitLab credentials (optional — falls back to the configured env token if not provided) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the non-read-only, non-idempotent, non-destructive profile, so the description only needs to add context — and it does: permission level required, the feature-flag gate ('enabled Achievements'), and the limitation that avatars must be set in the UI. It does not describe failure behavior when the feature is disabled or whether the name must be unique.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, zero filler, with the capability stated first and the constraints (permissions, feature gate, avatar limitation) trailing in priority order.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 annotations present and no output schema, the definition covers prerequisites and the main capability gap agents would hit (no file upload). It omits any mention of what the create call returns or whether the achievement name must be unique within the group.
Complex tools with many parameters or behaviors need more documentation. Simple 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 50%: group and userCredentials carry schema descriptions, while name and description do not. The description only restates 'name and optional description' with no added format, length, or constraint detail, so it does not fully compensate for the undocumented params.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb ('Create') plus resource ('group achievement') with the fields it accepts ('name and optional description'). It is clearly distinguishable from sibling mutations such as update_achievement, award_achievement, and revoke_achievement without opening any 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?
Gives concrete prerequisites ('Requires group Maintainer/Owner and enabled Achievements') and one explicit exclusion ('file uploads are not supported by this tool'). It does not, however, explicitly route to or away from siblings like award_achievement or update_achievement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_broadcast_messageCreate Broadcast MessageA
Create a GitLab broadcast message. Requires administrator privileges on the GitLab instance.
| Name | Required | Description | Default |
|---|---|---|---|
| font | No | Foreground (font) color in hex format | |
| color | No | Background color in hex format, e.g. "#E75E40" | |
| theme | No | Theme name (GitLab 16.9+), e.g. "indigo", "red" | |
| ends_at | No | ISO 8601 timestamp when the message ends | |
| message | Yes | Message text to display | |
| starts_at | No | ISO 8601 timestamp when the message starts | |
| dismissable | No | Whether users can dismiss the broadcast message | |
| target_path | No | Path glob for pages where the message should appear | |
| broadcast_type | No | Broadcast type: "banner" or "notification" | |
| userCredentials | No | Your GitLab credentials (optional — falls back to the configured env token if not provided) | |
| target_access_levels | No | Access levels to target: 10=Guest, 20=Reporter, 30=Developer, 40=Maintainer, 50=Owner |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-readonly, non-idempotent, non-destructive write, so the mutation profile is covered structurally. The description adds the meaningful extra context that administrator privileges are required, but says nothing about what is returned on success (e.g., an ID needed for later update/delete) or any failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with zero filler; the action is front-loaded and the prerequisite follows immediately. Nothing in the description is redundant or padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-parameter creation tool with no output schema, the description is thin: it does not mention the scheduling window, page targeting, or credential fallback behavior, all of which materially shape a correct call. It is adequate because the schema is fully documented, but it leaves the agent to infer how the optional parameters interact.
Complex tools with many parameters or behaviors need more documentation. Simple 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%, including enum values for broadcast_type and access-level meanings, so the schema carries parameter semantics fully. The description adds no parameter-level information beyond what is already documented, which is the expected baseline when coverage is complete.
Input schemas describe structure but not intent. Descriptions should explain 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 ("Create a GitLab broadcast message"), which cleanly separates it from siblings like update_broadcast_message, delete_broadcast_message, and list_broadcast_messages. It does not explicitly name those alternatives, but the create/broadcast pairing 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 admin-privilege prerequisite is stated, which is genuinely useful before an agent attempts the call. However, there is no guidance on when to create vs. update an existing message, or on how scheduling (starts_at/ends_at) affects whether a new message is the right choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_issueCreate IssueA
Create a new issue in a GitLab project (requires user authentication with write permissions)
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Title of the issue | |
| description | No | Description of the issue | |
| projectPath | Yes | Full path of the project (e.g., "group/project-name") | |
| userCredentials | No | Your GitLab credentials (optional — falls back to the configured env token if not provided) |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| iid | Yes | |
| title | Yes | |
| webUrl | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false, and destructiveHint=false. The description adds genuine value by disclosing the write-permission/auth requirement, but it does not explain what happens on duplicate titles, how failures surface, or that the operation is non-idempotent — context the agent must infer.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the action is stated first and the prerequisite follows. It is efficient, though so terse that it forgoes the chance to add routing or behavioral detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and annotations cover the safety profile for a non-destructive mutation. Combined with the auth note, what remains missing (permission failure modes, non-idempotency implications) is minor for a straightforward create 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%, including the projectPath format example and the userCredentials env-token fallback, so the schema carries the parameter burden. The description only implies that a project and title are needed and adds no format or constraint detail beyond the schema — 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?
States a specific verb and resource ('Create a new issue in a GitLab project') that clearly separates it from siblings like get_issues, update_issue, and delete_issue. It does not explicitly name or contrast against any sibling, but the verb+resource pairing 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 parenthetical prerequisite ('requires user authentication with write permissions') gives useful context for when the call will succeed, but there is no explicit guidance on when to use this versus update_issue or create_note, nor any exclusions. Usage is implied rather than spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_merge_requestCreate Merge RequestB
Create a new merge request in a GitLab project (requires user authentication with write permissions)
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Title of the merge request | |
| description | No | Description of the merge request | |
| projectPath | Yes | Full path of the project (e.g., "group/project-name") | |
| sourceBranch | Yes | Source branch name | |
| targetBranch | Yes | Target branch name | |
| userCredentials | No | Your GitLab credentials (optional — falls back to the configured env token if not provided) |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| iid | Yes | |
| title | Yes | |
| webUrl | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false, and destructiveHint=false, so the safety profile is covered. The description adds the auth/permission requirement, which is genuinely useful context, but says nothing about what a repeat call does, what happens when the source branch is missing, or whether the MR is created as draft.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with the auth caveat attached — zero waste and nothing buried. It is, however, thin enough that conciseness shades into under-specification rather than crispness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 an output schema present and full parameter coverage, the description needn't explain returns or fields. But for a mutating create tool, it leaves unaddressed obvious agent questions — duplicate-MR behavior, branch-missing failure, and draft support — so it is only minimally 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% and every parameter carries its own description, including the userCredentials env-token fallback, so the schema carries the burden. The description adds no meaning beyond that, which is the expected baseline-3 outcome at 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?
States a specific verb+resource ("Create a new merge request in a GitLab project"), which is unambiguous and clearly the write counterpart to update_merge_request. It does not explicitly differentiate itself from sibling write paths like execute_rest_write or the update variant, keeping it short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The parenthetical "requires user authentication with write permissions" gives a real precondition for use, but there is no guidance on when to pick this tool versus update_merge_request or a generic REST write, and no exclusions. Usage is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_noteCreate NoteB
Add a comment/note to an issue or merge request (requires user authentication)
| Name | Required | Description | Default |
|---|---|---|---|
| iid | Yes | Issue or merge request IID | |
| body | Yes | Note body (supports Markdown) | |
| internal | No | Whether the note is internal/confidential (only visible to project members) | |
| projectPath | Yes | Full path of the project (e.g., "group/project-name") | |
| noteableType | Yes | Type of item to add a note to | |
| userCredentials | No | Your GitLab credentials (optional — falls back to the configured env token if not provided) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this as a non-read-only, non-idempotent, non-destructive write, and the description adds the authentication requirement, which is valuable. It does not flag the practical consequence of non-idempotency (calling twice creates duplicate notes) or what happens on failure, which for a create tool would be genuinely useful.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler and the auth caveat immediately adjacent to the action. It is efficient, though the terseness leaves little room for the usage distinctions an agent would benefit from.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter write tool with full schema coverage and no output schema, the description covers what the tool does and that auth is needed. It omits what the tool returns (note ID? body?) and the duplicate/retry behavior implied by non-idempotency, which leaves a moderate 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%, including the notable 'internal/confidential' visibility semantics and the noteableType enum, so the schema carries the parameter burden. The description adds only the issue/MR targeting hint, which the schema already states, so 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 states a specific verb ('Add') and resource ('comment/note') plus the two target types (issue or merge request), which is enough to separate it from create_issue, create_merge_request and get_notes. It does not explicitly distinguish itself from update_note, but the 'add' framing makes the difference readable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 adds a real prerequisite ('requires user authentication'), which is useful context for an agent. However there is no when-to-use guidance relative to siblings like update_note or delete_note, and no note on how to choose between issue and merge_request targets beyond the enum in the schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_achievementDelete AchievementADestructiveIdempotent
Delete a group achievement and every related awarded or revoked instance. Destructive; requires group Maintainer/Owner.
| Name | Required | Description | Default |
|---|---|---|---|
| achievementId | Yes | Numeric achievement ID or gid://gitlab/Achievements::Achievement/<id>. | |
| userCredentials | No | Your GitLab credentials (optional — falls back to the configured env token if not provided) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, readOnlyHint=false, and idempotentHint=true, so the safety profile is covered. The description adds meaningful context beyond that: deletion cascades to all awarded and revoked instances and requires Maintainer/Owner permissions. It could further clarify irreversibility or response behavior, but the key behavioral risk is 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?
Two compact sentences with no waste. The destructive scope is front-loaded, followed by the permission requirement, making the most important facts immediately visible.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 destructive delete tool with full schema coverage and explicit annotations, the description covers the essential cascade and authorization details. It does not describe the return value, but with no output schema this is a minor gap rather than a blocking 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%, and the schema already explains that achievementId accepts a numeric ID or GitLab GID and that userCredentials falls back to the environment token. The description adds no parameter-specific detail, 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?
States a specific verb (delete) and resource (group achievement), and adds scope detail: every related awarded or revoked instance. This clearly distinguishes it from sibling tools such as create_achievement, update_achievement, award_achievement, and revoke_achievement.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear operational context by declaring the action destructive and requiring group Maintainer/Owner permissions. It does not explicitly say when to use revoke_achievement instead of deleting the whole achievement, but the scope difference is strongly implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_broadcast_messageDelete Broadcast MessageADestructiveIdempotent
Delete a GitLab broadcast message by ID. Requires administrator privileges.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Broadcast message ID | |
| userCredentials | No | Your GitLab credentials (optional — falls back to the configured env token if not provided) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true and readOnlyHint=false, so the safety profile is structured. The description adds the admin-requirement context, which the annotations do not carry, but says nothing about irreversibility, confirm-deletion behavior, or error responses.
Agents need to know what a tool does to the 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 short sentences, zero waste, with the resource and identifier front-loaded and the privilege constraint second. Nothing here could be trimmed 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?
For a single-entity delete with a fully described two-parameter schema, explicit destructive/idempotent annotations, and no output schema, the description covers what an agent needs to call it. Only the failure/missing-record behavior is unstated, which 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 coverage is 100%: both the integer `id` and the optional `userCredentials` fallback are fully documented in the schema. The description's "by ID" restates the schema and adds no format or behavioral detail beyond it, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ("Delete a GitLab broadcast message") plus the lookup key ("by ID"), which separates it from get_broadcast_message and list_broadcast_messages. It does not explicitly route to update_broadcast_message or list_broadcast_messages, but the operation 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 admin privilege line implies a precondition for calling it, but the description never states when to use it versus alternatives (e.g., update to hide a message instead of deleting it) or what happens when the ID does not exist. Usage is only implied from the verb.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_issueDelete IssueADestructiveIdempotent
Delete a GitLab issue. Requires a user token with permission to delete issues in the project (typically the issue author or a maintainer).
| Name | Required | Description | Default |
|---|---|---|---|
| iid | Yes | Issue IID (the number shown in the GitLab UI, e.g. "42") | |
| projectPath | Yes | Full path of the project (e.g., "group/project-name") | |
| userCredentials | No | Your GitLab credentials (optional — falls back to the configured env token if not provided) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false, so the safety profile is covered. The description earns credit for adding context the annotations lack: the authorization model (issue author or maintainer, user token). It stops short of stating that deletion is permanent or what happens to attached notes and todos.
Agents need to know what a tool does to the 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 short sentences with zero waste; the action comes first and the permission constraint follows immediately. Nothing is redundant with the name or title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 destructive tool with full schema coverage and rich annotations, the definition covers purpose and authorization adequately. The remaining gap is minor: it never says the deletion is permanent and unrecoverable, which an agent weighing the call would want.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the schema itself explains iid, projectPath, and the userCredentials fallback, so the description carries no additional parameter burden. Baseline 3 applies since the description adds nothing beyond the structured fields.
Input schemas describe structure but not intent. Descriptions should explain 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 ("Delete a GitLab issue"), which cleanly separates it from create_issue, update_issue, and delete_note in the sibling list. It does not explicitly call out sibling boundaries, but the verb+resource pairing 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?
Usage is implied by the verb, and the description adds a prerequisite (permission to delete). However it gives no when-not guidance — e.g., closing an issue instead of deleting it — and no note about confirming intent before an irreversible removal.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_noteDelete NoteADestructiveIdempotent
Delete a comment (note) on a GitLab issue or merge request. Requires a user token belonging to the note author or a maintainer.
| Name | Required | Description | Default |
|---|---|---|---|
| noteId | Yes | Note ID — either the bare numeric ID or the full GraphQL gid (gid://gitlab/Note/123) | |
| userCredentials | No | Your GitLab credentials (optional — falls back to the configured env token if not provided) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false, so the safety profile is largely covered. The description adds useful permission context by stating the token must belong to the note author or a maintainer, though it does not discuss permanence or cascading 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 two sentences, front-loads the core action, and uses the second sentence for an important auth constraint. There is no redundant or wasted 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 destructive delete tool with full schema coverage and annotations covering destructiveness and idempotency, the description is nearly complete. It could mention irreversibility or error behavior for unauthorized tokens, but those gaps are minor given the structured metadata.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the schema fully documents noteId and userCredentials. The description only restates the credential requirement at a high level and adds no syntax or format details beyond what the schema already provides, 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 description states a specific verb and resource: 'Delete a comment (note) on a GitLab issue or merge request.' This clearly distinguishes it from sibling tools such as create_note, update_note, get_notes, and other delete_* tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for use and an explicit prerequisite: the token must belong to the note author or a maintainer. It does not explicitly compare against update_note or state when not to delete, but the context is clear and has no misleading exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
execute_custom_queryCustom GraphQL QueryA
Execute custom GraphQL queries for complex filtering (e.g., issues with assigneeUsernames: ["user"], labelName: ["bug"]). Use this for structured filtering by assignee/author/labels when search tools return 0 results. Use pagination and limit complexity to avoid timeouts.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | GraphQL query string. Example: query { issues(assigneeUsernames: ["cdhanlon"], state: opened, first: 50) { nodes { iid title webUrl } } } | |
| variables | No | Variables for the GraphQL query | |
| requiresWrite | No | Hint that this needs write access. Mutations are auto-detected and always write-gated regardless of this flag. | |
| userCredentials | No | Your GitLab credentials (optional — falls back to the configured env token if not provided) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and idempotentHint=false, so the agent knows this is not a safe repeatable read; the description adds genuine behavioral context about timeouts and pagination, which is not in the annotations. It does not disclose that arbitrary mutations can be issued, that mutations are write-gated, or anything about error/empty-result behavior, so it neither contradicts nor fully complements the annotation profile.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the purpose, then the usage trigger, then the performance caveat – no filler. The embedded example with bracket notation is slightly noisy but still illustrative rather than wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description could have said something about return shape or error semantics for arbitrary GraphQL, and it omits any pointer to get_available_queries/get_type_fields for discovering valid query structure despite those siblings existing. With 4 parameters including a nested credentials object, the definition is workable but leaves real gaps for an agent composing a query blind.
Complex tools with many parameters or behaviors need more documentation. Simple 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 schema already explains query, variables, requiresWrite, and userCredentials. The description's example adds a small amount of extra meaning (labelName filtering, which is absent from the schema example), but it says nothing about variables or credentials handling 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 gives a specific verb and resource ("Execute custom GraphQL queries") plus a concrete example (issues filtered by assigneeUsernames/labelName), so an agent knows exactly what operation this performs. It does not distinguish itself from the low-level siblings execute_rest_read/execute_rest_write or explain how it relates to get_available_queries, 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?
It states an explicit trigger – "Use this for structured filtering by assignee/author/labels when search tools return 0 results" – and adds a performance caveat about pagination and query complexity. However, it never names the specific search alternatives (search_issues, get_issues, search_gitlab) nor says when NOT to use raw GraphQL, leaving the routing decision partly to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
execute_rest_readCustom REST ReadARead-onlyIdempotent
Execute an arbitrary GET request against the GitLab REST API at /api/v4. Open-ended escape hatch for read endpoints not covered by a dedicated tool — e.g. /projects/:id/repository/files, /projects/:id/pipelines/:pipeline_id/test_report, /admin/*. Provide the path beginning with "/" (no host, no /api/v4 prefix) and an optional query object. For writes, use execute_rest_write.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Path under /api/v4, beginning with "/" (e.g. "/projects/42/issues" or "/projects/foo%2Fbar/repository/commits/HEAD"). Must not include host, "/api/v4" prefix, or "?" query string. | |
| query | No | Query string parameters (e.g. { state: "opened", per_page: 20 }). Values are coerced to strings. | |
| userCredentials | No | Your GitLab credentials (optional — falls back to the configured env token if not provided) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral context by calling this an arbitrary GET escape hatch and specifying that the path must omit host and /api/v4 prefix, though it does not discuss rate limits or response shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three tight sentences with the core purpose front-loaded, followed by path/query instructions and the write-tool alternative. Every sentence contributes directly to correct 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?
For a generic REST escape hatch with no output schema, the description covers purpose, path format, query usage, and the write alternative. It does not explain authentication fallback or response format, but those are either schema-documented or inherently endpoint-dependent.
Complex tools with many parameters or behaviors need more documentation. Simple 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 path, query, and userCredentials in detail. The description reinforces the path format and optional query object but does not add meaning beyond what the schema provides, making the baseline 3 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: execute an arbitrary GET request against the GitLab REST API at /api/v4. It explicitly frames the tool as an open-ended escape hatch for read endpoints not covered by dedicated tools, which distinguishes it from the many specific get_* siblings and from execute_rest_write.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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: read endpoints not covered by a dedicated tool, with concrete examples such as repository files, pipeline test reports, and /admin/*. It also names the alternative for writes, execute_rest_write, so the agent knows when not 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.
execute_rest_writeCustom REST WriteADestructive
Execute an arbitrary POST/PUT/PATCH/DELETE request against the GitLab REST API at /api/v4. Open-ended escape hatch for write endpoints not covered by a dedicated tool. Destructive — DELETE is permitted, so check the path before invoking. For reads, use execute_rest_read.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | Request body as a JSON value or JSON-encoded string. Sent as application/json; nested objects are preserved. Omit for endpoints that don't take a body (most DELETE / some PUT). | |
| path | Yes | Path under /api/v4, beginning with "/" (e.g. "/projects/42/issues" or "/projects/foo%2Fbar/merge_requests/3/merge"). Must not include host, "/api/v4" prefix, or "?" query string. | |
| query | No | Query string parameters. Most write endpoints take their args in the body, but a few mix. | |
| method | Yes | HTTP method. DELETE is destructive and not reversible. | |
| userCredentials | No | Your GitLab credentials (optional — falls back to the configured env token if not provided) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, readOnlyHint=false and non-idempotent, so the safety profile is covered structurally; the description reinforces it with "DELETE is permitted, so check the path" which tells the agent how to mitigate. It does not cover remaining behavioral unknowns such as required token scopes/permissions, rate limiting, or what an error from the underlying endpoint looks like.
Agents need to know what a tool does to the 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 short sentences, front-loaded with the operation and the destructive caveat, then the sibling routing, then nothing else. No restatement of the schema and 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?
With annotations covering safety, a fully documented 5-parameter schema, and no output schema, the description covers the decision-relevant information for a generic escape hatch. The one gap is that it never says what comes back (raw GitLab response body vs. wrapped) or how non-2xx responses are surfaced, which matters for an arbitrary-endpoint 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% and the schema itself is unusually detailed (path must start with "/", no /api/v4 prefix or query string; body as JSON value or JSON-encoded string; credentials fall back to env token). The description adds no parameter-level meaning beyond that, 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 specific verb (execute) and resource (arbitrary GitLab REST write request at /api/v4) with the allowed methods enumerated in the first sentence. It explicitly distinguishes itself as an escape hatch for endpoints not covered by dedicated tools, which separates it cleanly from the long list of specific write siblings like create_issue or update_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?
"Open-ended escape hatch for write endpoints not covered by a dedicated tool" states the selection condition, and "For reads, use execute_rest_read" names the alternative and the boundary that routes to it. It also adds a pre-invocation check ("check the path before invoking") tied to the destructive path, which is actionable guidance rather than filler.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_available_queriesAvailable QueriesCRead-onlyIdempotent
Get list of available GraphQL queries and mutations from the GitLab schema
| Name | Required | Description | Default |
|---|---|---|---|
| userCredentials | No | Your GitLab credentials (optional — falls back to the configured env token if not provided) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so the safety profile is covered without the description. Beyond saying it reads the GitLab schema, the description adds no behavioral context: no indication of whether the result is a flat name list or full query signatures, whether it is filtered by permission/license, or how large it may be.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, front-loaded with the verb and resource, with no filler or redundancy. It is tight but arguably under-specified rather than deliberately minimal, which keeps it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-required-parameter discovery tool with full annotation coverage this is minimally adequate. However, with no output schema, the description should say what the agent gets back (names, signatures, categories) and how to act on it; that omission is the main 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?
There is a single optional parameter (userCredentials) with 100% schema description coverage, including the env-token fallback, so the schema carries the semantics. Per the high-coverage baseline, 3 is the ceiling without compensating detail in 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?
Specific verb plus resource: lists available GraphQL queries and mutations from the GitLab schema, which is clearly a schema-introspection operation rather than execution. It does not, however, differentiate itself from closely related siblings such as get_type_fields, resolve_path, or execute_custom_query, which an agent must reconcile on its own.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 statement of when to reach for this tool versus execute_custom_query or get_type_fields, and no described workflow such as 'call this first, then execute a discovered query.' The name implies a discovery step, but nothing in the description confirms or constrains that usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_broadcast_messageGet Broadcast MessageARead-onlyIdempotent
Get a specific GitLab broadcast message by ID.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Broadcast message ID | |
| userCredentials | No | Your GitLab credentials (optional — falls back to the configured env token if not provided) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds no behavioral context beyond the basic read operation, but it also does not contradict the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no wasted words. It is appropriately sized for a simple by-ID 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 read-by-ID tool with full schema coverage and annotations covering safety, the definition is largely complete. It could mention return shape or authentication fallback, but those are relatively minor for this operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the 'id' parameter is already documented in the schema. The description reinforces that the ID refers to a broadcast message, but it adds no syntax or format details 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 states a specific verb and resource ('Get a specific GitLab broadcast message') and clarifies lookup by ID. It is clear, though it does not explicitly distinguish itself from sibling tools like list_broadcast_messages.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 phrase 'by ID' implies the tool is used when the broadcast message ID is known, but it does not explicitly compare against list_broadcast_messages or other sibling tools. Usage is inferable rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_current_userCurrent UserARead-onlyIdempotent
Get information about the current authenticated GitLab user
| Name | Required | Description | Default |
|---|---|---|---|
| userCredentials | No | Your GitLab credentials (optional — falls back to the configured env token if not provided) |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| name | Yes | |
| username | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is fully structured. The description adds the useful nugget that it resolves the identity from the authenticated session (no subject ID needed), but says nothing about which credential is used when both env token and userCredentials exist, or about failure behavior when unauthenticated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short sentence, front-loaded with the verb and resource, zero filler. Nothing to trim.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-required-parameter read tool with an output schema, the description need not explain return values. It is nearly complete; the only meaningful omission is guidance on credential precedence and what 'current user' means when running under a service account token.
Complex tools with many parameters or behaviors need more documentation. Simple 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 single userCredentials parameter already documents the env-token fallback, so the description adds no parameter-level meaning. 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 and resource ('Get information about ... user') and constrains it to the 'current authenticated' identity, which separates it from sibling lookups like search_users and get_project. It stops short of naming that distinction explicitly, so the differentiation is inferred rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 is only implied: an agent can reasonably infer this is the tool for 'who am I / what account is this token tied to'. There is no explicit when-to-use, when-not-to-use, or pointer to an alternative such as search_users for looking up other people.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_file_contentFile ContentCRead-onlyIdempotent
Get the content of a specific file from a GitLab repository - crucial for code analysis
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | Git reference (branch, tag, or commit SHA) | HEAD |
| filePath | Yes | Path to the file within the repository (e.g., "src/main.js") | |
| projectPath | Yes | Full path of the project (e.g., "group/project-name") | |
| userCredentials | No | Your GitLab credentials (optional — falls back to the configured env token if not provided) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so safety is covered. The description adds nothing behavioral beyond that — nothing about what happens for missing files, whether content is returned raw or truncated, how large files are handled, or how 'ref' defaults interact with retrieval.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with the core action first. The trailing clause 'crucial for code analysis' is promotional filler rather than actionable guidance, which keeps it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a four-parameter read tool with full schema coverage and complete annotations and no output schema, the essentials are present. However, the description omits how to choose between this and browse_repository and says nothing about the shape of the returned content, leaving meaningful gaps for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with all four parameters documented (projectPath, filePath, ref default HEAD, optional credentials). The description adds no syntax or semantics beyond that, 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 specific verb and resource ('Get the content of a specific file from a GitLab repository'), so an agent can tell it retrieves file contents rather than metadata. It does not explicitly distinguish itself from the sibling browse_repository, which likely overlaps, leaving some ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The only usage cue is the vague phrase 'crucial for code analysis', which gives no condition for choosing this tool over browse_repository or execute_rest_read. No when-not-to-use, no prerequisites, no alternatives named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_group_projectsGroup ProjectsCRead-onlyIdempotent
List projects inside a GitLab group (optionally filter by search term)
| Name | Required | Description | Default |
|---|---|---|---|
| after | No | Pagination cursor. To fetch the next page, pass the previous response pageInfo.endCursor here and repeat until pageInfo.hasNextPage is false. Paginating this way is the reliable path to complete results and accurate totals. | |
| first | No | Number of projects to retrieve | |
| fullPath | Yes | Group full path (e.g., "group/subgroup") | |
| searchTerm | No | Optional search term to filter group projects | |
| userCredentials | No | Your GitLab credentials (optional — falls back to the configured env token if not provided) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so the safety profile is fully covered elsewhere. The description adds nothing further — it does not say whether subgroup projects are included, whether results are paginated by default, or what happens with a nonexistent fullPath.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler. It is efficient, though arguably so terse that it drops information an agent would want.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Five parameters, one required, fully documented schema and annotations, and no output schema to explain. That covers the mechanics, but the description leaves open what a 'group project' includes (subgroups vs direct children) and how this differs from sibling listing tools — reasonable but incomplete for a listing endpoint.
Complex tools with many parameters or behaviors need more documentation. Simple 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%, including detailed pagination semantics for `after` and the fullPath example, so the description need only mirror that. It mentions searchTerm filtering but adds no meaning beyond the schema, making 3 the correct 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?
Specific verb (List) plus resource (projects) and scope (inside a GitLab group), with the optional search filter noted. It does not distinguish itself from close siblings such as get_projects or search_projects, so an agent still has to guess which of the three 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?
No guidance on when this tool is preferred over get_projects or search_projects, nor on prerequisites (membership/permission level needed to list a group's projects). The parenthetical only restates the optional filter, which is already in the schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_issue_contextGet Issue ContextARead-onlyIdempotent
Bundle issue body, all notes (paginated up to maxNotes), related merge requests (mentioning), closing merge requests, linked issues (relates_to/blocks/is_blocked_by) into a single call. Use this instead of fanning out across get_issues + get_notes + search_merge_requests when investigating an issue.
| Name | Required | Description | Default |
|---|---|---|---|
| iid | Yes | Issue IID (the number shown in the GitLab UI) | |
| maxNotes | No | Cap on notes fetched. Default 100. | |
| projectPath | Yes | Full project path (e.g. "my-group/my-project") | |
| userCredentials | No | Your GitLab credentials (optional — falls back to the configured env token if not provided) | |
| includeSystemNotes | No | Include system-generated notes (label changes, assignment events). Default false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint/non-destructive, so safety is covered; the description adds real value by disclosing the aggregation behavior, the maxNotes pagination cap, and the scope of 'related' MRs (mentioning only) versus closing MRs. It stops short of describing behavior when the issue is missing or whether notes are truncated silently, so not a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, both dense with information: the first front-loads what is returned, the second immediately routes the agent away from the fan-out alternative. 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?
With no output schema, the description usefully enumerates the response contents and relation types, which is the main thing an agent needs to know. Errors or behavior on a nonexistent/restricted issue are not addressed, a minor gap for a 5-param read 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 all five parameters including maxNotes and includeSystemNotes are already documented in the schema. The description only alludes to the maxNotes cap, adding marginal meaning beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific aggregation verb and enumerates exactly what is bundled: issue body, notes, related/closing merge requests, linked issues with relation types. This is clearly distinguishable from get_issues, get_notes, and search_merge_requests, which return only one slice each.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 'instead of fanning out across get_issues + get_notes + search_merge_requests when investigating an issue', naming the alternatives and the condition that selects this tool. Little is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_issuesProject IssuesCRead-onlyIdempotent
Get issues from a specific GitLab project (read-only)
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Sort order (e.g., UPDATED_DESC, CREATED_DESC, CREATED_ASC). Defaults to UPDATED_DESC for recency. | |
| after | No | Pagination cursor. To fetch the next page, pass the previous response pageInfo.endCursor here and repeat until pageInfo.hasNextPage is false. Paginating this way is the reliable path to complete results and accurate totals. | |
| first | No | Number of issues to retrieve | |
| fetchAll | No | Fetch multiple pages in one call, up to "first" items total (max 100) — NOT exhaustive. For complete results or accurate counts, leave this false and paginate via after (pageInfo.endCursor). | |
| projectPath | Yes | Full path of the project (e.g., "group/project-name") | |
| userCredentials | No | Your GitLab credentials (optional — falls back to the configured env token if not provided) |
Output Schema
| Name | Required | Description |
|---|---|---|
| nodes | Yes | |
| hasMore | No | |
| pageInfo | Yes | |
| totalFetched | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so '(read-only)' merely repeats structured data. The description adds nothing about pagination behavior, result completeness, or auth fallback — all of which live only in the schema, not the description.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded clause with zero filler. It is efficient, though it is arguably too terse for a six-parameter tool with non-obvious pagination tradeoffs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists and the schema documents pagination and the fetchAll-vs-after tradeoff, so much of the burden is carried elsewhere. Still, the description alone gives an agent no sense of result paging or that fetchAll is capped at 100, leaving it minimally viable 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 every parameter (sort, after, first, fetchAll, projectPath, userCredentials) is already documented thoroughly, including pagination semantics. The description adds no parameter-level meaning, 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 specific verb and resource ('Get issues') and narrows scope to a specific GitLab project, which distinguishes it from get_user_issues and search_issues. It does not explicitly name those siblings or explain the boundary, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to use this versus search_issues, get_user_issues, get_issue_context, or list_work_items, and no preconditions or exclusions. The parenthetical '(read-only)' is the only usage-adjacent cue.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_merge_request_commitsMR CommitsARead-onlyIdempotent
Get commits for a merge request (excluding merge commits), with commit count and details
| Name | Required | Description | Default |
|---|---|---|---|
| iid | Yes | Merge request IID | |
| after | No | Pagination cursor. To fetch the next page, pass the previous response pageInfo.endCursor here and repeat until pageInfo.hasNextPage is false. Paginating this way is the reliable path to complete results and accurate totals. | |
| first | No | Number of commits to retrieve | |
| fetchAll | No | Fetch multiple pages in one call, up to "first" items total (max 100) — NOT exhaustive. For complete results or accurate counts, leave this false and paginate via after (pageInfo.endCursor). | |
| projectPath | Yes | Full path of the project (e.g., "group/project-name") | |
| userCredentials | No | Your GitLab credentials (optional — falls back to the configured env token if not provided) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint/destructiveHint=false, so the safety profile is covered. The description adds a real behavioral fact beyond the schema: merge commits are excluded, which affects counts and results. It says nothing about auth or rate limits, so not a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with zero filler, front-loading the action and resource and appending the one non-obvious constraint (merge commits excluded). Nothing to trim.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 should say more about what comes back; 'with commit count and details' is vague about response shape (list of commits plus total?). Pagination and fetchAll caveats live only in the schema, so an agent reading just the description lacks the completeness picture.
Complex tools with many parameters or behaviors need more documentation. Simple 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%, including detailed pagination semantics for 'after'/'first'/'fetchAll', so the schema carries parameter meaning. The description adds no syntax or format guidance beyond what the schema already states — 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 and resource (get commits for a merge request) plus a meaningful scope qualifier: merge commits are excluded. An agent can distinguish it from get_merge_request_diffs or get_merge_request_pipelines without opening the schema, though no sibling is named 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?
Usage is implied by the resource name — call it when you need the commit list of a known MR — but there is no explicit when-to-use/when-not or named alternative (e.g., versus get_merge_request_context or the diffs tool). The agent must infer selection from the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_merge_request_contextGet Merge Request ContextARead-onlyIdempotent
Bundle MR body, all notes (paginated up to maxNotes, filtered to non-system by default), commits, pipeline summary, reviewers with approval state, and issues this MR will close into a single call. Use this instead of fanning out across get_merge_requests + get_notes + get_merge_request_commits + get_merge_request_pipelines when investigating an MR.
| Name | Required | Description | Default |
|---|---|---|---|
| iid | Yes | Merge request IID | |
| maxNotes | No | Cap on notes fetched. Default 100. | |
| maxCommits | No | Cap on commits fetched. Default 50. | |
| projectPath | Yes | Full project path (e.g. "my-group/my-project") | |
| userCredentials | No | Your GitLab credentials (optional — falls back to the configured env token if not provided) | |
| includeSystemNotes | No | Include system-generated notes. Default false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so safety is covered structurally. The description adds useful behavioral context the annotations do not: notes are paginated up to maxNotes and system notes are excluded by default, which tells the agent the result may be a filtered/truncated view. It stops short of saying what happens when the cap is hit (truncation signal, ordering), so it is strong but not complete.
Agents need to know what a tool does to the 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, zero filler. The inventory of bundled data comes first and the disambiguation rule second, which is the right order for an agent deciding whether to call it.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description carries the burden of describing the return shape, and it does so by enumerating the bundled sections. That is sufficient for an agent to know what comes back, though it does not describe nesting or per-section shapes, leaving a small gap for a multi-section aggregate 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 still adds value by calling out the pagination cap (maxNotes) and the default non-system-notes filtering, reinforcing the two behavioral parameters beyond their inline schema text. It does not explain maxCommits or the credential fallback, but the schema covers those.
Input schemas describe structure but not intent. Descriptions should explain non-obvious 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 ("Bundle") and enumerates exactly what is bundled: MR body, notes, commits, pipeline summary, reviewers with approval state, and closing issues. It names the sibling tools it replaces, so an agent can distinguish it from get_merge_requests, get_notes, or get_merge_request_commits without opening a 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 gives an explicit routing rule: "Use this instead of fanning out across get_merge_requests + get_notes + get_merge_request_commits + get_merge_request_pipelines when investigating an MR." That names both the alternative tools and the condition (investigating an MR) that selects this one.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_merge_request_diffsMR DiffsBRead-onlyIdempotent
Get diff statistics for a merge request, including per-file additions/deletions and diff refs
| Name | Required | Description | Default |
|---|---|---|---|
| iid | Yes | Merge request IID | |
| projectPath | Yes | Full path of the project (e.g., "group/project-name") | |
| userCredentials | No | Your GitLab credentials (optional — falls back to the configured env token if not provided) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this as a safe read-only, idempotent, non-destructive operation. The description adds useful context by specifying that it returns diff statistics and diff refs rather than full diff content, but it does not describe pagination, response shape, or any limits beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single efficient sentence with the core purpose front-loaded. It contains no redundant or filler language.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 retrieval tool with fully documented parameters and annotations covering safety, the description gives an adequate high-level account of the returned data. It does not fully specify the response structure, but with no output schema present, this is a minor gap rather than a blocking 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 projectPath, iid, and optional userCredentials. The description adds no additional parameter semantics or constraints beyond what the schema provides, which is the baseline expectation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource: get diff statistics for a merge request. It also identifies the returned content as per-file additions/deletions and diff refs, making the purpose clear, though it does not explicitly distinguish itself from related siblings such as get_merge_request_context or browse_repository.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 what the tool returns but gives no guidance on when to use it versus alternatives. It does not mention prerequisites, exclusions, or related tools, so the agent must infer usage from the name and purpose alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_merge_request_pipelinesMR PipelinesBRead-onlyIdempotent
Get CI/CD pipelines for a merge request, including status, duration, and stages
| Name | Required | Description | Default |
|---|---|---|---|
| iid | Yes | Merge request IID | |
| after | No | Pagination cursor. To fetch the next page, pass the previous response pageInfo.endCursor here and repeat until pageInfo.hasNextPage is false. Paginating this way is the reliable path to complete results and accurate totals. | |
| first | No | Number of pipelines to retrieve | |
| fetchAll | No | Fetch multiple pages in one call, up to "first" items total (max 100) — NOT exhaustive. For complete results or accurate counts, leave this false and paginate via after (pageInfo.endCursor). | |
| projectPath | Yes | Full path of the project (e.g., "group/project-name") | |
| userCredentials | No | Your GitLab credentials (optional — falls back to the configured env token if not provided) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description adds that results include status, duration and stages, which is useful return-shape context, but says nothing about pagination behavior or result limits (those live only in 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?
A single front-loaded sentence with zero filler that immediately conveys the resource and the payload contents. Nothing could be removed 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?
For a read-only list tool with full annotation coverage and a rich schema, the description is nearly sufficient: it states the source, scope and returned fields. The only minor gap is not hinting that results are paginated, though the schema documents that thoroughly.
Complex tools with many parameters or behaviors need more documentation. Simple 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 detailed guidance on after/first/fetchAll pagination and credential fallback, so the description adds no parameter meaning 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?
States a specific verb (Get) and resource (CI/CD pipelines) scoped to a merge request, plus names the returned fields (status, duration, stages). An agent can distinguish it from get_pipeline_jobs and manage_pipeline, though it does not name those siblings 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?
No explicit when-to-use guidance, no alternatives named, no prerequisites. Usage is only implied by the phrase 'for a merge request', leaving the agent to infer that this is the read-only listing counterpart to manage_pipeline and get_pipeline_jobs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_merge_request_reviewersMR ReviewersARead-onlyIdempotent
Get approval and reviewer status for a merge request, including who approved and review states
| Name | Required | Description | Default |
|---|---|---|---|
| iid | Yes | Merge request IID | |
| projectPath | Yes | Full path of the project (e.g., "group/project-name") | |
| userCredentials | No | Your GitLab credentials (optional — falls back to the configured env token if not provided) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so the safety profile is fully covered. The description adds that the result includes approval status and review states, but says nothing about pagination, ordering, or whether unapproved reviewers are included.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with the resource and the returned content; nothing is wasted. It is slightly terse for a tool whose output shape an agent must anticipate, but it is 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?
With no output schema, the description carries the burden of describing return data, and it does so at a high level (approvers, review states). Given 100% schema coverage and full annotation coverage, the remaining gap — exact return structure — 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 projectPath, iid and userCredentials are already documented in the schema. The description contributes no parameter-level meaning beyond that, which matches the baseline-3 expectation when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clear specific verb+resource: 'Get approval and reviewer status for a merge request', with added detail on what is returned (who approved, review states). It distinguishes itself from siblings like get_merge_request_context or get_merge_requests implicitly, but never names an alternative to sharpen the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 is implied by the purpose — an agent needing approval/reviewer data would pick this. However, there is no explicit when-to-use guidance or comparison against related tools such as get_merge_request_context, so the selection relies on inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_merge_requestsMerge RequestsCRead-onlyIdempotent
Get merge requests from a specific GitLab project (read-only)
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Sort order (e.g., UPDATED_DESC, CREATED_DESC, CREATED_ASC). Defaults to UPDATED_DESC for recency. | |
| after | No | Pagination cursor. To fetch the next page, pass the previous response pageInfo.endCursor here and repeat until pageInfo.hasNextPage is false. Paginating this way is the reliable path to complete results and accurate totals. | |
| first | No | Number of merge requests to retrieve | |
| fetchAll | No | Fetch multiple pages in one call, up to "first" items total (max 100) — NOT exhaustive. For complete results or accurate counts, leave this false and paginate via after (pageInfo.endCursor). | |
| projectPath | Yes | Full path of the project (e.g., "group/project-name") | |
| userCredentials | No | Your GitLab credentials (optional — falls back to the configured env token if not provided) |
Output Schema
| Name | Required | Description |
|---|---|---|
| nodes | Yes | |
| hasMore | No | |
| pageInfo | Yes | |
| totalFetched | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description merely repeats '(read-only)' and adds no further behavioral context such as pagination behavior, default sorting, or fetchAll limitations.
Agents need to know what a tool does to the world 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 short sentence with no wasted words and is front-loaded. However, its extreme brevity leaves important usage context unstated, which borders on under-specification rather than optimal 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?
An output schema exists and the input schema is fully documented, so return values and parameters need not be explained. Still, for a list tool surrounded by many merge-request siblings, the description should at least indicate when this project-scoped listing is preferable to search_merge_requests or get_user_merge_requests.
Complex tools with many parameters or behaviors need more documentation. Simple 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 thoroughly, including pagination and fetchAll caveats. The description adds no parameter-level meaning beyond what the schema provides, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (get merge requests) and scopes it to a specific GitLab project. It is clear what the tool does, but it does not distinguish itself from sibling tools like search_merge_requests or get_user_merge_requests.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 no guidance on when to use this tool versus alternatives such as search_merge_requests, get_user_merge_requests, or get_merge_request_context. The only usage signal is the read-only nature, which is already covered by annotations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_notesNotes/CommentsBRead-onlyIdempotent
Get notes (comments) on an issue or merge request, including system notes and inline MR comments
| Name | Required | Description | Default |
|---|---|---|---|
| iid | Yes | Issue or merge request IID | |
| after | No | Pagination cursor. To fetch the next page, pass the previous response pageInfo.endCursor here and repeat until pageInfo.hasNextPage is false. Paginating this way is the reliable path to complete results and accurate totals. | |
| first | No | Number of notes to retrieve | |
| fetchAll | No | Fetch multiple pages in one call, up to "first" items total (max 100) — NOT exhaustive. For complete results or accurate counts, leave this false and paginate via after (pageInfo.endCursor). | |
| projectPath | Yes | Full path of the project (e.g., "group/project-name") | |
| noteableType | Yes | Type of item to get notes for | |
| userCredentials | No | Your GitLab credentials (optional — falls back to the configured env token if not provided) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds useful scope detail by noting that system notes and inline MR comments are included, but it does not discuss permissions, pagination behavior, or rate limits beyond what the schema already says.
Agents need to know what a tool does to the world 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 front-loaded sentence with no redundant or filler content. Every phrase adds relevant scope information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich schema and read-only annotations, the description is largely complete for selecting and invoking the tool. The main gap is the absence of usage guidance relative to sibling tools like search_notes, but the core retrieval behavior is 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 all seven parameters are already documented in the schema. The description reinforces the issue/merge-request targeting but does not add syntax, format, or filtering 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 uses a specific verb and resource: 'Get notes (comments)' on an issue or merge request, and it clarifies that system notes and inline MR comments are included. It is clear what the tool does, though it does not explicitly distinguish itself from the sibling search_notes tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states what the tool retrieves but gives no explicit guidance on when to use it versus alternatives such as search_notes, nor does it mention prerequisites like project access. Usage is only implied by the issue/MR context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_pipeline_jobsPipeline JobsARead-onlyIdempotent
Get jobs for a specific pipeline, including status, stage, duration, and retry/cancel info
| Name | Required | Description | Default |
|---|---|---|---|
| after | No | Pagination cursor. To fetch the next page, pass the previous response pageInfo.endCursor here and repeat until pageInfo.hasNextPage is false. Paginating this way is the reliable path to complete results and accurate totals. | |
| first | No | Number of jobs to retrieve | |
| fetchAll | No | Fetch multiple pages in one call, up to "first" items total (max 100) — NOT exhaustive. For complete results or accurate counts, leave this false and paginate via after (pageInfo.endCursor). | |
| pipelineIid | Yes | Pipeline IID | |
| projectPath | Yes | Full path of the project (e.g., "group/project-name") | |
| userCredentials | No | Your GitLab credentials (optional — falls back to the configured env token if not provided) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so safety is covered structurally. The description adds that returned job records carry status, stage, duration and retry/cancel info, which is useful, but it stays silent on ordering, pagination behavior, and auth fallback — though the schema covers the latter two.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence with the core operation front-loaded and the return contents tacked on compactly. Nothing wasted, nothing buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 brief enumeration of returned job fields is genuinely valuable. The main gap is that pagination semantics — the schema's most important behavioral nuance — aren't echoed in the description, but the schema spells it out thoroughly.
Complex tools with many parameters or behaviors need more documentation. Simple 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%, including the pagination/vs-fetchAll tradeoff and credential fallback, so the baseline is 3. The description contributes no additional parameter meaning 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?
Specific verb+resource: 'Get jobs for a specific pipeline', plus an enumeration of what the payload contains (status, stage, duration, retry/cancel). It doesn't distinguish itself from pipeline-related siblings like manage_pipeline or get_merge_request_pipelines, but the resource 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?
Usage is implied — you call it when you have a projectPath and pipelineIid and want that pipeline's jobs. There is no explicit when-to-use/when-not, no mention of pagination strategy, and no routing away from manage_pipeline or get_merge_request_pipelines.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_projectProject DetailsCRead-onlyIdempotent
Get detailed information about a specific GitLab project (read-only)
| Name | Required | Description | Default |
|---|---|---|---|
| fullPath | Yes | Full path of the project (e.g., "group/project-name") | |
| userCredentials | No | Your GitLab credentials (optional — falls back to the configured env token if not provided) |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| name | Yes | |
| webUrl | Yes | |
| fullPath | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The '(read-only)' suffix merely restates readOnlyHint=true, so it earns no credit beyond the annotations. Nothing is said about lookup failure behavior for unknown fullPath, permission requirements on private projects, or whether the call is cached — the description adds essentially nothing over structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no padding and no waste. It is appropriately sized for a simple getter, though the trailing parenthetical is redundant filler against the annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, annotations cover safety and idempotency, and both parameters are fully documented, so the definition is minimally callable. Still missing is the retrieval scope relative to list/search siblings, which is the one thing an agent must resolve before choosing this 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%, including the fullPath example format and the userCredentials env-token fallback, so the schema already carries parameter meaning. The description contributes nothing further about either parameter, which is the expected baseline at 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?
States a specific verb and resource: 'Get detailed information about a specific GitLab project'. An agent can distinguish it from get_projects (plural list) and search_projects by name alone, but the description never names those siblings or contrasts scope, so differentiation is left to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 when-to-use guidance, no exclusions, and no mention of alternatives such as get_projects / search_projects / get_project_statistics, all of which are plausible near-neighbors in the sibling list. The only hint is the implied 'specific project' scope.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_projectsList ProjectsBRead-onlyIdempotent
List projects accessible to the user (requires authentication to see private projects)
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | GitLab project sort string (e.g., latest_activity_desc, created_desc, name_asc, stars_desc). Defaults to latest_activity_desc for recency. | |
| after | No | Pagination cursor. To fetch the next page, pass the previous response pageInfo.endCursor here and repeat until pageInfo.hasNextPage is false. Paginating this way is the reliable path to complete results and accurate totals. | |
| first | No | Number of projects to retrieve | |
| fetchAll | No | Fetch multiple pages in one call, up to "first" items total (max 100) — NOT exhaustive. For complete results or accurate counts, leave this false and paginate via after (pageInfo.endCursor). | |
| userCredentials | No | Your GitLab credentials (optional — falls back to the configured env token if not provided) |
Output Schema
| Name | Required | Description |
|---|---|---|
| nodes | Yes | |
| hasMore | No | |
| pageInfo | Yes | |
| totalFetched | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint/non-destructive, so the safety profile is covered. The description adds genuinely non-schema information: results are limited to what the authenticated user can see, and private projects require auth. Pagination behavior is left entirely to the schema rather than repeated here, which 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?
One short, front-loaded sentence with no filler or repetition of schema detail. It is efficient, though arguably thinner than a 5-parameter listing tool warrants.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists and parameters are fully documented, so return values and inputs need no prose. The remaining gap is selection context: with get_project, get_group_projects, and search_projects as siblings, the definition never clarifies which listing scope this returns.
Complex tools with many parameters or behaviors need more documentation. Simple 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 each parameter (sort, after, first, fetchAll, userCredentials) is thoroughly documented in-schema. The description adds no parameter meaning of its own, 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?
Clear verb+resource ("List projects") plus a scope qualifier ("accessible to the user"). It does not distinguish itself from nearby siblings such as get_project, get_group_projects, or search_projects, so an agent must infer the boundary itself.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 a precondition ("requires authentication to see private projects"), not a when-to-use rule. There is no mention of when to prefer get_group_projects (scoped listing) or search_projects (filtered lookup) over this general list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_project_statisticsProject StatisticsARead-onlyIdempotent
Get aggregate project statistics: open issues/MRs, star/fork counts, storage sizes, commit count, last pipeline status, release count, and language breakdown
| Name | Required | Description | Default |
|---|---|---|---|
| projectPath | Yes | Full path of the project (e.g., "group/project-name") | |
| userCredentials | No | Your GitLab credentials (optional — falls back to the configured env token if not provided) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description adds value beyond them by disclosing the shape of the result (a bundle of aggregate counts plus last pipeline status and language breakdown), which matters because there is no output schema. It does not mention whether private-project metrics need elevated scopes or that the call fans out across multiple endpoints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with a verb, the resource, and a compact enumeration of returned fields. No filler, no restatement of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 field enumeration substitutes effectively for a return-value section, and annotations cover the safety contract. What's missing is minor: expected cost/latency of an aggregation call and whether results are cached or point-in-time.
Complex tools with many parameters or behaviors need more documentation. Simple 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% — projectPath is documented with a concrete 'group/project-name' example and userCredentials is documented with the env-token fallback. The description adds nothing about either parameter, so the schema does all the work; 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?
Names a specific verb (get) and resource (aggregate project statistics) and enumerates the exact metrics returned — open issues/MRs, stars/forks, storage, commits, pipeline status, releases, languages. That enumeration is what separates it from get_project (single-project detail) and the analytics_* siblings, though it never names those alternatives 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?
There is no explicit when-to-use/when-not-to-use statement and no reference to any sibling tool. Usage is only implied by the word 'aggregate' and by the count-oriented field list, which suggests a rollup rather than a detail fetch. An agent must infer the routing decision itself.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_time_trackingTime TrackingARead-onlyIdempotent
Get time tracking data (estimate, spent, timelogs) for an issue or merge request
| Name | Required | Description | Default |
|---|---|---|---|
| iid | Yes | Issue or merge request IID | |
| after | No | Pagination cursor. To fetch the next page, pass the previous response pageInfo.endCursor here and repeat until pageInfo.hasNextPage is false. Paginating this way is the reliable path to complete results and accurate totals. | |
| first | No | Number of timelog entries to retrieve | |
| projectPath | Yes | Full path of the project (e.g., "group/project-name") | |
| resourceType | Yes | Type of resource to get time tracking for | |
| includeTimelogs | No | Whether to include individual timelog entries | |
| userCredentials | No | Your GitLab credentials (optional — falls back to the configured env token if not provided) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is handled. The description adds the useful detail that estimate, spent, and timelogs are all returned, but says nothing about authentication behavior, permissions needed, or that totals require full pagination.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence naming the verb, the resource, the returned data, and the applicable resource types. Zero filler; every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read tool with no output schema, the description names the three data categories the caller receives, which is the main gap it needed to fill. Minor omission: it doesn't signal that pagination is required for accurate totals, though the schema's cursor parameter text covers 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 description coverage is 100%, so all seven parameters including pagination, resourceType enum, and credential fallback are already documented. The description's list of returned data categories loosely maps to includeTimelogs but adds no syntax or format detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Get) and resource (time tracking) and enumerates the returned fields (estimate, spent, timelogs), scoped to an issue or merge request. No sibling tool covers time tracking, so differentiation is implicit rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 scopes usage to issues or merge requests, which tells the agent where the tool applies, but it gives no when-to-use vs. when-not guidance and no mention of when to set includeTimelogs versus pulling only totals.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_type_fieldsGraphQL Type FieldsARead-onlyIdempotent
List available fields on a GraphQL type using introspected schema (requires schema to be introspected)
| Name | Required | Description | Default |
|---|---|---|---|
| typeName | Yes | GraphQL type name (e.g., "Project") | |
| userCredentials | No | Your GitLab credentials (optional — falls back to the configured env token if not provided) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds the operational prerequisite that introspection must have run first. It does not describe the error behavior when the schema is not introspected or what the returned field entries contain.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with the action and prerequisite front-loaded and no filler. The trailing parenthetical is slightly redundant with itself, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 introspection helper with full schema coverage and complete annotations, the definition covers what the tool does and its prerequisite. No output schema exists, so a hint about the shape of the returned field list would help, but the core 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 typeName and userCredentials are already documented in the schema, including the env-token fallback for credentials. The description adds no syntax, naming-convention, or lookup details beyond what the schema provides, so 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?
Uses a specific verb 'List' with a precise resource 'available fields on a GraphQL type', and names the mechanism (introspected schema). It is distinguishable from data-fetching siblings, though it does not explicitly point at the closest relative, get_available_queries.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 parenthetical states a real prerequisite (schema must already be introspected), which is useful context for when the call will succeed. However, it gives no guidance on when to choose this over get_available_queries or other schema-exploration paths, leaving that 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.
get_user_issuesUser IssuesBRead-onlyIdempotent
Get all issues assigned to a specific user - uses proper GraphQL filtering for reliable results
| Name | Required | Description | Default |
|---|---|---|---|
| after | No | Pagination cursor. To fetch the next page, pass the previous response pageInfo.endCursor here and repeat until pageInfo.hasNextPage is false. Paginating this way is the reliable path to complete results and accurate totals. | |
| first | No | Number of issues to retrieve | |
| state | No | Filter by issue state (opened, closed, all) | opened |
| fetchAll | No | Fetch multiple pages in one call, up to "first" items total (max 100) — NOT exhaustive. For complete results or accurate counts, leave this false and paginate via after (pageInfo.endCursor). | |
| username | Yes | Username to find issues for (e.g., "cdhanlon") | |
| projectPath | No | Optional: limit search to a specific project | |
| userCredentials | No | Your GitLab credentials (optional — falls back to the configured env token if not provided) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description adds the GraphQL-filtering claim, but omits behaviorally significant facts: results are paginated (default 20, max 100) and 'all issues' is only true if the caller paginates, which is disclosed only in 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?
A single front-loaded sentence with the core scope stated first. The trailing clause about GraphQL filtering is a soft claim rather than actionable detail, so it does not fully earn its place, but nothing is 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?
With 7 parameters, no output schema, and a default that returns only 20 of possibly many issues, the description should warn that completeness requires pagination and should position this tool against get_issues/search_issues. Those gaps are partially mitigated by unusually rich schema descriptions.
Complex tools with many parameters or behaviors need more documentation. Simple 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 pagination/fetchAll/state/credentials params are documented in detail in the schema itself. The description adds no parameter-level meaning beyond the verb, 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 specific verb and resource (get issues) with an explicit filter (assigned to a specific user) and names the underlying mechanism (GraphQL filtering). However, it does not distinguish itself from near-identical siblings like get_issues or search_issues, so an agent must guess between 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?
No explicit when-to-use guidance and no named alternatives, despite the sibling list containing get_issues, search_issues, get_issue_context, and get_user_merge_requests. The phrase 'for reliable results' hints at a preference over another tool but never says which one or when.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_user_merge_requestsUser Merge RequestsCRead-onlyIdempotent
Get merge requests for a specific user (as author or assignee) - uses proper GraphQL filtering
| Name | Required | Description | Default |
|---|---|---|---|
| role | No | Whether to find MRs authored by or assigned to the user | author |
| after | No | Pagination cursor. To fetch the next page, pass the previous response pageInfo.endCursor here and repeat until pageInfo.hasNextPage is false. Paginating this way is the reliable path to complete results and accurate totals. | |
| first | No | Number of merge requests to retrieve | |
| state | No | Filter by MR state (opened, closed, merged, all) | opened |
| fetchAll | No | Fetch multiple pages in one call, up to "first" items total (max 100) — NOT exhaustive. For complete results or accurate counts, leave this false and paginate via after (pageInfo.endCursor). | |
| username | Yes | Username to find merge requests for (e.g., "cdhanlon") | |
| projectPath | No | Optional: limit search to a specific project | |
| userCredentials | No | Your GitLab credentials (optional — falls back to the configured env token if not provided) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so safety is covered. The description adds nothing behavioral beyond that — no note about the default 'opened' state, default page size, or the fact that `fetchAll` is not exhaustive; that critical caveat lives only in the schema. 'Uses proper GraphQL filtering' is unexplained filler.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a single short sentence and front-loads the resource, which is good. But the dangling '- uses proper GraphQL filtering' does not earn its place; it neither guides selection nor explains behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only, fully-documented listing tool with no output schema, the description plus schema give an agent enough to call it correctly — pagination, defaults and limits all live in the schema. The only real gap is the absence of sibling routing guidance against `get_merge_requests`.
Complex tools with many parameters or behaviors need more documentation. Simple 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 eight parameters including the pagination cursor and fetchAll caveat are documented in the schema. The description only restates the author/assignee duality already captured by the `role` enum, adding no syntax or format detail on top.
Input schemas describe structure but not intent. Descriptions should explain 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 with its defining scope: merge requests for a specific user, either as author or assignee. That clearly separates it from the general `get_merge_requests` sibling, though the description never names that sibling to make the contrast 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?
There is no statement of when to prefer this over `get_merge_requests` or `search_merge_requests`, and no exclusions or prerequisites. The trailing clause 'uses proper GraphQL filtering' hints at a reliability advantage but never explains what it means for the caller.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_work_itemGet Work ItemARead-onlyIdempotent
Fetch a GitLab work item (issue, task, epic, incident, OKR) by global ID. Returns the raw widgets array so epic hierarchy, health status, iteration, milestone, and dates are all visible. Accepts either a numeric id or a full gid (gid://gitlab/WorkItem/123).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Work item ID — numeric (e.g. "123") or full gid (e.g. "gid://gitlab/WorkItem/123") | |
| userCredentials | No | Your GitLab credentials (optional — falls back to the configured env token if not provided) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only, idempotent, non-destructive profile, so the description earns credit for adding the return shape: the raw widgets array and which fields it exposes (epic hierarchy, health, iteration, milestone, dates). That is real behavioral context an agent cannot get from the annotations, though nothing is said about auth fallback or 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?
Three sentences, front-loaded with the action and identifier, then return shape, then accepted id formats. No filler and nothing buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 usefully explains what comes back (raw widgets) and for a 2-parameter read tool that is nearly sufficient. The only meaningful gap is routing guidance relative to sibling tools like list_work_items or get_issue_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%, and the description only restates the numeric-or-gid format already documented in the `id` schema field. It adds no help beyond the schema for the optional credentials parameter, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Fetch a GitLab work item ... by global ID') and enumerates the concrete subtypes it covers (issue, task, epic, incident, OKR). This distinguishes it from the many sibling list/search tools that also return issue-like 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?
The 'by global ID' framing implies single-item lookup versus the list_work_items / get_issues / search_issues siblings, but the description never explicitly says when to use this instead of them or what prerequisites apply. Usage is inferred rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_achievementsList AchievementsARead-onlyIdempotent
List group achievements with cursor pagination. Requires Achievements to be enabled on the GitLab instance. Optional recipient previews are a single page per achievement; each preview includes pageInfo.
| Name | Required | Description | Default |
|---|---|---|---|
| ids | No | Optional achievement IDs to filter. | |
| after | No | Previous pageInfo.endCursor; repeat until hasNextPage is false. | |
| first | No | ||
| group | Yes | Group full path, for example my-group/sub-group. | |
| fetchAll | No | Fetch multiple pages up to first items, not an exhaustive scan. | |
| userCredentials | No | Your GitLab credentials (optional — falls back to the configured env token if not provided) | |
| includeRecipients | No | Include a page of active awards and recipient usernames for each achievement. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint/non-destructive, so the safety profile is covered; the description goes beyond that by disclosing an instance-level enablement requirement and the single-page semantics of the recipient previews. It leaves out auth fallback behavior (covered by the schema) and any rate-limit or result-size caveats.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with zero filler: purpose first, then the hard prerequisite, then the one non-obvious semantic caveat. Every sentence carries usable 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 7-parameter read tool with no output schema, the definition covers purpose, prerequisite, pagination model, and the subtle preview behavior — enough to call it correctly. It is slightly thin on what the returned achievement records contain, though the annotations relieve it of explaining safety.
Complex tools with many parameters or behaviors need more documentation. Simple 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 86%, so the baseline is 3; the description earns an extra point by disambiguating includeRecipients — clarifying that each achievement gets only one page of recipient previews and that each preview carries its own pageInfo, which prevents an agent from assuming previews are fully paginated. It adds nothing for the remaining parameters, which the schema already documents 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 a specific verb and resource ("List group achievements") plus the retrieval mechanism (cursor pagination), which distinguishes it from the mutation siblings like create_achievement, award_achievement, and revoke_achievement. It never names a sibling or a scope boundary explicitly, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Adds a real precondition ("Requires Achievements to be enabled on the GitLab instance") and signals that recipient previews are a bounded single page rather than a full expansion, which helps an agent decide whether to set includeRecipients. However, there is no explicit when-to-use/when-not-to-use guidance and no named alternative among the many list_* and search_* siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_broadcast_messagesList Broadcast MessagesARead-onlyIdempotent
List all GitLab broadcast messages (instance-wide announcements). Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (1-based) | |
| perPage | No | Results per page | |
| userCredentials | No | Your GitLab credentials (optional — falls back to the configured env token if not provided) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, and the description's "Read-only" merely restates them. It adds the useful scope note that results are instance-wide, but omits permission requirements, pagination behavior beyond the schema defaults, and whether the list is ordered — all relevant for a paginated admin-level feed.
Agents need to know what a tool does to the 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 short sentences, scope stated first, zero padding. Nothing could be removed 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?
For a zero-required-param list tool with fully documented schema and safety annotations, the definition covers what the resource is and its read-only nature. The one meaningful gap is the admin/credential requirement, which the userCredentials parameter hints at but the description never confirms.
Complex tools with many parameters or behaviors need more documentation. Simple 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 every parameter (page, perPage, userCredentials) is documented in the schema with defaults and bounds, so the description needs to add nothing and adds nothing. 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?
Clear verb+resource ("List all GitLab broadcast messages") with a parenthetical that explains the domain concept ("instance-wide announcements"). This distinguishes it from the singular get_broadcast_message and the create/update/delete siblings by implication, though it never names those siblings 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?
Usage is only implied: you call it to enumerate broadcast messages. There is no statement of when to prefer get_broadcast_message (single record) over this list, and no note that broadcast messages are typically admin-scoped in GitLab, which materially affects whether an agent should attempt the call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_group_membersGroup MembersARead-onlyIdempotent
List group members with access levels, optionally filtered by search term
| Name | Required | Description | Default |
|---|---|---|---|
| after | No | Pagination cursor. To fetch the next page, pass the previous response pageInfo.endCursor here and repeat until pageInfo.hasNextPage is false. Paginating this way is the reliable path to complete results and accurate totals. | |
| first | No | Number of members to retrieve | |
| search | No | Optional search term to filter members by name or username | |
| fetchAll | No | Fetch multiple pages in one call, up to "first" items total (max 100) — NOT exhaustive. For complete results or accurate counts, leave this false and paginate via after (pageInfo.endCursor). | |
| groupPath | Yes | Full path of the group (e.g., "my-group" or "parent/child-group") | |
| userCredentials | No | Your GitLab credentials (optional — falls back to the configured env token if not provided) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description adds that results include access levels, which is useful context, but says nothing about pagination behavior or the fetchAll-vs-after tradeoff that dominates this tool's 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?
A single front-loaded sentence with no filler. It is efficient, though its terseness means some of the tool's real complexity (paging, fetchAll) is left entirely to 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 listing tool with a fully documented schema and explicit annotations, the description covers what the tool returns and its filter. Pagination nuance lives in the schema, so nothing critical is missing, though a one-line note on paging would make it complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all six parameters are documented in the schema, including the pagination and credential fallback semantics. The description only restates the search filter, adding no syntax or defaults 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?
States a specific verb (List) and resource (group members) plus what is returned (access levels) and an optional filter. It does not distinguish itself from nearby siblings such as search_users or get_group_projects, but the resource 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 word 'optionally' hints at the filtered/unfiltered modes, but there is no explicit when-to-use guidance, no mention of prerequisites (needing groupPath scope or credentials), and no pointer to alternative tools when the agent wants cross-group user search.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_iterationsIterationsARead-onlyIdempotent
List iterations (sprints) for a group with cadence info. Requires GitLab Premium/Ultimate.
| Name | Required | Description | Default |
|---|---|---|---|
| after | No | Pagination cursor. To fetch the next page, pass the previous response pageInfo.endCursor here and repeat until pageInfo.hasNextPage is false. Paginating this way is the reliable path to complete results and accurate totals. | |
| first | No | Number of iterations to retrieve | |
| state | No | Filter by state: upcoming, current, opened, closed (omit for all) | |
| fetchAll | No | Fetch multiple pages in one call, up to "first" items total (max 100) — NOT exhaustive. For complete results or accurate counts, leave this false and paginate via after (pageInfo.endCursor). | |
| groupPath | Yes | Full path of the group (e.g., "my-group" or "parent/child-group") | |
| userCredentials | No | Your GitLab credentials (optional — falls back to the configured env token if not provided) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is a safe, read-only, idempotent operation. The description adds two relevant behavioral facts beyond annotations: it returns cadence information and requires a Premium or Ultimate GitLab tier. It omits pagination behavior, but that is fully documented in the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The definition is two sentences, front-loads the core operation, and adds the licensing prerequisite without padding. Every phrase carries useful information for an agent deciding whether and how to call the 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 six-parameter read-only tool with rich schema descriptions, the definition supplies the essential purpose, return hint ('cadence info'), and licensing prerequisite. It does not detail return values, which is a modest gap because no output schema exists, but the schema already covers all parameter-level behavior an agent needs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all six parameters, including pagination, state filtering, groupPath, and credentials fallback, are already documented in the input schema. The description adds only the implicit notion that a group is required and does not provide parameter 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 gives a clear verb and resource: 'List iterations (sprints) for a group with cadence info.' It also clarifies that iterations are sprints, which helps disambiguate from milestone-related siblings, but it does not explicitly differentiate itself from the nearby list_milestones tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The only contextual guidance is the licensing prerequisite ('Requires GitLab Premium/Ultimate'), which is useful but does not explain when to choose this tool over alternatives. There is no mention of when not to use it, how it relates to milestone listing, or what to do if the feature is unavailable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_milestonesMilestonesARead-onlyIdempotent
List milestones for a project or group with progress statistics (total/closed issue counts)
| Name | Required | Description | Default |
|---|---|---|---|
| after | No | Pagination cursor. To fetch the next page, pass the previous response pageInfo.endCursor here and repeat until pageInfo.hasNextPage is false. Paginating this way is the reliable path to complete results and accurate totals. | |
| first | No | Number of milestones to retrieve | |
| state | No | Filter by state: active, closed (omit for all) | |
| search | No | Search milestones by title | |
| fetchAll | No | Fetch multiple pages in one call, up to "first" items total (max 100) — NOT exhaustive. For complete results or accurate counts, leave this false and paginate via after (pageInfo.endCursor). | |
| fullPath | Yes | Full path of the project or group (e.g., "group/project-name" or "group") | |
| isProject | Yes | Whether the path is a project (true) or group (false) | |
| userCredentials | No | Your GitLab credentials (optional — falls back to the configured env token if not provided) | |
| includeAncestors | No | Include milestones from ancestor groups |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so safety is covered by structured data. The description adds one real piece of beyond-schema behavior — that results include aggregated progress statistics rather than raw milestone records — but says nothing about the pagination/accuracy caveat or whether the aggregate respects the state/search filters.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with zero filler, front-loading the verb and scope before the payload detail. Nothing repeats the name or the annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 9 parameters, two of them pagination-related and one a credential object, the schema and annotations do most of the work and the description needn't restate them. The remaining gap is small but real: it doesn't clarify whether the progress statistics are computed over the filtered result set (state/search/includeAncestors) or the full milestone set.
Complex tools with many parameters or behaviors need more documentation. Simple 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 parameter docs are unusually strong (pagination cursor loop, fetchAll non-exhaustiveness, state enum values, fullPath/isProject coupling). The description adds no parameter meaning of its own; baseline 3 is correct when the schema carries this much.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb ('List') plus resource ('milestones') plus the two scopes it supports (project or group), and it adds a distinct payload detail: progress statistics with total/closed issue counts. No sibling tool lists milestones, so an agent can place it unambiguously.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 is implied by the resource ('for a project or group'), but the description names no alternatives and gives no when-to-use vs when-not guidance (e.g., versus get_project_statistics or get_issues for issue-level data). The agent must infer the boundary from the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_my_eventsMy EventsBRead-onlyIdempotent
List the authenticated user's GitLab activity feed — pushes, MRs, comments, approvals, issue actions. Primary tool for "what did I just do". Requires user authentication.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (1-based) | |
| sort | No | Sort order (default desc — newest first) | desc |
| after | No | Only events after this date (YYYY-MM-DD) | |
| scope | No | Set to "all" to include events from any project you have access to, not just your own authored events | |
| action | No | Filter by action type | |
| before | No | Only events before this date (YYYY-MM-DD) | |
| per_page | No | Results per page | |
| target_type | No | Filter by target resource type | |
| userCredentials | No | Your GitLab credentials (optional — falls back to the configured env token if not provided) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so safety is covered externally. The description adds useful context that user authentication is required and what event categories come back, but says nothing about pagination behavior or volume, and "requires user authentication" sits slightly uneasily with the optional userCredentials parameter.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short clauses with the resource and its contents front-loaded; no filler. The auth sentence is brief and earns its place as a prerequisite note.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 nine optional parameters, four enums and no output schema, the description covers purpose and auth but omits any hint of the filtering/paging surface or result shape. It is adequate to identify the tool, but thin for a tool whose value depends on filter combination.
Complex tools with many parameters or behaviors need more documentation. Simple 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 four enum parameters are fully documented in the schema, so the baseline of 3 applies. The description contributes no additional meaning about filters (action, target_type, scope, after/before) or paging 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?
Names a specific verb and resource ("List the authenticated user's GitLab activity feed") and enumerates the event kinds returned (pushes, MRs, comments, approvals, issue actions). The scope word "authenticated user's" implicitly separates it from list_user_events and list_project_events, but it never names those siblings 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?
"Primary tool for 'what did I just do'" gives a use-case cue, which is better than nothing. However, there is no when-not guidance and no routing to nearby alternatives such as list_user_events (other users), list_project_events (project-wide), or list_my_todos (actionable items), so the agent must infer selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_my_todosMy TodosARead-onlyIdempotent
List the authenticated user's GitLab to-do items (notifications about issues, MRs, mentions, reviews requested, etc.). Filter by state, action, target type, or group/project. Requires user authentication.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Sort order — e.g. CREATED_DESC (default on server), CREATED_ASC, UPDATED_DESC, UPDATED_ASC. | |
| type | No | Filter by target type — e.g. Issue, MergeRequest, Epic, Commit, DesignManagement::Design, AlertManagement::Alert | |
| after | No | Pagination cursor. To fetch the next page, pass the previous response pageInfo.endCursor here and repeat until pageInfo.hasNextPage is false. Paginating this way is the reliable path to complete results and accurate totals. | |
| first | No | Number of todos to retrieve | |
| state | No | Filter by todo state: pending (default), done, or all | pending |
| action | No | Filter by todo action — e.g. assigned, mentioned, build_failed, marked, approval_required, unmergeable, directly_addressed, review_requested | |
| fetchAll | No | Fetch multiple pages in one call, up to "first" items total (max 100) — NOT exhaustive. For complete results or accurate counts, leave this false and paginate via after (pageInfo.endCursor). | |
| authorIds | No | Filter by todo authors. Accepts numeric user IDs or full gid://gitlab/User/N strings. | |
| groupPath | No | Limit to a group by full path (e.g. "my-org/platform"). Resolved to a node GID server-side before filtering. | |
| isSnoozed | No | Filter by snooze state: true → only snoozed, false → only non-snoozed. | |
| projectPath | No | Limit to a project by full path (e.g. "my-org/my-repo"). Resolved to a node GID server-side before filtering. | |
| userCredentials | No | Your GitLab credentials (optional — falls back to the configured env token if not provided) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds one genuinely useful behavioral detail — the authentication requirement — but does not mention pagination behavior or result shape beyond what the schema already exposes via the after/fetchAll params.
Agents need to know what a tool does to the 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, front-loaded sentences that define the resource, enumerate filters, and flag the auth prerequisite. Slight looseness from 'etc.' but no wasted sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-param read-only list tool with no output schema but full schema coverage and safety annotations, the description covers purpose, filter scope, and auth. It omits pagination/return expectations, but the schema's after/fetchAll descriptions handle that, so it is largely complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 12 parameters thoroughly. The description only names the filter categories (state, action, target type, group/project), which largely restates schema content without adding format or interaction guidance, so 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 (List) and resource (authenticated user's GitLab to-do items), and clarifies what a to-do is with concrete examples (issues, MRs, mentions, reviews requested). Clear enough to distinguish from read tools like get_issues, but it does not explicitly name the mutation siblings (mark_todo_done, restore_todo) that share the resource.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The filter dimensions imply when to reach for this tool, and 'Requires user authentication' flags a precondition. However, there is no explicit when-not guidance or routing to alternatives (e.g., use mark_todo_done to modify, list_my_events for activity rather than to-dos), leaving selection to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_project_eventsProject EventsARead-onlyIdempotent
List activity events for a single GitLab project — commits pushed, MRs opened/merged, issues touched, notes added. Accepts project full path or numeric ID.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (1-based) | |
| sort | No | Sort order (default desc — newest first) | desc |
| after | No | Only events after this date (YYYY-MM-DD) | |
| action | No | Filter by action type | |
| before | No | Only events before this date (YYYY-MM-DD) | |
| project | Yes | Project full path (e.g. "group/my-project") or numeric project ID | |
| per_page | No | Results per page | |
| target_type | No | Filter by target resource type | |
| userCredentials | No | Your GitLab credentials (optional — falls back to the configured env token if not provided) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds useful context by naming the event types returned, but says nothing about pagination behavior, result caps, or permission requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the resource scope front-loaded and the identifier format immediately after. 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 read-only list tool with full schema coverage and annotations covering safety, the description gives an agent enough to call it correctly. The only small gap is omitting how results are shaped or paged, but with no output schema and rich parameter docs this 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 all nine parameters are documented in the schema, including enums for action, target_type, and sort. The description only restates that 'project' accepts a full path or numeric ID, adding nothing beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (list) and resource (activity events) scoped to a single GitLab project, and enumerates the event categories (commits, MRs, issues, notes). The 'single project' scoping distinguishes it from siblings like list_user_events and list_my_events.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 single-project scope implies when this tool applies, but it never explicitly names an alternative (e.g., list_user_events for cross-project activity) or states exclusions. Usage must be inferred from scope wording alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_user_eventsUser EventsARead-onlyIdempotent
List a specific user's public GitLab activity feed by username or numeric ID. Use for tracking what a teammate has been working on.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (1-based) | |
| sort | No | Sort order (default desc — newest first) | desc |
| user | Yes | Username (e.g. "alice") or numeric user ID | |
| after | No | Only events after this date (YYYY-MM-DD) | |
| action | No | Filter by action type | |
| before | No | Only events before this date (YYYY-MM-DD) | |
| per_page | No | Results per page | |
| target_type | No | Filter by target resource type | |
| userCredentials | No | Your GitLab credentials (optional — falls back to the configured env token if not provided) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and non-destructive, so safety is covered. The description adds one genuinely useful behavioral detail — only *public* activity is returned — but says nothing about pagination or result volume beyond what the schema shows.
Agents need to know what a tool does to the 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 tight sentences, front-loaded with the scope and then the purpose. No filler, though the second sentence adds little beyond what the first already implies.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 fully described schema and clear annotations, the main missing piece is mention of the filtering capabilities (date range, action, target type) and pagination, which an agent would only learn from 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 all nine parameters including enums for action, target_type and sort are already documented. The description only echoes the `user` format (username or numeric ID), adding no new 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?
States a specific verb and resource (list a user's activity feed) plus the identifier forms accepted. The phrase "a specific user's" implicitly separates it from list_my_events and list_project_events, but no sibling is named 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?
"Use for tracking what a teammate has been working on" gives one positive usage context, but there is no guidance on when to prefer list_my_events or list_project_events, or any prerequisite/exclusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_work_itemsList Work ItemsARead-onlyIdempotent
List work items within a namespace (group or project fullPath). Supports filtering by type (ISSUE, TASK, EPIC, INCIDENT, OBJECTIVE, KEY_RESULT) and state, plus cursor pagination and fetchAll.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Sort enum, e.g. UPDATED_DESC (default), CREATED_DESC, TITLE_ASC | |
| after | No | Cursor for next page | |
| first | No | Page size (default 20, capped by server maxPageSize) | |
| state | No | Filter by state. "all" returns every state. | |
| types | No | Filter by work item types. Omit for all types. | |
| fetchAll | No | Auto-paginate up to first items | |
| fullPath | Yes | Namespace full path — group (e.g. "my-group") or project (e.g. "my-group/my-project") | |
| userCredentials | No | Your GitLab credentials (optional — falls back to the configured env token if not provided) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds the pagination model (cursor plus fetchAll) and the filter dimensions, which is useful context beyond annotations. However, it says nothing about ordering behavior, cross-subgroup scope for a group fullPath, or what the response contains despite there being no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the resource and its scope before the optional capabilities. Every clause maps to a real capability (filters, pagination) and there is 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?
With 8 parameters, no output schema, and no return-value documentation, the description should carry more weight than one line on filters and pagination. It never states whether a group fullPath includes descendant projects or what a page of results looks like. Annotations cover safety, but result-shape and scope semantics are left open.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every one of the 8 parameters is documented in the schema itself. The description restates the type and state filters but omits two valid enum members (TEST_CASE, REQUIREMENT) and adds no format or syntax detail for after/first/fetchAll. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource (list work items) and pins the scope to a namespace fullPath, which implicitly separates it from get_work_item and the search_* tools. It enumerates the type and state filters, so an agent knows this is the namespace-scoped work item lister. It never names a sibling outright, so the differentiation is inferred rather than 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?
Usage is only implied: 'within a namespace' plus the supported filters tells an agent roughly when this fits, but there is no statement of when to prefer search_issues, get_issues, or get_work_item instead. No prerequisites or exclusions are mentioned. It is adequate but leaves routing decisions to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_pipelineManage PipelineA
Retry or cancel a CI/CD pipeline (requires user authentication with write permissions)
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | Action to perform on the pipeline | |
| pipelineIid | Yes | Pipeline IID | |
| projectPath | Yes | Full path of the project (e.g., "group/project-name") | |
| userCredentials | No | Your GitLab credentials (optional — falls back to the configured env token if not provided) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-read-only, non-idempotent, and non-destructive behavior. The description adds useful auth context (write permissions required), but does not explain the side effects of retry/cancel or what the response contains.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence, front-loaded with the actions and resource, with a brief parenthetical auth note. There is no wasted 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-action mutation with fully described parameters and safety annotations, the description covers purpose and authentication. It omits return/effect details, but with no output schema and annotations covering safety, 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 all four parameters are documented, including the action enum and credential fallback. The description adds no parameter meaning beyond what the schema already provides, so 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 specific actions (retry/cancel) and the resource (CI/CD pipeline). It does not explicitly name sibling alternatives, but the action set is distinct from read-only pipeline tools such as get_pipeline_jobs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implies use when a pipeline needs retry or cancel and notes the write-auth requirement. It does not state when to choose retry versus cancel, when not to use the tool, or name alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mark_all_todos_doneMark All Todos DoneADestructiveIdempotent
Mark pending to-do items as done for the authenticated user. With no arguments, marks every pending todo. Optional scoping args (groupPath, projectPath, action, type, authorIds, targetId) narrow which todos are marked. Irreversible without per-item restore_todo calls. Returns the actual list of updated todos.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Limit to todos targeting this type (e.g. Issue, MergeRequest, Epic). | |
| action | No | Limit to todos with this action (e.g. assigned, mentioned, review_requested). | |
| targetId | No | Limit to todos for a single target (e.g. a specific issue/MR GID). | |
| authorIds | No | Limit to todos authored by these users. Numeric IDs or gid://gitlab/User/N strings. | |
| groupPath | No | Limit to a group by full path. Resolved to a node GID server-side. | |
| projectPath | No | Limit to a project by full path. Resolved to a node GID server-side. | |
| userCredentials | No | Your GitLab credentials (optional — falls back to the configured env token if not provided) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and idempotentHint=true; the description adds real value on top by warning the operation is 'Irreversible without per-item restore_todo calls' and by stating that the updated todos are returned. It does not contradict the annotations — marking done is consistent with both destructive and idempotent hints.
Agents need to know what a tool does to the 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 short sentences, front-loaded with the action and the default no-args behavior before scoping and side effects. No filler; each sentence carries distinct 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?
Covers default behavior, scoping, irreversibility, and the return value in the absence of an output schema. The only gap is the shape of the returned todo list, which is a minor omission for a bulk mutation tool whose annotations already convey the safety profile.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every scoping parameter (type, action, targetId, authorIds, groupPath, projectPath) is already documented in the schema. The description only enumerates the parameter names and says they 'narrow which todos are marked', adding no syntax or resolution detail beyond what the schema provides — 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?
States a specific verb and resource ('Mark pending to-do items as done') plus the exact scope ('for the authenticated user'). The 'all' framing and the no-arguments behavior distinguish it from the singular mark_todo_done sibling without requiring a schema lookup.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 describes the default mode ('With no arguments, marks every pending todo') and when to use the optional scoping args to narrow the set. It also points to restore_todo as the recovery path, though it never names mark_todo_done as the alternative for single-item marking — that is left to inference from the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mark_todo_doneMark Todo DoneAIdempotent
Mark a single to-do item as done for the authenticated user. Requires the todo's ID (numeric or full gid://gitlab/Todo/N form) from list_my_todos.
| Name | Required | Description | Default |
|---|---|---|---|
| todoId | Yes | Todo ID — accepts a bare numeric ID ("42") or a full gid ("gid://gitlab/Todo/42") | |
| userCredentials | No | Your GitLab credentials (optional — falls back to the configured env token if not provided) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, and destructiveHint=false, so safety and repeat-call behavior are covered structurally. The description adds the single-item scope and the ID source, but says nothing about reversibility even though a restore_todo sibling exists — that is the one behavioral fact an agent most needs here.
Agents need to know what a tool does to the 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 short sentences, zero filler, with the action front-loaded and the prerequisite ID source trailing. Nothing is padded or repeated beyond what the schema requires.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter mutation with full schema coverage, full safety annotations, and no output schema, the definition is nearly sufficient. The remaining gap is that it does not tell the agent the change can be undone via restore_todo or what a failure (e.g. already-done todo) looks like.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the todoId description already documents both the bare numeric and gid://gitlab/Todo/N forms. The description merely restates the accepted formats and adds no new meaning about the optional userCredentials fallback, 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 specific verb+resource+scope: "Mark a single to-do item as done for the authenticated user." The word "single" implicitly carves it out from the sibling mark_all_todos_done, but no sibling (e.g. mark_all_todos_done, restore_todo) is named, so an agent must still infer the boundary from the 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 phrase "from list_my_todos" gives a useful workflow pointer on where the required ID comes from, which is genuine routing value. However, there is no explicit when-to-use/when-not guidance and no mention of the inverse operation restore_todo, so the alternative-selection story is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resolve_pathResolve PathBRead-onlyIdempotent
Resolve a GitLab path to either a project or group and list group projects when applicable
| Name | Required | Description | Default |
|---|---|---|---|
| after | No | Pagination cursor. To fetch the next page, pass the previous response pageInfo.endCursor here and repeat until pageInfo.hasNextPage is false. Paginating this way is the reliable path to complete results and accurate totals. | |
| first | No | Number of items to retrieve when listing group projects | |
| fullPath | Yes | Project or group full path (e.g., "group/subgroup/project") | |
| userCredentials | No | Your GitLab credentials (optional — falls back to the configured env token if not provided) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is fully covered and the description need not repeat it. The description does add one real behavioral fact beyond annotations — that group paths trigger an accompanying project listing — but says nothing about what happens when the path does not exist or is ambiguous between project and group.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with no filler, and the core action is front-loaded. It is slightly over-compressed for a polymorphic tool, but nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description carries the burden of explaining what comes back. It tells the agent that group projects may be listed but not what a resolved project or group record contains, nor how the agent can tell from the response which kind of entity was matched — a meaningful gap for a tool whose whole point is disambiguation.
Complex tools with many parameters or behaviors need more documentation. Simple 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 fullPath, first, after and userCredentials are already documented with examples, defaults and pagination instructions. The description adds no semantics beyond the schema, which is the expected baseline here rather than a deficiency.
Input schemas describe structure but not intent. Descriptions should explain 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: resolve a GitLab path into a project or group, and additionally list that group's projects. The dual-outcome nature is conveyed. It stops short of distinguishing itself from siblings like get_project or search_projects, so an agent must infer when path-based resolution beats ID-based lookup.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 is only implied: the agent gathers that this is the tool for when it holds a full path string rather than a numeric ID. There is no explicit when-to-use, no exclusion, and no pointer to alternatives such as get_project or search_projects. 'When applicable' leaves the listing condition undefined.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
restore_todoRestore TodoAIdempotent
Restore a previously-marked-done to-do item back to pending state. Accepts the todo's ID (numeric or full gid://gitlab/Todo/N form).
| Name | Required | Description | Default |
|---|---|---|---|
| todoId | Yes | Todo ID — accepts a bare numeric ID ("42") or a full gid ("gid://gitlab/Todo/42") | |
| userCredentials | No | Your GitLab credentials (optional — falls back to the configured env token if not provided) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare the operation non-read-only, idempotent, and non-destructive. The description adds useful detail about the exact state change and accepted ID formats, but it does not cover error behavior, permissions, or what happens if the item is already pending.
Agents need to know what a tool does to the 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 short sentences front-load the core operation and then supply the ID format detail. There is no filler, and every sentence contributes to correct 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?
For a simple two-parameter mutation tool with full schema coverage and annotations present, the description gives enough context to call it correctly. Minor gaps remain around return behavior and edge cases like restoring an already-pending todo, but these are not critical.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the todoId parameter is already fully documented in the schema, including both numeric and gid formats. The description repeats that information rather than adding new semantics, which fits 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 states a specific verb (restore) and resource (to-do item), and it precisely defines the state transition from done back to pending. This clearly distinguishes it from siblings such as mark_todo_done.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 phrase 'previously-marked-done to-do item' establishes the condition for use, making it clear this applies only to completed items. It does not explicitly mention alternatives or exclusions, but the inverse relationship to mark_todo_done is obvious.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
revoke_achievementRevoke AchievementADestructiveIdempotent
Revoke one awarded achievement. Provide either userAchievementId, or group + achievementId + username. Username lookup scans recipient pages and rejects ambiguous repeated awards; use a specific userAchievementId in that case. Requires group Maintainer/Owner.
| Name | Required | Description | Default |
|---|---|---|---|
| group | No | Group full path, for example my-group/sub-group. | |
| username | No | ||
| achievementId | No | Numeric achievement ID or gid://gitlab/Achievements::Achievement/<id>. | |
| userCredentials | No | Your GitLab credentials (optional — falls back to the configured env token if not provided) | |
| userAchievementId | No | Numeric award ID or gid://gitlab/Achievements::UserAchievement/<id>. This identifies one award, not the achievement definition. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this destructive, non-read-only, and idempotent, so the safety profile is covered. The description adds genuinely new behavior: username lookup scans recipient pages and rejects ambiguous repeated awards, and the operation requires group Maintainer/Owner. It stops short of describing failure/return behavior, hence a 4 rather than a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the action, then the identifier options, then the edge case and prerequisite. No filler or restatement of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 with zero required params and no output schema, the description covers invocation paths, ambiguity handling, and authorization. Only the result/failure behavior is left implicit, which is a minor gap given no output schema exists to document it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 80%, so the schema already documents most fields; the description still adds the key semantic point that the two parameter sets are mutually exclusive alternatives and reinforces that userAchievementId targets a single award. It does not spell out the username-paging cost beyond the ambiguity note, but it clearly outperforms schema-only 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?
States a specific verb and resource ('Revoke one awarded achievement') and implicitly distinguishes itself from create/update/delete_achievement siblings, which operate on the definition rather than an award. The description also clarifies that userAchievementId identifies an award, not the achievement definition, sharpening the boundary further.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 alternative invocation modes ('either userAchievementId, or group + achievementId + username') plus a fallback rule for ambiguous repeated awards and a required permission level. An agent knows exactly which parameter combination to pick and when to avoid the username path.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_gitlabSearch GitLabARead-onlyIdempotent
Text search across GitLab projects and issues (Note: Does not support filtering by assignee/labels - use search_issues for that. MRs cannot be searched globally - use search_merge_requests with username)
| Name | Required | Description | Default |
|---|---|---|---|
| after | No | Pagination cursor. To fetch the next page, pass the previous response pageInfo.endCursor here and repeat until pageInfo.hasNextPage is false. Paginating this way is the reliable path to complete results and accurate totals. | |
| first | No | Number of results to retrieve per category | |
| fetchAll | No | Fetch multiple pages per category up to first items each (default 20, max 100), starting at after — NOT exhaustive. Each category returns its own pageInfo. Use search_projects and search_issues to continue those categories independently. | |
| searchTerm | No | Search term (leave empty for recent activity) | |
| userCredentials | No | Your GitLab credentials (optional — falls back to the configured env token if not provided) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds genuine scope disclosure beyond the annotations: no assignee/label filtering, no global MR search. It says nothing about result shape or that results are grouped per category, which the schema alludes to only indirectly.
Agents need to know what a tool does to the 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 compact sentences, parenthetically scoped, with the limitations front-loaded and paired directly to the alternative tools. 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 multi-category search with no output schema, the description does not say what the response looks like (separate result sets per category, each with its own pageInfo) even though that shapes how the agent should paginate. The exclusion guidance is strong, but a bigger share of the behavioral burden should rest here given there is 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%, with detailed guidance on after, first, and fetchAll, so the schema carries parameter semantics fully. The description adds nothing about parameters, which is acceptable but is the baseline rather than 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?
States a specific verb and scope: 'Text search across GitLab projects and issues', which is enough to distinguish it from single-resource siblings like get_project or get_issues. It does not, however, clarify its relationship to the near-name siblings search_projects and search_issues, leaving some ambiguity about which to pick for a plain search.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 names two non-obvious exclusions and the correct alternative for each (search_issues for assignee/label filtering, search_merge_requests for MRs). That is real when-not-to-use guidance. The gap is that it never states the primary positive case versus search_projects/search_issues for a simple global text search.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_groupsSearch GroupsCRead-onlyIdempotent
Search for GitLab groups and organizations
| Name | Required | Description | Default |
|---|---|---|---|
| after | No | Pagination cursor. To fetch the next page, pass the previous response pageInfo.endCursor here and repeat until pageInfo.hasNextPage is false. Paginating this way is the reliable path to complete results and accurate totals. | |
| first | No | Number of groups to retrieve | |
| fetchAll | No | Fetch multiple pages in one call, up to "first" items total (max 100) — NOT exhaustive. For complete results or accurate counts, leave this false and paginate via after (pageInfo.endCursor). | |
| searchTerm | Yes | Search term to find groups by name or path | |
| userCredentials | No | Your GitLab credentials (optional — falls back to the configured env token if not provided) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, covering the safety profile. The description adds no further behavioral context, such as pagination behavior, authentication needs, or what the search covers (e.g., partial matches). It does not contradict the annotations, but it contributes almost nothing beyond 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, front-loaded sentence with no wasted words. It is appropriately concise, though it lacks any structural cues or additional sentences that might help an agent understand boundaries.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 (search with pagination and a fetchAll option) and the rich schema coverage, the description is minimal. It does not mention pagination, return format, or how results are ordered, relying entirely on the schema for those details. Since no output schema exists, a brief note on the return value would have been helpful, but the core purpose is at least 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?
The schema has 100% description coverage, so all parameters are fully documented in the schema. The description itself adds no parameter-level information, which is acceptable given the high schema coverage, but it does not exceed 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 states a specific verb ('Search') and resource ('GitLab groups and organizations'), making it clear what the tool does. It does not, however, explicitly distinguish this from sibling search tools such as search_gitlab or search_projects, which leaves some ambiguity about when exactly to choose this tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives, no exclusions, and no mention of prerequisites or typical scenarios. It merely restates the purpose without any usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_issuesSearch IssuesBRead-onlyIdempotent
Search for issues with text search and/or structured filtering (assignee, author, labels, state). For filtering by assignee/author/labels without text search, leave searchTerm empty.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Sort order (e.g., UPDATED_DESC, CREATED_DESC, CREATED_ASC). Defaults to UPDATED_DESC for recency. | |
| after | No | Pagination cursor. To fetch the next page, pass the previous response pageInfo.endCursor here and repeat until pageInfo.hasNextPage is false. Paginating this way is the reliable path to complete results and accurate totals. | |
| first | No | Number of issues to retrieve | |
| state | No | Filter by issue state (opened, closed, all) | all |
| fetchAll | No | Fetch multiple pages in one call, up to "first" items total (max 100) — NOT exhaustive. For complete results or accurate counts, leave this false and paginate via after (pageInfo.endCursor). | |
| labelNames | No | Filter by label names (e.g., ["Priority::High", "bug"]) | |
| searchTerm | No | Text search term (optional - leave empty to filter by assignee/author/labels only) | |
| projectPath | No | Optional project path (e.g., "group/project"). Omit for global search. | |
| authorUsername | No | Filter by author username (e.g., "cdhanlon") | |
| userCredentials | No | Your GitLab credentials (optional — falls back to the configured env token if not provided) | |
| assigneeUsernames | No | Filter by assignee usernames (e.g., ["cdhanlon", "jsmith"]) |
Output Schema
| Name | Required | Description |
|---|---|---|
| nodes | Yes | |
| hasMore | No | |
| pageInfo | Yes | |
| totalFetched | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is fully covered without the description. The description contributes the combining semantics of text search and structured filters, but says nothing about pagination, result caps, or fetchAll trade-offs — those caveats live only in the schema, not in the description.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core capability and followed immediately by the one actionable tip. No filler, though the brevity leaves useful routing information unsaid.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists and the input schema is richly annotated, so return values and parameter mechanics need not be repeated. What is missing is sibling disambiguation against get_issues, get_user_issues, and search_gitlab, which is the main open question for an agent choosing among many search-shaped tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every one of the 11 parameters is already documented, including the important fetchAll/pagination distinction. The description's only parameter-related statement (leave searchTerm empty for filter-only queries) restates what the searchTerm schema text already says, adding no 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 names a specific verb and resource ('Search for issues') and enumerates the supported filter dimensions (assignee, author, labels, state), so an agent knows exactly what the tool returns. It does not, however, distinguish itself from close siblings such as get_issues, get_user_issues, or search_gitlab, which an agent must disambiguate on its own.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'For filtering by assignee/author/labels without text search, leave searchTerm empty' is genuine usage guidance for one combination of inputs. But there is no statement about when to prefer this over get_issues, get_user_issues, or the broader search_gitlab, which is the harder routing decision in a ~50-tool namespace.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_labelsSearch LabelsBRead-onlyIdempotent
Search for labels in a project or group, with optional text filtering
| Name | Required | Description | Default |
|---|---|---|---|
| after | No | Pagination cursor. To fetch the next page, pass the previous response pageInfo.endCursor here and repeat until pageInfo.hasNextPage is false. Paginating this way is the reliable path to complete results and accurate totals. | |
| first | No | Number of labels to retrieve | |
| search | No | Optional search term to filter labels | |
| fetchAll | No | Fetch multiple pages in one call, up to "first" items total (max 100) — NOT exhaustive. For complete results or accurate counts, leave this false and paginate via after (pageInfo.endCursor). | |
| fullPath | Yes | Full path of the project or group (e.g., "group/project-name" or "group") | |
| isProject | Yes | Whether the path is a project (true) or group (false) | |
| userCredentials | No | Your GitLab credentials (optional — falls back to the configured env token if not provided) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds scope and filtering context, but does not explain pagination behavior, return format, or rate limits. This is adequate but not rich beyond 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 efficient sentence with the core purpose front-loaded. There is no wasted text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the fully documented schema and read-only annotations, the description is mostly complete for correct invocation. It omits explicit routing guidance versus sibling search tools, but the essential scope and filtering behavior are 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 all seven parameters are already documented in the schema. The description only reiterates project/group scope and optional text filtering, adding little beyond what the schema provides. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: search labels. It also names the scope (project or group) and optional text filtering. It does not explicitly differentiate this tool from sibling search tools, which keeps it below a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains what the tool does but gives no explicit when-to-use guidance, prerequisites, or alternatives. An agent must infer that this is the label-specific search tool from the name and purpose alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_merge_requestsSearch Merge RequestsARead-onlyIdempotent
Search merge requests by username (supports "username", "author:username", "assignee:username") or search within a specific project. Note: GitLab does not support global text search for MRs - use projectPath for text searches.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Sort order (e.g., UPDATED_DESC, CREATED_DESC, CREATED_ASC). Defaults to UPDATED_DESC for recency. | |
| after | No | Pagination cursor. To fetch the next page, pass the previous response pageInfo.endCursor here and repeat until pageInfo.hasNextPage is false. Paginating this way is the reliable path to complete results and accurate totals. | |
| first | No | Number of merge requests to retrieve | |
| state | No | Filter by merge request state (opened, closed, merged, all) | all |
| fetchAll | No | Fetch multiple pages in one call, up to "first" items total (max 100) — NOT exhaustive. For complete results or accurate counts, leave this false and paginate via after (pageInfo.endCursor). | |
| searchTerm | Yes | Username (e.g., "cdhanlon", "author:username", "assignee:username") or text when projectPath provided | |
| projectPath | No | Project path (e.g., "group/project"). Required for text searches, optional for username searches. | |
| userCredentials | No | Your GitLab credentials (optional — falls back to the configured env token if not provided) |
Output Schema
| Name | Required | Description |
|---|---|---|
| nodes | Yes | |
| hasMore | No | |
| pageInfo | Yes | |
| totalFetched | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds the useful platform limitation about no global text search, but that constraint is largely mirrored in the schema's searchTerm and projectPath descriptions, and nothing is said about result volume 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?
Two short sentences, zero filler, with the primary search modes stated first and the important limitation immediately after. Nothing needs trimming.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 an output schema, full parameter documentation, and safety annotations, the description only needs to convey search semantics and platform limits — both are present. The remaining gap is routing: in a sibling set containing get_merge_requests, get_user_merge_requests, and search_gitlab, it does not say which to prefer.
Complex tools with many parameters or behaviors need more documentation. Simple 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 eight parameters are documented in the schema itself, including sort, paging via after/first, state, and the searchTerm/projectPath relationship. The description repeats the username formats without adding syntax or behavior beyond what the schema already states; 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 gives a specific verb and resource plus the two operating modes: username search (with author:/assignee: prefixes) or search scoped to a project. It does not, however, distinguish itself from close siblings such as get_merge_requests, get_user_merge_requests, or search_gitlab, so an agent must infer the difference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 an explicit usage constraint — GitLab does not support global text search for MRs, so text searches must supply projectPath. That is a real when/when-not with a prescribed remedy, but no sibling alternative is named for cases like listing MRs without a search term.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_notesSearch Notes (Comments)ARead-onlyIdempotent
Full-text search across issue and merge request comments. Scope can be global, a project, or a group. NOTE: on self-hosted GitLab, the "notes" search scope requires Advanced Search (Elasticsearch) to be enabled — without it, this endpoint returns an error. search_gitlab does NOT search note bodies; this tool does.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number. Default 1. | |
| scope | No | Search scope. Default global. | global |
| search | Yes | Search term. Trimmed; empty rejected. | |
| perPage | No | Results per page. Default 20. | |
| groupPath | No | Required when scope=group. Full group path. | |
| projectPath | No | Required when scope=project. Full project path. | |
| userCredentials | No | Your GitLab credentials (optional — falls back to the configured env token if not provided) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), and the description adds real behavioral context beyond them: the self-hosted GitLab requirement for Advanced Search/Elasticsearch and the error that results when it is absent. It doesn't discuss result caps or pagination behavior, but the prerequisite disclosure is the high-value item here.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences with zero filler: capability first, scope second, the environment caveat and sibling distinction after. Nothing is repeated from annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 would ideally hint at the return shape, but it fully covers prerequisites, scope semantics, and sibling differentiation for a read-only search tool. An agent has everything needed 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 all seven parameters including scope enum and conditional path requirements are already documented in structured form. The description reinforces scope choices but adds no format or syntax detail beyond the schema, so 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 and resource ("Full-text search across issue and merge request comments") and immediately names the scope variants. The final clause distinguishes it from search_gitlab, so an agent can pick between the two 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 routes agents away from search_gitlab when note bodies matter, and enumerates the three scope options with the required path params documented in the schema. It doesn't cover when to prefer get_notes over this search, but the primary alternative is handled clearly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_projectsSearch ProjectsCRead-onlyIdempotent
Search for GitLab projects by name or description
| Name | Required | Description | Default |
|---|---|---|---|
| after | No | Pagination cursor. To fetch the next page, pass the previous response pageInfo.endCursor here and repeat until pageInfo.hasNextPage is false. Paginating this way is the reliable path to complete results and accurate totals. | |
| first | No | Number of projects to retrieve | |
| fetchAll | No | Fetch multiple pages in one call, up to "first" items total (max 100) — NOT exhaustive. For complete results or accurate counts, leave this false and paginate via after (pageInfo.endCursor). | |
| searchTerm | Yes | Search term to find projects by name or description | |
| userCredentials | No | Your GitLab credentials (optional — falls back to the configured env token if not provided) |
Output Schema
| Name | Required | Description |
|---|---|---|
| nodes | Yes | |
| hasMore | No | |
| pageInfo | Yes | |
| totalFetched | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description adds nothing beyond that: no mention of result scope (own vs. all visible projects), no mention of the pagination/fetchAll trade-off, and no note on the credential fallback 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?
A single eight-word sentence with no padding and the core purpose front-loaded. It is efficient, though its brevity comes at the cost of the usage and scope guidance noted elsewhere.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists and the input schema is fully annotated, so return values and parameters need not be re-explained. Still, for a search tool in a large sibling set, the description omits scope and alternatives, leaving gaps an agent must resolve by inspecting other tools.
Complex tools with many parameters or behaviors need more documentation. Simple 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 searchTerm, first, after, fetchAll and userCredentials in detail, including the important warning that fetchAll is not exhaustive. The description only echoes the searchTerm semantics, which is the correct baseline-3 outcome when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (search) and resource (GitLab projects) plus the fields matched (name or description), so an agent knows exactly what it retrieves. It does not, however, contrast itself with siblings like get_projects or get_group_projects, so sibling disambiguation is left to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 statement of when to use this tool versus listing tools (get_projects, get_group_projects) or the other search_* tools, and no prerequisites or exclusions are given. The only usage-relevant details live in the schema's pagination parameters, not the description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_usersSearch UsersBRead-onlyIdempotent
Search for GitLab users by username or name - useful for finding team members or contributors
| Name | Required | Description | Default |
|---|---|---|---|
| after | No | Pagination cursor. To fetch the next page, pass the previous response pageInfo.endCursor here and repeat until pageInfo.hasNextPage is false. Paginating this way is the reliable path to complete results and accurate totals. | |
| first | No | Number of users to retrieve | |
| fetchAll | No | Fetch multiple pages in one call, up to "first" items total (max 100) — NOT exhaustive. For complete results or accurate counts, leave this false and paginate via after (pageInfo.endCursor). | |
| searchTerm | Yes | Search term to find users by username or name | |
| userCredentials | No | Your GitLab credentials (optional — falls back to the configured env token if not provided) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered, but the description adds nothing behavioral beyond restating the search fields. There is no guidance on partial vs exact matching, result ordering, or what happens with an empty/broad term — meaningful gaps for a search endpoint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with the verb and resource up front; no waste. The trailing 'useful for finding team members or contributors' is mildly redundant with the purpose clause but cheap.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Five parameters, all fully documented in schema, and no output schema — so the description only needs to be complete on intent and semantics. It is adequate for choosing the tool but leaves the non-obvious pagination behavior (fetchAll is not exhaustive) entirely to the schema, and never says what a user record contains.
Complex tools with many parameters or behaviors need more documentation. Simple 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 pagination (after/first/fetchAll) and the credential override, so the baseline of 3 applies. The description contributes no additional parameter meaning and never mentions the pagination tradeoff, which is the trickiest part of calling this tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb+resource (search users) and scopes the match fields to 'username or name', which distinguishes it cleanly from the many other search_* siblings (search_projects, search_issues, search_groups). It stops short of explicitly contrasting with get_current_user or list_group_members, which also surface users.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Useful for finding team members or contributors' implies the lookup use case but gives no when-not conditions and names no alternative. An agent must infer on its own whether to use this versus list_group_members or get_current_user.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_achievementUpdate AchievementAIdempotent
Update an achievement name or description. Requires group Maintainer/Owner. Provide at least one changed field; an empty description clears it.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| description | No | ||
| achievementId | Yes | Numeric achievement ID or gid://gitlab/Achievements::Achievement/<id>. | |
| userCredentials | No | Your GitLab credentials (optional — falls back to the configured env token if not provided) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, and destructiveHint=false, so safety is partly covered. The description adds genuinely non-structured behavior: the required role and the subtle rule that passing an empty description clears the field — a mutation semantic an agent could not infer from 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 short sentences, zero filler, with the core action and the mutable fields front-loaded before prerequisites and the clearing caveat.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 four-parameter mutation with no output schema, the description covers the essentials: what changes, who may call it, and the minimum-one-field requirement. It omits return behavior and the credential parameter, but neither is likely to block a correct 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 coverage is 50% — achievementId and userCredentials are documented in-schema, while name and description are bare. The description partially compensates by naming those two fields and explaining the empty-string-clears behavior for description, but it says nothing about the credential parameter or name constraints.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Update an achievement") plus the exact mutable fields (name, description), which cleanly separates it from the sibling create_achievement, delete_achievement, award_achievement, and list_achievements. An agent can select this 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?
"Requires group Maintainer/Owner" gives an explicit permission prerequisite, and "Provide at least one changed field" states a precondition for a valid call. It does not point at sibling alternatives (e.g., create vs award vs update), so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_broadcast_messageUpdate Broadcast MessageBIdempotent
Update an existing GitLab broadcast message. Requires administrator privileges.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Broadcast message ID | |
| font | No | Foreground (font) color in hex format | |
| color | No | Background color in hex format, e.g. "#E75E40" | |
| theme | No | Theme name (GitLab 16.9+), e.g. "indigo", "red" | |
| ends_at | No | ISO 8601 timestamp when the message ends | |
| message | No | Message text to display | |
| starts_at | No | ISO 8601 timestamp when the message starts | |
| dismissable | No | Whether users can dismiss the broadcast message | |
| target_path | No | Path glob for pages where the message should appear | |
| broadcast_type | No | Broadcast type: "banner" or "notification" | |
| userCredentials | No | Your GitLab credentials (optional — falls back to the configured env token if not provided) | |
| target_access_levels | No | Access levels to target: 10=Guest, 20=Reporter, 30=Developer, 40=Maintainer, 50=Owner |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true and destructiveHint=false, so the mutation/safety profile is covered. The description adds the admin-privilege requirement, which is genuine auth context, but omits what happens to fields not supplied (merge vs. replace) — important for a 12-param update 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?
Two short sentences, front-loaded with the action and followed by the permission constraint. No filler, though there is very little content to 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 12-parameter mutation with no output schema, the description covers identity and access requirements but not update semantics (which fields are optional, whether omitted fields are cleared) or any return information. Adequate to attempt the call correctly, but thin at the edges.
Complex tools with many parameters or behaviors need more documentation. Simple 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 12 parameters including enums and access-level encoding are documented in the schema itself. The description adds no additional meaning beyond that, which is the expected baseline when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Update an existing GitLab broadcast message"), which is unambiguous against siblings like create_broadcast_message or delete_broadcast_message. It doesn't explicitly name alternatives, but the operation class is clear from the verb.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Requires administrator privileges" is a useful precondition that tells the agent when the call will fail. However, it says nothing about partial vs. full update semantics or when to prefer this over create/delete for a message, leaving usage largely implied by the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_issueUpdate IssueBIdempotent
Update an issue (title, description, assignees, labels, due date) with schema-aware mutations
| Name | Required | Description | Default |
|---|---|---|---|
| iid | Yes | Issue IID (internal ID shown in the URL) | |
| title | No | ||
| dueDate | No | YYYY-MM-DD | |
| labelNames | No | ||
| description | No | ||
| projectPath | Yes | Full path of the project (e.g., "group/project-name") | |
| userCredentials | No | Your GitLab credentials (optional — falls back to the configured env token if not provided) | |
| assigneeUsernames | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, destructiveHint=false, so the safety profile is covered. The description adds only the vague phrase 'schema-aware mutations', which leaves the critical partial-update question unanswered: are omitted fields (labels, assignees, due date) preserved or cleared, and do label/assignee arrays replace or append?
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with the resource and fields stated immediately. The trailing clause 'with schema-aware mutations' is jargon that consumes space without conveying actionable 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 an 8-parameter mutation tool with no output schema and only 50% schema coverage, the description omits partial-update semantics, credential fallback behavior beyond the schema note, permission requirements, and any indication of what a successful update returns.
Complex tools with many parameters or behaviors need more documentation. Simple 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 50%; iid, projectPath, dueDate and userCredentials are documented in the schema, while title, description, labelNames and assigneeUsernames are bare. The description names the mutable fields, partially compensating, but adds no semantics such as replace-vs-append behavior for label and assignee arrays.
Input schemas describe structure but not intent. Descriptions should explain 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 ('Update') plus resource ('an issue') and enumerates the mutable fields, so an agent immediately knows what the tool does. Sibling differentiation is implicit only (create_issue / delete_issue / get_issues are distinguished by verb), but nothing is 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?
There is no guidance on when to reach for this tool versus create_issue, delete_issue, or the generic execute_rest_write, and no stated prerequisites (valid projectPath/iid, permissions). Usage is only inferred from the verb 'update'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_merge_requestUpdate Merge RequestBIdempotent
Update a merge request (title, description, assignees, reviewers, labels) with schema-aware mutations
| Name | Required | Description | Default |
|---|---|---|---|
| iid | Yes | Merge Request IID (internal ID shown in the URL) | |
| title | No | ||
| labelNames | No | ||
| description | No | ||
| projectPath | Yes | Full path of the project (e.g., "group/project-name") | |
| userCredentials | No | Your GitLab credentials (optional — falls back to the configured env token if not provided) | |
| assigneeUsernames | No | ||
| reviewerUsernames | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, and destructiveHint=false, so safety is covered externally. The description adds nothing beyond them: "schema-aware mutations" is undefined, and it never says whether omitted fields are left untouched, whether partial updates are safe, or what permissions the token needs. For a mutation tool the patch semantics are exactly what the agent needs and they are missing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with the resource and the mutable fields up front; there is no filler. It is arguably too terse rather than too long, and the closing formula is the only wasted 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?
Placed at 4 because the description is compact but the structured data carries the load: annotations cover safety and idempotency, and the schema covers the required identifiers and the credentials parameter. The description reasonably confines itself to listing the mutable fields. It stops short of 5 because the field list is the only thing it contributes and no patch semantics are added.
Complex tools with many parameters or behaviors need more documentation. Simple 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 only 38%; the schema describes iid, projectPath, and userCredentials, while the description names the remaining five fields (title, description, assignees, reviewers, labels) — so the two together cover all eight parameters by name. However, the description supplies no semantics for those fields: no array-format hints for usernames/labels, no indication of replace-vs-merge behavior for arrays.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Update a merge request") and enumerates the mutable fields (title, description, assignees, reviewers, labels), which makes it distinguishable from sibling create_merge_request. The trailing phrase "schema-aware mutations" is jargon that adds no discriminating information, and the tool's most consequential capability (changing MR state) is absent.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 guidance on when to choose this over create_merge_request, update_issue, or execute_rest_write, and no preconditions (permissions, MR must exist, MR must be open) are stated. An agent must infer everything about applicability from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_noteUpdate NoteAIdempotent
Edit the body of an existing comment (note) on a GitLab issue or merge request. Requires a user token belonging to the note author.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | New note body (Markdown supported) | |
| noteId | Yes | Note ID — either the bare numeric ID or the full GraphQL gid (gid://gitlab/Note/123) | |
| userCredentials | No | Your GitLab credentials (optional — falls back to the configured env token if not provided) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, and destructiveHint=false, so safety and repeat-call behavior are covered. The description contributes non-annotation context: the authorization constraint that the token must be the note author's, which is the main failure mode an agent needs to anticipate.
Agents need to know what a tool does to the 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 short sentences with the action and scope front-loaded and the auth requirement immediately after. No filler, nothing repeated from 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 simple mutation with full schema coverage, annotations, and only three parameters, this covers what an agent must know to call it correctly. Minor gaps remain — no note that only the body is editable (not other note attributes) and no mention of what a successful update returns, though no output schema exists to lean on.
Complex tools with many parameters or behaviors need more documentation. Simple 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%, including the bare-ID-vs-GraphQL-gid format for noteId and Markdown support for body, so the schema carries parameter meaning. The description only implies that body is the field being changed; it adds no format or constraint detail beyond the schema, making the baseline 3 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 (edit) and resource (the body of an existing note) and scopes it to GitLab issues/merge requests, which clearly separates it from create_note and delete_note. It doesn't explicitly name those siblings, but the mutation scope 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?
Adds a concrete precondition — the token must belong to the note author — which tells the agent when this call will succeed versus fail. It stops short of naming alternatives (e.g., use create_note for new comments) or stating exclusions, so it is clear context without full routing guidance.
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.
69 tool updates
v4.0.0- Changed
analytics_group_summary2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / userCredentials / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "accessToken": { - "minLength": 1, - "type": "string" - }, - "gitlabUrl": { - "format": "uri", - "type": "string" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "accessToken": { + "minLength": 1, + "type": "string" + }, + "gitlabUrl": { + "format": "uri", + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } +]
- Changed
analytics_review_bottlenecks3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / staleAfterDays / maximumAdded value: +9007199254740991 - changed
Input schema / properties / userCredentials / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "accessToken": { - "minLength": 1, - "type": "string" - }, - "gitlabUrl": { - "format": "uri", - "type": "string" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "accessToken": { + "minLength": 1, + "type": "string" + }, + "gitlabUrl": { + "format": "uri", + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } +]
- Changed
analytics_user_summary2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / userCredentials / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "accessToken": { - "minLength": 1, - "type": "string" - }, - "gitlabUrl": { - "format": "uri", - "type": "string" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "accessToken": { + "minLength": 1, + "type": "string" + }, + "gitlabUrl": { + "format": "uri", + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } +]
- Added
award_achievement - Changed
browse_repository2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / userCredentials / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "accessToken": { - "minLength": 1, - "type": "string" - }, - "gitlabUrl": { - "format": "uri", - "type": "string" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "accessToken": { + "minLength": 1, + "type": "string" + }, + "gitlabUrl": { + "format": "uri", + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } +]
- Added
create_achievement - Changed
create_broadcast_message6 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / ends_at / patternAdded value: +"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$" - added
Input schema / properties / starts_at / patternAdded value: +"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$" - added
Input schema / properties / target_access_levels / items / maximumAdded value: +9007199254740991 - added
Input schema / properties / target_access_levels / items / minimumAdded value: +-9007199254740991 - changed
Input schema / properties / userCredentials / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "accessToken": { - "minLength": 1, - "type": "string" - }, - "gitlabUrl": { - "format": "uri", - "type": "string" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "accessToken": { + "minLength": 1, + "type": "string" + }, + "gitlabUrl": { + "format": "uri", + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } +]
- Changed
create_issue3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / userCredentials / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "accessToken": { - "minLength": 1, - "type": "string" - }, - "gitlabUrl": { - "format": "uri", - "type": "string" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "accessToken": { + "minLength": 1, + "type": "string" + }, + "gitlabUrl": { + "format": "uri", + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } +] - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": {}, + "properties": { + "id": { + "type": "string" + }, + "iid": { + "type": "string" + }, + "title": { + "type": "string" + }, + "webUrl": { + "type": "string" + } + }, + "required": [ + "id", + "iid", + "title", + "webUrl" + ], + "type": "object" +}
- Changed
create_merge_request3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / userCredentials / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "accessToken": { - "minLength": 1, - "type": "string" - }, - "gitlabUrl": { - "format": "uri", - "type": "string" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "accessToken": { + "minLength": 1, + "type": "string" + }, + "gitlabUrl": { + "format": "uri", + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } +] - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": {}, + "properties": { + "id": { + "type": "string" + }, + "iid": { + "type": "string" + }, + "title": { + "type": "string" + }, + "webUrl": { + "type": "string" + } + }, + "required": [ + "id", + "iid", + "title", + "webUrl" + ], + "type": "object" +}
- Changed
create_note2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / userCredentials / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "accessToken": { - "minLength": 1, - "type": "string" - }, - "gitlabUrl": { - "format": "uri", - "type": "string" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "accessToken": { + "minLength": 1, + "type": "string" + }, + "gitlabUrl": { + "format": "uri", + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } +]
- Added
delete_achievement - Changed
delete_broadcast_message4 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / id / maximumAdded value: +9007199254740991 - added
Input schema / properties / id / minimumAdded value: +-9007199254740991 - changed
Input schema / properties / userCredentials / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "accessToken": { - "minLength": 1, - "type": "string" - }, - "gitlabUrl": { - "format": "uri", - "type": "string" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "accessToken": { + "minLength": 1, + "type": "string" + }, + "gitlabUrl": { + "format": "uri", + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } +]
- Changed
delete_issue2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / userCredentials / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "accessToken": { - "minLength": 1, - "type": "string" - }, - "gitlabUrl": { - "format": "uri", - "type": "string" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "accessToken": { + "minLength": 1, + "type": "string" + }, + "gitlabUrl": { + "format": "uri", + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } +]
- Changed
delete_note2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / userCredentials / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "accessToken": { - "minLength": 1, - "type": "string" - }, - "gitlabUrl": { - "format": "uri", - "type": "string" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "accessToken": { + "minLength": 1, + "type": "string" + }, + "gitlabUrl": { + "format": "uri", + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } +]
- Changed
execute_custom_query3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / userCredentials / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "accessToken": { - "minLength": 1, - "type": "string" - }, - "gitlabUrl": { - "format": "uri", - "type": "string" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "accessToken": { + "minLength": 1, + "type": "string" + }, + "gitlabUrl": { + "format": "uri", + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } +] - added
Input schema / properties / variables / propertyNamesAdded value: +{ + "type": "string" +}
- Changed
execute_rest_read3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / query / propertyNamesAdded value: +{ + "type": "string" +} - changed
Input schema / properties / userCredentials / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "accessToken": { - "minLength": 1, - "type": "string" - }, - "gitlabUrl": { - "format": "uri", - "type": "string" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "accessToken": { + "minLength": 1, + "type": "string" + }, + "gitlabUrl": { + "format": "uri", + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } +]
- Changed
execute_rest_write5 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / body / anyOfAdded value: +[ + { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + { + "items": {}, + "type": "array" + }, + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "null" + } +] - changed
Input schema / properties / body / descriptionPrevious value: -"Request body — JSON-serialized as application/json. Omit for endpoints that don't take a body (most DELETE / some PUT)."New value: +"Request body as a JSON value or JSON-encoded string. Sent as application/json; nested objects are preserved. Omit for endpoints that don't take a body (most DELETE / some PUT)." - added
Input schema / properties / query / propertyNamesAdded value: +{ + "type": "string" +} - changed
Input schema / properties / userCredentials / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "accessToken": { - "minLength": 1, - "type": "string" - }, - "gitlabUrl": { - "format": "uri", - "type": "string" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "accessToken": { + "minLength": 1, + "type": "string" + }, + "gitlabUrl": { + "format": "uri", + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } +]
- Changed
get_available_queries1 field changed- changed
Input schema / properties / userCredentials / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "accessToken": { - "minLength": 1, - "type": "string" - }, - "gitlabUrl": { - "format": "uri", - "type": "string" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "accessToken": { + "minLength": 1, + "type": "string" + }, + "gitlabUrl": { + "format": "uri", + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } +]
- Changed
get_broadcast_message4 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / id / maximumAdded value: +9007199254740991 - added
Input schema / properties / id / minimumAdded value: +-9007199254740991 - changed
Input schema / properties / userCredentials / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "accessToken": { - "minLength": 1, - "type": "string" - }, - "gitlabUrl": { - "format": "uri", - "type": "string" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "accessToken": { + "minLength": 1, + "type": "string" + }, + "gitlabUrl": { + "format": "uri", + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } +]
- Changed
get_current_user2 fields changed- changed
Input schema / properties / userCredentials / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "accessToken": { - "minLength": 1, - "type": "string" - }, - "gitlabUrl": { - "format": "uri", - "type": "string" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "accessToken": { + "minLength": 1, + "type": "string" + }, + "gitlabUrl": { + "format": "uri", + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } +] - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": {}, + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "required": [ + "id", + "username", + "name" + ], + "type": "object" +}
- Changed
get_file_content2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / userCredentials / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "accessToken": { - "minLength": 1, - "type": "string" - }, - "gitlabUrl": { - "format": "uri", - "type": "string" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "accessToken": { + "minLength": 1, + "type": "string" + }, + "gitlabUrl": { + "format": "uri", + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } +]
- Changed
get_group_projects2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / userCredentials / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "accessToken": { - "minLength": 1, - "type": "string" - }, - "gitlabUrl": { - "format": "uri", - "type": "string" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "accessToken": { + "minLength": 1, + "type": "string" + }, + "gitlabUrl": { + "format": "uri", + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } +]
- Changed
get_issue_context2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / userCredentials / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "accessToken": { - "minLength": 1, - "type": "string" - }, - "gitlabUrl": { - "format": "uri", - "type": "string" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "accessToken": { + "minLength": 1, + "type": "string" + }, + "gitlabUrl": { + "format": "uri", + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } +]
- Changed
get_issues3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / userCredentials / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "accessToken": { - "minLength": 1, - "type": "string" - }, - "gitlabUrl": { - "format": "uri", - "type": "string" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "accessToken": { + "minLength": 1, + "type": "string" + }, + "gitlabUrl": { + "format": "uri", + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } +] - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": {}, + "properties": { + "hasMore": { + "type": "boolean" + }, + "nodes": { + "items": { + "additionalProperties": {}, + "properties": { + "id": { + "type": "string" + }, + "iid": { + "type": "string" + }, + "title": { + "type": "string" + }, + "webUrl": { + "type": "string" + } + }, + "required": [ + "id", + "iid", + "title", + "webUrl" + ], + "type": "object" + }, + "type": "array" + }, + "pageInfo": { + "additionalProperties": {}, + "properties": { + "endCursor": { + "type": [ + "string", + "null" + ] + }, + "hasNextPage": { + "type": "boolean" + }, + "hasPreviousPage": { + "type": "boolean" + }, + "startCursor": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "hasNextPage", + "endCursor" + ], + "type": "object" + }, + "totalFetched": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "nodes", + "pageInfo" + ], + "type": "object" +}
- Changed
get_merge_request_commits2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / userCredentials / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "accessToken": { - "minLength": 1, - "type": "string" - }, - "gitlabUrl": { - "format": "uri", - "type": "string" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "accessToken": { + "minLength": 1, + "type": "string" + }, + "gitlabUrl": { + "format": "uri", + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } +]
- Changed
get_merge_request_context2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / userCredentials / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "accessToken": { - "minLength": 1, - "type": "string" - }, - "gitlabUrl": { - "format": "uri", - "type": "string" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "accessToken": { + "minLength": 1, + "type": "string" + }, + "gitlabUrl": { + "format": "uri", + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } +]
- Changed
get_merge_request_diffs2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / userCredentials / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "accessToken": { - "minLength": 1, - "type": "string" - }, - "gitlabUrl": { - "format": "uri", - "type": "string" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "accessToken": { + "minLength": 1, + "type": "string" + }, + "gitlabUrl": { + "format": "uri", + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } +]
- Changed
get_merge_request_pipelines2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / userCredentials / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "accessToken": { - "minLength": 1, - "type": "string" - }, - "gitlabUrl": { - "format": "uri", - "type": "string" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "accessToken": { + "minLength": 1, + "type": "string" + }, + "gitlabUrl": { + "format": "uri", + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } +]
- Changed
get_merge_request_reviewers2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / userCredentials / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "accessToken": { - "minLength": 1, - "type": "string" - }, - "gitlabUrl": { - "format": "uri", - "type": "string" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "accessToken": { + "minLength": 1, + "type": "string" + }, + "gitlabUrl": { + "format": "uri", + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } +]
- Changed
get_merge_requests3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / userCredentials / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "accessToken": { - "minLength": 1, - "type": "string" - }, - "gitlabUrl": { - "format": "uri", - "type": "string" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "accessToken": { + "minLength": 1, + "type": "string" + }, + "gitlabUrl": { + "format": "uri", + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } +] - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": {}, + "properties": { + "hasMore": { + "type": "boolean" + }, + "nodes": { + "items": { + "additionalProperties": {}, + "properties": { + "id": { + "type": "string" + }, + "iid": { + "type": "string" + }, + "title": { + "type": "string" + }, + "webUrl": { + "type": "string" + } + }, + "required": [ + "id", + "iid", + "title", + "webUrl" + ], + "type": "object" + }, + "type": "array" + }, + "pageInfo": { + "additionalProperties": {}, + "properties": { + "endCursor": { + "type": [ + "string", + "null" + ] + }, + "hasNextPage": { + "type": "boolean" + }, + "hasPreviousPage": { + "type": "boolean" + }, + "startCursor": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "hasNextPage", + "endCursor" + ], + "type": "object" + }, + "totalFetched": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "nodes", + "pageInfo" + ], + "type": "object" +}
- Changed
get_notes2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / userCredentials / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "accessToken": { - "minLength": 1, - "type": "string" - }, - "gitlabUrl": { - "format": "uri", - "type": "string" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "accessToken": { + "minLength": 1, + "type": "string" + }, + "gitlabUrl": { + "format": "uri", + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } +]
- Changed
get_pipeline_jobs2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / userCredentials / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "accessToken": { - "minLength": 1, - "type": "string" - }, - "gitlabUrl": { - "format": "uri", - "type": "string" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "accessToken": { + "minLength": 1, + "type": "string" + }, + "gitlabUrl": { + "format": "uri", + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } +]
- Changed
get_project3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / userCredentials / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "accessToken": { - "minLength": 1, - "type": "string" - }, - "gitlabUrl": { - "format": "uri", - "type": "string" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "accessToken": { + "minLength": 1, + "type": "string" + }, + "gitlabUrl": { + "format": "uri", + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } +] - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": {}, + "properties": { + "fullPath": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "webUrl": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "fullPath", + "webUrl" + ], + "type": "object" +}
- Changed
get_project_statistics2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / userCredentials / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "accessToken": { - "minLength": 1, - "type": "string" - }, - "gitlabUrl": { - "format": "uri", - "type": "string" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "accessToken": { + "minLength": 1, + "type": "string" + }, + "gitlabUrl": { + "format": "uri", + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } +]
- Changed
get_projects3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / userCredentials / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "accessToken": { - "minLength": 1, - "type": "string" - }, - "gitlabUrl": { - "format": "uri", - "type": "string" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "accessToken": { + "minLength": 1, + "type": "string" + }, + "gitlabUrl": { + "format": "uri", + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } +] - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": {}, + "properties": { + "hasMore": { + "type": "boolean" + }, + "nodes": { + "items": { + "additionalProperties": {}, + "properties": { + "fullPath": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "webUrl": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "fullPath", + "webUrl" + ], + "type": "object" + }, + "type": "array" + }, + "pageInfo": { + "additionalProperties": {}, + "properties": { + "endCursor": { + "type": [ + "string", + "null" + ] + }, + "hasNextPage": { + "type": "boolean" + }, + "hasPreviousPage": { + "type": "boolean" + }, + "startCursor": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "hasNextPage", + "endCursor" + ], + "type": "object" + }, + "totalFetched": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "nodes", + "pageInfo" + ], + "type": "object" +}
- Changed
get_time_tracking2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / userCredentials / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "accessToken": { - "minLength": 1, - "type": "string" - }, - "gitlabUrl": { - "format": "uri", - "type": "string" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "accessToken": { + "minLength": 1, + "type": "string" + }, + "gitlabUrl": { + "format": "uri", + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } +]
- Changed
get_type_fields2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / userCredentials / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "accessToken": { - "minLength": 1, - "type": "string" - }, - "gitlabUrl": { - "format": "uri", - "type": "string" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "accessToken": { + "minLength": 1, + "type": "string" + }, + "gitlabUrl": { + "format": "uri", + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } +]
- Changed
get_user_issues2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / userCredentials / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "accessToken": { - "minLength": 1, - "type": "string" - }, - "gitlabUrl": { - "format": "uri", - "type": "string" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "accessToken": { + "minLength": 1, + "type": "string" + }, + "gitlabUrl": { + "format": "uri", + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } +]
- Changed
get_user_merge_requests2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / userCredentials / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "accessToken": { - "minLength": 1, - "type": "string" - }, - "gitlabUrl": { - "format": "uri", - "type": "string" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "accessToken": { + "minLength": 1, + "type": "string" + }, + "gitlabUrl": { + "format": "uri", + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } +]
- Changed
get_work_item2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / userCredentials / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "accessToken": { - "minLength": 1, - "type": "string" - }, - "gitlabUrl": { - "format": "uri", - "type": "string" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "accessToken": { + "minLength": 1, + "type": "string" + }, + "gitlabUrl": { + "format": "uri", + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } +]
- Added
list_achievements - Changed
list_broadcast_messages3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / page / maximumAdded value: +9007199254740991 - changed
Input schema / properties / userCredentials / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "accessToken": { - "minLength": 1, - "type": "string" - }, - "gitlabUrl": { - "format": "uri", - "type": "string" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "accessToken": { + "minLength": 1, + "type": "string" + }, + "gitlabUrl": { + "format": "uri", + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } +]
- Changed
list_group_members2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / userCredentials / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "accessToken": { - "minLength": 1, - "type": "string" - }, - "gitlabUrl": { - "format": "uri", - "type": "string" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "accessToken": { + "minLength": 1, + "type": "string" + }, + "gitlabUrl": { + "format": "uri", + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } +]
- Changed
list_iterations2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / userCredentials / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "accessToken": { - "minLength": 1, - "type": "string" - }, - "gitlabUrl": { - "format": "uri", - "type": "string" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "accessToken": { + "minLength": 1, + "type": "string" + }, + "gitlabUrl": { + "format": "uri", + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } +]
- Changed
list_milestones2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / userCredentials / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "accessToken": { - "minLength": 1, - "type": "string" - }, - "gitlabUrl": { - "format": "uri", - "type": "string" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "accessToken": { + "minLength": 1, + "type": "string" + }, + "gitlabUrl": { + "format": "uri", + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } +]
- Changed
list_my_events3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / page / maximumAdded value: +9007199254740991 - changed
Input schema / properties / userCredentials / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "accessToken": { - "minLength": 1, - "type": "string" - }, - "gitlabUrl": { - "format": "uri", - "type": "string" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "accessToken": { + "minLength": 1, + "type": "string" + }, + "gitlabUrl": { + "format": "uri", + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } +]
- Changed
list_my_todos2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / userCredentials / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "accessToken": { - "minLength": 1, - "type": "string" - }, - "gitlabUrl": { - "format": "uri", - "type": "string" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "accessToken": { + "minLength": 1, + "type": "string" + }, + "gitlabUrl": { + "format": "uri", + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } +]
- Changed
list_project_events3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / page / maximumAdded value: +9007199254740991 - changed
Input schema / properties / userCredentials / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "accessToken": { - "minLength": 1, - "type": "string" - }, - "gitlabUrl": { - "format": "uri", - "type": "string" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "accessToken": { + "minLength": 1, + "type": "string" + }, + "gitlabUrl": { + "format": "uri", + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } +]
- Changed
list_user_events3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / page / maximumAdded value: +9007199254740991 - changed
Input schema / properties / userCredentials / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "accessToken": { - "minLength": 1, - "type": "string" - }, - "gitlabUrl": { - "format": "uri", - "type": "string" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "accessToken": { + "minLength": 1, + "type": "string" + }, + "gitlabUrl": { + "format": "uri", + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } +]
- Changed
list_work_items2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / userCredentials / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "accessToken": { - "minLength": 1, - "type": "string" - }, - "gitlabUrl": { - "format": "uri", - "type": "string" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "accessToken": { + "minLength": 1, + "type": "string" + }, + "gitlabUrl": { + "format": "uri", + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } +]
- Changed
manage_pipeline2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / userCredentials / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "accessToken": { - "minLength": 1, - "type": "string" - }, - "gitlabUrl": { - "format": "uri", - "type": "string" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "accessToken": { + "minLength": 1, + "type": "string" + }, + "gitlabUrl": { + "format": "uri", + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } +]
- Changed
mark_all_todos_done2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / userCredentials / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "accessToken": { - "minLength": 1, - "type": "string" - }, - "gitlabUrl": { - "format": "uri", - "type": "string" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "accessToken": { + "minLength": 1, + "type": "string" + }, + "gitlabUrl": { + "format": "uri", + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } +]
- Changed
mark_todo_done2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / userCredentials / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "accessToken": { - "minLength": 1, - "type": "string" - }, - "gitlabUrl": { - "format": "uri", - "type": "string" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "accessToken": { + "minLength": 1, + "type": "string" + }, + "gitlabUrl": { + "format": "uri", + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } +]
- Changed
resolve_path2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / userCredentials / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "accessToken": { - "minLength": 1, - "type": "string" - }, - "gitlabUrl": { - "format": "uri", - "type": "string" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "accessToken": { + "minLength": 1, + "type": "string" + }, + "gitlabUrl": { + "format": "uri", + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } +]
- Changed
restore_todo2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / userCredentials / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "accessToken": { - "minLength": 1, - "type": "string" - }, - "gitlabUrl": { - "format": "uri", - "type": "string" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "accessToken": { + "minLength": 1, + "type": "string" + }, + "gitlabUrl": { + "format": "uri", + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } +]
- Added
revoke_achievement - Changed
search_gitlab3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / fetchAll / descriptionPrevious value: -"Fetch multiple pages per category in one call, up to ~100 items each — NOT exhaustive. For complete results, leave this false and paginate via after (pageInfo.endCursor)."New value: +"Fetch multiple pages per category up to first items each (default 20, max 100), starting at after — NOT exhaustive. Each category returns its own pageInfo. Use search_projects and search_issues to continue those categories independently." - changed
Input schema / properties / userCredentials / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "accessToken": { - "minLength": 1, - "type": "string" - }, - "gitlabUrl": { - "format": "uri", - "type": "string" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "accessToken": { + "minLength": 1, + "type": "string" + }, + "gitlabUrl": { + "format": "uri", + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } +]
- Changed
search_groups2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / userCredentials / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "accessToken": { - "minLength": 1, - "type": "string" - }, - "gitlabUrl": { - "format": "uri", - "type": "string" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "accessToken": { + "minLength": 1, + "type": "string" + }, + "gitlabUrl": { + "format": "uri", + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } +]
- Changed
search_issues3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / userCredentials / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "accessToken": { - "minLength": 1, - "type": "string" - }, - "gitlabUrl": { - "format": "uri", - "type": "string" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "accessToken": { + "minLength": 1, + "type": "string" + }, + "gitlabUrl": { + "format": "uri", + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } +] - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": {}, + "properties": { + "hasMore": { + "type": "boolean" + }, + "nodes": { + "items": { + "additionalProperties": {}, + "properties": { + "id": { + "type": "string" + }, + "iid": { + "type": "string" + }, + "title": { + "type": "string" + }, + "webUrl": { + "type": "string" + } + }, + "required": [ + "id", + "iid", + "title", + "webUrl" + ], + "type": "object" + }, + "type": "array" + }, + "pageInfo": { + "additionalProperties": {}, + "properties": { + "endCursor": { + "type": [ + "string", + "null" + ] + }, + "hasNextPage": { + "type": "boolean" + }, + "hasPreviousPage": { + "type": "boolean" + }, + "startCursor": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "hasNextPage", + "endCursor" + ], + "type": "object" + }, + "totalFetched": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "nodes", + "pageInfo" + ], + "type": "object" +}
- Changed
search_labels2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / userCredentials / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "accessToken": { - "minLength": 1, - "type": "string" - }, - "gitlabUrl": { - "format": "uri", - "type": "string" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "accessToken": { + "minLength": 1, + "type": "string" + }, + "gitlabUrl": { + "format": "uri", + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } +]
- Changed
search_merge_requests3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / userCredentials / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "accessToken": { - "minLength": 1, - "type": "string" - }, - "gitlabUrl": { - "format": "uri", - "type": "string" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "accessToken": { + "minLength": 1, + "type": "string" + }, + "gitlabUrl": { + "format": "uri", + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } +] - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": {}, + "properties": { + "hasMore": { + "type": "boolean" + }, + "nodes": { + "items": { + "additionalProperties": {}, + "properties": { + "id": { + "type": "string" + }, + "iid": { + "type": "string" + }, + "title": { + "type": "string" + }, + "webUrl": { + "type": "string" + } + }, + "required": [ + "id", + "iid", + "title", + "webUrl" + ], + "type": "object" + }, + "type": "array" + }, + "pageInfo": { + "additionalProperties": {}, + "properties": { + "endCursor": { + "type": [ + "string", + "null" + ] + }, + "hasNextPage": { + "type": "boolean" + }, + "hasPreviousPage": { + "type": "boolean" + }, + "startCursor": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "hasNextPage", + "endCursor" + ], + "type": "object" + }, + "totalFetched": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "nodes", + "pageInfo" + ], + "type": "object" +}
- Changed
search_notes3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / page / maximumAdded value: +9007199254740991 - changed
Input schema / properties / userCredentials / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "accessToken": { - "minLength": 1, - "type": "string" - }, - "gitlabUrl": { - "format": "uri", - "type": "string" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "accessToken": { + "minLength": 1, + "type": "string" + }, + "gitlabUrl": { + "format": "uri", + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } +]
- Changed
search_projects3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / userCredentials / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "accessToken": { - "minLength": 1, - "type": "string" - }, - "gitlabUrl": { - "format": "uri", - "type": "string" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "accessToken": { + "minLength": 1, + "type": "string" + }, + "gitlabUrl": { + "format": "uri", + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } +] - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": {}, + "properties": { + "hasMore": { + "type": "boolean" + }, + "nodes": { + "items": { + "additionalProperties": {}, + "properties": { + "fullPath": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "webUrl": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "fullPath", + "webUrl" + ], + "type": "object" + }, + "type": "array" + }, + "pageInfo": { + "additionalProperties": {}, + "properties": { + "endCursor": { + "type": [ + "string", + "null" + ] + }, + "hasNextPage": { + "type": "boolean" + }, + "hasPreviousPage": { + "type": "boolean" + }, + "startCursor": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "hasNextPage", + "endCursor" + ], + "type": "object" + }, + "totalFetched": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "nodes", + "pageInfo" + ], + "type": "object" +}
- Changed
search_users2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / userCredentials / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "accessToken": { - "minLength": 1, - "type": "string" - }, - "gitlabUrl": { - "format": "uri", - "type": "string" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "accessToken": { + "minLength": 1, + "type": "string" + }, + "gitlabUrl": { + "format": "uri", + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } +]
- Added
update_achievement - Changed
update_broadcast_message8 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / ends_at / patternAdded value: +"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$" - added
Input schema / properties / id / maximumAdded value: +9007199254740991 - added
Input schema / properties / id / minimumAdded value: +-9007199254740991 - added
Input schema / properties / starts_at / patternAdded value: +"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$" - added
Input schema / properties / target_access_levels / items / maximumAdded value: +9007199254740991 - added
Input schema / properties / target_access_levels / items / minimumAdded value: +-9007199254740991 - changed
Input schema / properties / userCredentials / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "accessToken": { - "minLength": 1, - "type": "string" - }, - "gitlabUrl": { - "format": "uri", - "type": "string" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "accessToken": { + "minLength": 1, + "type": "string" + }, + "gitlabUrl": { + "format": "uri", + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } +]
- Changed
update_issue2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / userCredentials / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "accessToken": { - "minLength": 1, - "type": "string" - }, - "gitlabUrl": { - "format": "uri", - "type": "string" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "accessToken": { + "minLength": 1, + "type": "string" + }, + "gitlabUrl": { + "format": "uri", + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } +]
- Changed
update_merge_request2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / userCredentials / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "accessToken": { - "minLength": 1, - "type": "string" - }, - "gitlabUrl": { - "format": "uri", - "type": "string" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "accessToken": { + "minLength": 1, + "type": "string" + }, + "gitlabUrl": { + "format": "uri", + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } +]
- Changed
update_note2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / userCredentials / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "accessToken": { - "minLength": 1, - "type": "string" - }, - "gitlabUrl": { - "format": "uri", - "type": "string" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "accessToken": { + "minLength": 1, + "type": "string" + }, + "gitlabUrl": { + "format": "uri", + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } +]
23 tool updates
v2.2.4- Changed
get_group_projects1 field changed- changed
Input schema / properties / after / descriptionPrevious value: -"Cursor for pagination"New value: +"Pagination cursor. To fetch the next page, pass the previous response pageInfo.endCursor here and repeat until pageInfo.hasNextPage is false. Paginating this way is the reliable path to complete results and accurate totals."
- Changed
get_issues2 fields changed- changed
Input schema / properties / after / descriptionPrevious value: -"Cursor for pagination"New value: +"Pagination cursor. To fetch the next page, pass the previous response pageInfo.endCursor here and repeat until pageInfo.hasNextPage is false. Paginating this way is the reliable path to complete results and accurate totals." - changed
Input schema / properties / fetchAll / descriptionPrevious value: -"Fetch all pages up to 100 results"New value: +"Fetch multiple pages in one call, up to \"first\" items total (max 100) — NOT exhaustive. For complete results or accurate counts, leave this false and paginate via after (pageInfo.endCursor)."
- Changed
get_merge_request_commits2 fields changed- changed
Input schema / properties / after / descriptionPrevious value: -"Cursor for pagination"New value: +"Pagination cursor. To fetch the next page, pass the previous response pageInfo.endCursor here and repeat until pageInfo.hasNextPage is false. Paginating this way is the reliable path to complete results and accurate totals." - changed
Input schema / properties / fetchAll / descriptionPrevious value: -"Fetch all pages up to 100 results"New value: +"Fetch multiple pages in one call, up to \"first\" items total (max 100) — NOT exhaustive. For complete results or accurate counts, leave this false and paginate via after (pageInfo.endCursor)."
- Changed
get_merge_request_pipelines2 fields changed- changed
Input schema / properties / after / descriptionPrevious value: -"Cursor for pagination"New value: +"Pagination cursor. To fetch the next page, pass the previous response pageInfo.endCursor here and repeat until pageInfo.hasNextPage is false. Paginating this way is the reliable path to complete results and accurate totals." - changed
Input schema / properties / fetchAll / descriptionPrevious value: -"Fetch all pages up to 100 results"New value: +"Fetch multiple pages in one call, up to \"first\" items total (max 100) — NOT exhaustive. For complete results or accurate counts, leave this false and paginate via after (pageInfo.endCursor)."
- Changed
get_merge_requests2 fields changed- changed
Input schema / properties / after / descriptionPrevious value: -"Cursor for pagination"New value: +"Pagination cursor. To fetch the next page, pass the previous response pageInfo.endCursor here and repeat until pageInfo.hasNextPage is false. Paginating this way is the reliable path to complete results and accurate totals." - changed
Input schema / properties / fetchAll / descriptionPrevious value: -"Fetch all pages up to 100 results"New value: +"Fetch multiple pages in one call, up to \"first\" items total (max 100) — NOT exhaustive. For complete results or accurate counts, leave this false and paginate via after (pageInfo.endCursor)."
- Changed
get_notes2 fields changed- changed
Input schema / properties / after / descriptionPrevious value: -"Cursor for pagination"New value: +"Pagination cursor. To fetch the next page, pass the previous response pageInfo.endCursor here and repeat until pageInfo.hasNextPage is false. Paginating this way is the reliable path to complete results and accurate totals." - changed
Input schema / properties / fetchAll / descriptionPrevious value: -"Fetch all pages up to 100 results"New value: +"Fetch multiple pages in one call, up to \"first\" items total (max 100) — NOT exhaustive. For complete results or accurate counts, leave this false and paginate via after (pageInfo.endCursor)."
- Changed
get_pipeline_jobs2 fields changed- changed
Input schema / properties / after / descriptionPrevious value: -"Cursor for pagination"New value: +"Pagination cursor. To fetch the next page, pass the previous response pageInfo.endCursor here and repeat until pageInfo.hasNextPage is false. Paginating this way is the reliable path to complete results and accurate totals." - changed
Input schema / properties / fetchAll / descriptionPrevious value: -"Fetch all pages up to 100 results"New value: +"Fetch multiple pages in one call, up to \"first\" items total (max 100) — NOT exhaustive. For complete results or accurate counts, leave this false and paginate via after (pageInfo.endCursor)."
- Changed
get_projects2 fields changed- changed
Input schema / properties / after / descriptionPrevious value: -"Cursor for pagination"New value: +"Pagination cursor. To fetch the next page, pass the previous response pageInfo.endCursor here and repeat until pageInfo.hasNextPage is false. Paginating this way is the reliable path to complete results and accurate totals." - changed
Input schema / properties / fetchAll / descriptionPrevious value: -"Fetch all pages up to 100 results"New value: +"Fetch multiple pages in one call, up to \"first\" items total (max 100) — NOT exhaustive. For complete results or accurate counts, leave this false and paginate via after (pageInfo.endCursor)."
- Changed
get_time_tracking1 field changed- changed
Input schema / properties / after / descriptionPrevious value: -"Cursor for pagination"New value: +"Pagination cursor. To fetch the next page, pass the previous response pageInfo.endCursor here and repeat until pageInfo.hasNextPage is false. Paginating this way is the reliable path to complete results and accurate totals."
- Changed
get_user_issues2 fields changed- changed
Input schema / properties / after / descriptionPrevious value: -"Cursor for pagination"New value: +"Pagination cursor. To fetch the next page, pass the previous response pageInfo.endCursor here and repeat until pageInfo.hasNextPage is false. Paginating this way is the reliable path to complete results and accurate totals." - changed
Input schema / properties / fetchAll / descriptionPrevious value: -"Fetch all pages up to 100 results"New value: +"Fetch multiple pages in one call, up to \"first\" items total (max 100) — NOT exhaustive. For complete results or accurate counts, leave this false and paginate via after (pageInfo.endCursor)."
- Changed
get_user_merge_requests2 fields changed- changed
Input schema / properties / after / descriptionPrevious value: -"Cursor for pagination"New value: +"Pagination cursor. To fetch the next page, pass the previous response pageInfo.endCursor here and repeat until pageInfo.hasNextPage is false. Paginating this way is the reliable path to complete results and accurate totals." - changed
Input schema / properties / fetchAll / descriptionPrevious value: -"Fetch all pages up to 100 results"New value: +"Fetch multiple pages in one call, up to \"first\" items total (max 100) — NOT exhaustive. For complete results or accurate counts, leave this false and paginate via after (pageInfo.endCursor)."
- Changed
list_group_members2 fields changed- changed
Input schema / properties / after / descriptionPrevious value: -"Cursor for pagination"New value: +"Pagination cursor. To fetch the next page, pass the previous response pageInfo.endCursor here and repeat until pageInfo.hasNextPage is false. Paginating this way is the reliable path to complete results and accurate totals." - changed
Input schema / properties / fetchAll / descriptionPrevious value: -"Fetch all pages up to 100 results"New value: +"Fetch multiple pages in one call, up to \"first\" items total (max 100) — NOT exhaustive. For complete results or accurate counts, leave this false and paginate via after (pageInfo.endCursor)."
- Changed
list_iterations2 fields changed- changed
Input schema / properties / after / descriptionPrevious value: -"Cursor for pagination"New value: +"Pagination cursor. To fetch the next page, pass the previous response pageInfo.endCursor here and repeat until pageInfo.hasNextPage is false. Paginating this way is the reliable path to complete results and accurate totals." - changed
Input schema / properties / fetchAll / descriptionPrevious value: -"Fetch all pages up to 100 results"New value: +"Fetch multiple pages in one call, up to \"first\" items total (max 100) — NOT exhaustive. For complete results or accurate counts, leave this false and paginate via after (pageInfo.endCursor)."
- Changed
list_milestones2 fields changed- changed
Input schema / properties / after / descriptionPrevious value: -"Cursor for pagination"New value: +"Pagination cursor. To fetch the next page, pass the previous response pageInfo.endCursor here and repeat until pageInfo.hasNextPage is false. Paginating this way is the reliable path to complete results and accurate totals." - changed
Input schema / properties / fetchAll / descriptionPrevious value: -"Fetch all pages up to 100 results"New value: +"Fetch multiple pages in one call, up to \"first\" items total (max 100) — NOT exhaustive. For complete results or accurate counts, leave this false and paginate via after (pageInfo.endCursor)."
- Changed
list_my_todos2 fields changed- changed
Input schema / properties / after / descriptionPrevious value: -"Cursor for pagination"New value: +"Pagination cursor. To fetch the next page, pass the previous response pageInfo.endCursor here and repeat until pageInfo.hasNextPage is false. Paginating this way is the reliable path to complete results and accurate totals." - changed
Input schema / properties / fetchAll / descriptionPrevious value: -"Fetch all pages up to 100 results"New value: +"Fetch multiple pages in one call, up to \"first\" items total (max 100) — NOT exhaustive. For complete results or accurate counts, leave this false and paginate via after (pageInfo.endCursor)."
- Changed
resolve_path1 field changed- changed
Input schema / properties / after / descriptionPrevious value: -"Cursor for pagination"New value: +"Pagination cursor. To fetch the next page, pass the previous response pageInfo.endCursor here and repeat until pageInfo.hasNextPage is false. Paginating this way is the reliable path to complete results and accurate totals."
- Changed
search_gitlab2 fields changed- changed
Input schema / properties / after / descriptionPrevious value: -"Cursor for pagination"New value: +"Pagination cursor. To fetch the next page, pass the previous response pageInfo.endCursor here and repeat until pageInfo.hasNextPage is false. Paginating this way is the reliable path to complete results and accurate totals." - changed
Input schema / properties / fetchAll / descriptionPrevious value: -"Fetch all pages up to 100 results per category"New value: +"Fetch multiple pages per category in one call, up to ~100 items each — NOT exhaustive. For complete results, leave this false and paginate via after (pageInfo.endCursor)."
- Changed
search_groups2 fields changed- changed
Input schema / properties / after / descriptionPrevious value: -"Cursor for pagination"New value: +"Pagination cursor. To fetch the next page, pass the previous response pageInfo.endCursor here and repeat until pageInfo.hasNextPage is false. Paginating this way is the reliable path to complete results and accurate totals." - changed
Input schema / properties / fetchAll / descriptionPrevious value: -"Fetch all pages up to 100 results"New value: +"Fetch multiple pages in one call, up to \"first\" items total (max 100) — NOT exhaustive. For complete results or accurate counts, leave this false and paginate via after (pageInfo.endCursor)."
- Changed
search_issues2 fields changed- changed
Input schema / properties / after / descriptionPrevious value: -"Cursor for pagination"New value: +"Pagination cursor. To fetch the next page, pass the previous response pageInfo.endCursor here and repeat until pageInfo.hasNextPage is false. Paginating this way is the reliable path to complete results and accurate totals." - changed
Input schema / properties / fetchAll / descriptionPrevious value: -"Fetch all pages up to 100 results"New value: +"Fetch multiple pages in one call, up to \"first\" items total (max 100) — NOT exhaustive. For complete results or accurate counts, leave this false and paginate via after (pageInfo.endCursor)."
- Changed
search_labels2 fields changed- changed
Input schema / properties / after / descriptionPrevious value: -"Cursor for pagination"New value: +"Pagination cursor. To fetch the next page, pass the previous response pageInfo.endCursor here and repeat until pageInfo.hasNextPage is false. Paginating this way is the reliable path to complete results and accurate totals." - changed
Input schema / properties / fetchAll / descriptionPrevious value: -"Fetch all pages up to 100 results"New value: +"Fetch multiple pages in one call, up to \"first\" items total (max 100) — NOT exhaustive. For complete results or accurate counts, leave this false and paginate via after (pageInfo.endCursor)."
- Changed
search_merge_requests2 fields changed- changed
Input schema / properties / after / descriptionPrevious value: -"Cursor for pagination"New value: +"Pagination cursor. To fetch the next page, pass the previous response pageInfo.endCursor here and repeat until pageInfo.hasNextPage is false. Paginating this way is the reliable path to complete results and accurate totals." - changed
Input schema / properties / fetchAll / descriptionPrevious value: -"Fetch all pages up to 100 results"New value: +"Fetch multiple pages in one call, up to \"first\" items total (max 100) — NOT exhaustive. For complete results or accurate counts, leave this false and paginate via after (pageInfo.endCursor)."
- Changed
search_projects2 fields changed- changed
Input schema / properties / after / descriptionPrevious value: -"Cursor for pagination"New value: +"Pagination cursor. To fetch the next page, pass the previous response pageInfo.endCursor here and repeat until pageInfo.hasNextPage is false. Paginating this way is the reliable path to complete results and accurate totals." - changed
Input schema / properties / fetchAll / descriptionPrevious value: -"Fetch all pages up to 100 results"New value: +"Fetch multiple pages in one call, up to \"first\" items total (max 100) — NOT exhaustive. For complete results or accurate counts, leave this false and paginate via after (pageInfo.endCursor)."
- Changed
search_users2 fields changed- changed
Input schema / properties / after / descriptionPrevious value: -"Cursor for pagination"New value: +"Pagination cursor. To fetch the next page, pass the previous response pageInfo.endCursor here and repeat until pageInfo.hasNextPage is false. Paginating this way is the reliable path to complete results and accurate totals." - changed
Input schema / properties / fetchAll / descriptionPrevious value: -"Fetch all pages up to 100 results"New value: +"Fetch multiple pages in one call, up to \"first\" items total (max 100) — NOT exhaustive. For complete results or accurate counts, leave this false and paginate via after (pageInfo.endCursor)."
2 tool updates
v1.19.1- Changed
execute_custom_query1 field changed- changed
Input schema / properties / requiresWrite / descriptionPrevious value: -"Set to true if this is a mutation that requires write permissions"New value: +"Hint that this needs write access. Mutations are auto-detected and always write-gated regardless of this flag."
- Changed
get_projects1 field changed- changed
Input schema / properties / sort / descriptionPrevious value: -"Sort order (e.g., UPDATED_DESC, CREATED_DESC, CREATED_ASC). Defaults to UPDATED_DESC for recency."New value: +"GitLab project sort string (e.g., latest_activity_desc, created_desc, name_asc, stars_desc). Defaults to latest_activity_desc for recency."
6 tool updates
v1.19.0- Added
execute_rest_read - Added
execute_rest_write - Added
list_my_todos - Added
mark_all_todos_done - Added
mark_todo_done - Added
restore_todo
57 tool updates
v1.15.0- Added
analytics_group_summary - Added
analytics_review_bottlenecks - Added
analytics_user_summary - Changed
browse_repository1 field changed- changed
Input schema / properties / userCredentials / descriptionPrevious value: -"Your GitLab credentials (optional - uses shared token if not provided)"New value: +"Your GitLab credentials (optional — falls back to the configured env token if not provided)"
- Added
create_broadcast_message - Changed
create_issue1 field changed- changed
Input schema / properties / userCredentials / descriptionPrevious value: -"Your GitLab credentials (optional - uses shared token if not provided)"New value: +"Your GitLab credentials (optional — falls back to the configured env token if not provided)"
- Changed
create_merge_request1 field changed- changed
Input schema / properties / userCredentials / descriptionPrevious value: -"Your GitLab credentials (optional - uses shared token if not provided)"New value: +"Your GitLab credentials (optional — falls back to the configured env token if not provided)"
- Changed
create_note1 field changed- changed
Input schema / properties / userCredentials / descriptionPrevious value: -"Your GitLab credentials (optional - uses shared token if not provided)"New value: +"Your GitLab credentials (optional — falls back to the configured env token if not provided)"
- Added
delete_broadcast_message - Added
delete_issue - Added
delete_note - Changed
execute_custom_query1 field changed- changed
Input schema / properties / userCredentials / descriptionPrevious value: -"Your GitLab credentials (optional - uses shared token if not provided)"New value: +"Your GitLab credentials (optional — falls back to the configured env token if not provided)"
- Changed
get_available_queries1 field changed- changed
Input schema / properties / userCredentials / descriptionPrevious value: -"Your GitLab credentials (optional - uses shared token if not provided)"New value: +"Your GitLab credentials (optional — falls back to the configured env token if not provided)"
- Added
get_broadcast_message - Changed
get_current_user1 field changed- changed
Input schema / properties / userCredentials / descriptionPrevious value: -"Your GitLab credentials (optional - uses shared token if not provided)"New value: +"Your GitLab credentials (optional — falls back to the configured env token if not provided)"
- Changed
get_file_content1 field changed- changed
Input schema / properties / userCredentials / descriptionPrevious value: -"Your GitLab credentials (optional - uses shared token if not provided)"New value: +"Your GitLab credentials (optional — falls back to the configured env token if not provided)"
- Changed
get_group_projects1 field changed- changed
Input schema / properties / userCredentials / descriptionPrevious value: -"Your GitLab credentials (optional - uses shared token if not provided)"New value: +"Your GitLab credentials (optional — falls back to the configured env token if not provided)"
- Added
get_issue_context - Changed
get_issues3 fields changed- added
Input schema / properties / fetchAllAdded value: +{ + "default": false, + "description": "Fetch all pages up to 100 results", + "type": "boolean" +} - added
Input schema / properties / sortAdded value: +{ + "description": "Sort order (e.g., UPDATED_DESC, CREATED_DESC, CREATED_ASC). Defaults to UPDATED_DESC for recency.", + "type": "string" +} - changed
Input schema / properties / userCredentials / descriptionPrevious value: -"Your GitLab credentials (optional - uses shared token if not provided)"New value: +"Your GitLab credentials (optional — falls back to the configured env token if not provided)"
- Changed
get_merge_request_commits2 fields changed- added
Input schema / properties / fetchAllAdded value: +{ + "default": false, + "description": "Fetch all pages up to 100 results", + "type": "boolean" +} - changed
Input schema / properties / userCredentials / descriptionPrevious value: -"Your GitLab credentials (optional - uses shared token if not provided)"New value: +"Your GitLab credentials (optional — falls back to the configured env token if not provided)"
- Added
get_merge_request_context - Changed
get_merge_request_diffs1 field changed- changed
Input schema / properties / userCredentials / descriptionPrevious value: -"Your GitLab credentials (optional - uses shared token if not provided)"New value: +"Your GitLab credentials (optional — falls back to the configured env token if not provided)"
- Changed
get_merge_request_pipelines2 fields changed- added
Input schema / properties / fetchAllAdded value: +{ + "default": false, + "description": "Fetch all pages up to 100 results", + "type": "boolean" +} - changed
Input schema / properties / userCredentials / descriptionPrevious value: -"Your GitLab credentials (optional - uses shared token if not provided)"New value: +"Your GitLab credentials (optional — falls back to the configured env token if not provided)"
- Changed
get_merge_request_reviewers1 field changed- changed
Input schema / properties / userCredentials / descriptionPrevious value: -"Your GitLab credentials (optional - uses shared token if not provided)"New value: +"Your GitLab credentials (optional — falls back to the configured env token if not provided)"
- Changed
get_merge_requests3 fields changed- added
Input schema / properties / fetchAllAdded value: +{ + "default": false, + "description": "Fetch all pages up to 100 results", + "type": "boolean" +} - added
Input schema / properties / sortAdded value: +{ + "description": "Sort order (e.g., UPDATED_DESC, CREATED_DESC, CREATED_ASC). Defaults to UPDATED_DESC for recency.", + "type": "string" +} - changed
Input schema / properties / userCredentials / descriptionPrevious value: -"Your GitLab credentials (optional - uses shared token if not provided)"New value: +"Your GitLab credentials (optional — falls back to the configured env token if not provided)"
- Changed
get_notes2 fields changed- added
Input schema / properties / fetchAllAdded value: +{ + "default": false, + "description": "Fetch all pages up to 100 results", + "type": "boolean" +} - changed
Input schema / properties / userCredentials / descriptionPrevious value: -"Your GitLab credentials (optional - uses shared token if not provided)"New value: +"Your GitLab credentials (optional — falls back to the configured env token if not provided)"
- Changed
get_pipeline_jobs2 fields changed- added
Input schema / properties / fetchAllAdded value: +{ + "default": false, + "description": "Fetch all pages up to 100 results", + "type": "boolean" +} - changed
Input schema / properties / userCredentials / descriptionPrevious value: -"Your GitLab credentials (optional - uses shared token if not provided)"New value: +"Your GitLab credentials (optional — falls back to the configured env token if not provided)"
- Changed
get_project1 field changed- changed
Input schema / properties / userCredentials / descriptionPrevious value: -"Your GitLab credentials (optional - uses shared token if not provided)"New value: +"Your GitLab credentials (optional — falls back to the configured env token if not provided)"
- Changed
get_project_statistics1 field changed- changed
Input schema / properties / userCredentials / descriptionPrevious value: -"Your GitLab credentials (optional - uses shared token if not provided)"New value: +"Your GitLab credentials (optional — falls back to the configured env token if not provided)"
- Changed
get_projects3 fields changed- added
Input schema / properties / fetchAllAdded value: +{ + "default": false, + "description": "Fetch all pages up to 100 results", + "type": "boolean" +} - added
Input schema / properties / sortAdded value: +{ + "description": "Sort order (e.g., UPDATED_DESC, CREATED_DESC, CREATED_ASC). Defaults to UPDATED_DESC for recency.", + "type": "string" +} - changed
Input schema / properties / userCredentials / descriptionPrevious value: -"Your GitLab credentials (optional - uses shared token if not provided)"New value: +"Your GitLab credentials (optional — falls back to the configured env token if not provided)"
- Changed
get_time_tracking1 field changed- changed
Input schema / properties / userCredentials / descriptionPrevious value: -"Your GitLab credentials (optional - uses shared token if not provided)"New value: +"Your GitLab credentials (optional — falls back to the configured env token if not provided)"
- Changed
get_type_fields1 field changed- changed
Input schema / properties / userCredentials / descriptionPrevious value: -"Your GitLab credentials (optional - uses shared token if not provided)"New value: +"Your GitLab credentials (optional — falls back to the configured env token if not provided)"
- Changed
get_user_issues3 fields changed- added
Input schema / properties / fetchAllAdded value: +{ + "default": false, + "description": "Fetch all pages up to 100 results", + "type": "boolean" +} - changed
Input schema / properties / first / defaultPrevious value: -50New value: +20 - changed
Input schema / properties / userCredentials / descriptionPrevious value: -"Your GitLab credentials (optional - uses shared token if not provided)"New value: +"Your GitLab credentials (optional — falls back to the configured env token if not provided)"
- Changed
get_user_merge_requests3 fields changed- added
Input schema / properties / fetchAllAdded value: +{ + "default": false, + "description": "Fetch all pages up to 100 results", + "type": "boolean" +} - changed
Input schema / properties / first / defaultPrevious value: -50New value: +20 - changed
Input schema / properties / userCredentials / descriptionPrevious value: -"Your GitLab credentials (optional - uses shared token if not provided)"New value: +"Your GitLab credentials (optional — falls back to the configured env token if not provided)"
- Added
get_work_item - Added
list_broadcast_messages - Changed
list_group_members2 fields changed- added
Input schema / properties / fetchAllAdded value: +{ + "default": false, + "description": "Fetch all pages up to 100 results", + "type": "boolean" +} - changed
Input schema / properties / userCredentials / descriptionPrevious value: -"Your GitLab credentials (optional - uses shared token if not provided)"New value: +"Your GitLab credentials (optional — falls back to the configured env token if not provided)"
- Changed
list_iterations2 fields changed- added
Input schema / properties / fetchAllAdded value: +{ + "default": false, + "description": "Fetch all pages up to 100 results", + "type": "boolean" +} - changed
Input schema / properties / userCredentials / descriptionPrevious value: -"Your GitLab credentials (optional - uses shared token if not provided)"New value: +"Your GitLab credentials (optional — falls back to the configured env token if not provided)"
- Changed
list_milestones2 fields changed- added
Input schema / properties / fetchAllAdded value: +{ + "default": false, + "description": "Fetch all pages up to 100 results", + "type": "boolean" +} - changed
Input schema / properties / userCredentials / descriptionPrevious value: -"Your GitLab credentials (optional - uses shared token if not provided)"New value: +"Your GitLab credentials (optional — falls back to the configured env token if not provided)"
- Added
list_my_events - Added
list_project_events - Added
list_user_events - Added
list_work_items - Changed
manage_pipeline1 field changed- changed
Input schema / properties / userCredentials / descriptionPrevious value: -"Your GitLab credentials (optional - uses shared token if not provided)"New value: +"Your GitLab credentials (optional — falls back to the configured env token if not provided)"
- Changed
resolve_path1 field changed- changed
Input schema / properties / userCredentials / descriptionPrevious value: -"Your GitLab credentials (optional - uses shared token if not provided)"New value: +"Your GitLab credentials (optional — falls back to the configured env token if not provided)"
- Changed
search_gitlab4 fields changed- added
Input schema / properties / afterAdded value: +{ + "description": "Cursor for pagination", + "type": "string" +} - added
Input schema / properties / fetchAllAdded value: +{ + "default": false, + "description": "Fetch all pages up to 100 results per category", + "type": "boolean" +} - added
Input schema / properties / firstAdded value: +{ + "default": 20, + "description": "Number of results to retrieve per category", + "maximum": 100, + "minimum": 1, + "type": "number" +} - changed
Input schema / properties / userCredentials / descriptionPrevious value: -"Your GitLab credentials (optional - uses shared token if not provided)"New value: +"Your GitLab credentials (optional — falls back to the configured env token if not provided)"
- Changed
search_groups3 fields changed- added
Input schema / properties / afterAdded value: +{ + "description": "Cursor for pagination", + "type": "string" +} - added
Input schema / properties / fetchAllAdded value: +{ + "default": false, + "description": "Fetch all pages up to 100 results", + "type": "boolean" +} - changed
Input schema / properties / userCredentials / descriptionPrevious value: -"Your GitLab credentials (optional - uses shared token if not provided)"New value: +"Your GitLab credentials (optional — falls back to the configured env token if not provided)"
- Changed
search_issues3 fields changed- added
Input schema / properties / fetchAllAdded value: +{ + "default": false, + "description": "Fetch all pages up to 100 results", + "type": "boolean" +} - added
Input schema / properties / sortAdded value: +{ + "description": "Sort order (e.g., UPDATED_DESC, CREATED_DESC, CREATED_ASC). Defaults to UPDATED_DESC for recency.", + "type": "string" +} - changed
Input schema / properties / userCredentials / descriptionPrevious value: -"Your GitLab credentials (optional - uses shared token if not provided)"New value: +"Your GitLab credentials (optional — falls back to the configured env token if not provided)"
- Changed
search_labels3 fields changed- added
Input schema / properties / fetchAllAdded value: +{ + "default": false, + "description": "Fetch all pages up to 100 results", + "type": "boolean" +} - changed
Input schema / properties / first / defaultPrevious value: -50New value: +20 - changed
Input schema / properties / userCredentials / descriptionPrevious value: -"Your GitLab credentials (optional - uses shared token if not provided)"New value: +"Your GitLab credentials (optional — falls back to the configured env token if not provided)"
- Changed
search_merge_requests3 fields changed- added
Input schema / properties / fetchAllAdded value: +{ + "default": false, + "description": "Fetch all pages up to 100 results", + "type": "boolean" +} - added
Input schema / properties / sortAdded value: +{ + "description": "Sort order (e.g., UPDATED_DESC, CREATED_DESC, CREATED_ASC). Defaults to UPDATED_DESC for recency.", + "type": "string" +} - changed
Input schema / properties / userCredentials / descriptionPrevious value: -"Your GitLab credentials (optional - uses shared token if not provided)"New value: +"Your GitLab credentials (optional — falls back to the configured env token if not provided)"
- Added
search_notes - Changed
search_projects2 fields changed- added
Input schema / properties / fetchAllAdded value: +{ + "default": false, + "description": "Fetch all pages up to 100 results", + "type": "boolean" +} - changed
Input schema / properties / userCredentials / descriptionPrevious value: -"Your GitLab credentials (optional - uses shared token if not provided)"New value: +"Your GitLab credentials (optional — falls back to the configured env token if not provided)"
- Changed
search_users3 fields changed- added
Input schema / properties / afterAdded value: +{ + "description": "Cursor for pagination", + "type": "string" +} - added
Input schema / properties / fetchAllAdded value: +{ + "default": false, + "description": "Fetch all pages up to 100 results", + "type": "boolean" +} - changed
Input schema / properties / userCredentials / descriptionPrevious value: -"Your GitLab credentials (optional - uses shared token if not provided)"New value: +"Your GitLab credentials (optional — falls back to the configured env token if not provided)"
- Added
update_broadcast_message - Changed
update_issue1 field changed- changed
Input schema / properties / userCredentials / descriptionPrevious value: -"Your GitLab credentials (optional - uses shared token if not provided)"New value: +"Your GitLab credentials (optional — falls back to the configured env token if not provided)"
- Changed
update_merge_request1 field changed- changed
Input schema / properties / userCredentials / descriptionPrevious value: -"Your GitLab credentials (optional - uses shared token if not provided)"New value: +"Your GitLab credentials (optional — falls back to the configured env token if not provided)"
- Added
update_note
38 tool updates
v1.7.3- First observed
browse_repository - First observed
create_issue - First observed
create_merge_request - First observed
create_note - First observed
execute_custom_query - First observed
get_available_queries - First observed
get_current_user - First observed
get_file_content - First observed
get_group_projects - First observed
get_issues - First observed
get_merge_request_commits - First observed
get_merge_request_diffs - First observed
get_merge_request_pipelines - First observed
get_merge_request_reviewers - First observed
get_merge_requests - First observed
get_notes - First observed
get_pipeline_jobs - First observed
get_project - First observed
get_project_statistics - First observed
get_projects - First observed
get_time_tracking - First observed
get_type_fields - First observed
get_user_issues - First observed
get_user_merge_requests - First observed
list_group_members - First observed
list_iterations - First observed
list_milestones - First observed
manage_pipeline - First observed
resolve_path - First observed
search_gitlab - First observed
search_groups - First observed
search_issues - First observed
search_labels - First observed
search_merge_requests - First observed
search_projects - First observed
search_users - First observed
update_issue - First observed
update_merge_request
TDQS
Scored across 69 tools
There are several overlapping retrieval paths—get_issues/search_issues/get_user_issues/list_work_items/get_issue_context for issues and analogous merge request tools—plus get_notes vs search_notes and dedicated tools vs execute_rest_read/execute_custom_query. Descriptions generally explain when to use which, so boundaries are recoverable, but the set still invites misselection.
Almost all tools use snake_case verb_noun naming such as get_project, create_issue, delete_note, and search_merge_requests. Minor deviations like analytics_user_summary, execute_rest_read, and mark_all_todos_done are readable and do not break the overall pattern.
69 tools is far beyond a well-scoped MCP surface and includes many specialized, overlapping, and escape-hatch tools. This creates a large selection burden for an agent and is an extreme mismatch for typical usage.
Core issue, merge request, note, pipeline, todo, event, achievement, and broadcast workflows are covered, and generic REST/GraphQL escape hatches prevent total dead ends. However, common GitLab operations like project/group CRUD, label/milestone lifecycle, branches, and file writes lack dedicated tools, so coverage is only partial.
Maintenance
Related MCP Connectors
Code intelligence for LLMs. Analyze, search, and retrieve code from any public git repository.
Operate GitHub from your AI assistant: repos, PRs, issues, Actions. Previews and read-only mode.
Read and write KukGit repositories, files, issues and pull requests from an AI assistant.
Access the GitHub API, enabling file operations, repository management, search functionality, and…
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables interaction with GitLab repositories through secure OAuth 2.0 authentication. Supports comprehensive GitLab operations including merge requests, issues, file management, commits, and branch operations through natural language.25 npmMIT
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to interact with GitLab repositories, manage merge requests, review code diffs, post comments, and handle issues directly through natural language.164 npmMIT
- FlicenseNot gradedqualityNot gradedmaintenanceEnables AI agents to interact with GitLab repositories, monitor documentation changes, manage issues and merge requests, and search across projects with comprehensive file and commit operations.-
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to interact with GitLab for managing projects, branches, issues, and merge requests. It provides tools for searching code and performing file operations like reading and writing directly within repositories.24 npmMIT