MCP tools
These are all the tools XLR8’s MCP server offers. The page is generated from the server’s tool list, so the descriptions below are the same ones your agent sees. Tools marked read never change anything; tools marked write do.
How agents refer to things
Section titled “How agents refer to things”- Issues by identifier, such as
ACME-42. Spelling is forgiving (acme42andacme 42work), and old identifiers of issues that moved to another team still resolve. - Teams by key, such as
ACME. - Labels, projects and statuses by name, case-insensitive. Each team has its own statuses; agents
can also use a status key (
triage,backlog,todo,in_progress,in_review,done,canceled,duplicate), which maps to the team’s matching status. - Priorities as a word (
urgent,high,medium,low,none) or a number from 0 to 4.
Errors such as an unknown label or a status the workflow doesn’t allow come back as a readable message, so the agent can correct itself and try again.
Find and read issues
Section titled “Find and read issues”search_issuesread
Search issues
Full-text search over issue titles and descriptions across all teams. Returns identifier, title, status, priority and team for each hit, best matches first.
| Parameter | Type | Description |
|---|---|---|
qrequired | string | Search text (title and description). |
team | string | Only issues of this team. |
includeClosed | boolean | Also return done, canceled and duplicate issues. Default: true. |
limit | integer | Maximum number of results. Default: 20. |
list_issuesread
List issues
List issues with a preset filter (assigned, due, overdue, in_progress, done_today, triage, sprint) and/or by team, status, label and project. Filters combine with AND; without filter or status you get all open issues (triage up to the started statuses). Deleted issues are never returned. Sorted by priority (urgent first, none last), then due date.
| Parameter | Type | Description |
|---|---|---|
filter | "assigned", "due", "overdue", "in_progress", "done_today", "triage", "sprint" | Preset filter: "assigned" = all open issues (status type backlog, unstarted or started) outside triage, in teams that are not dormant and not knowledge-only. XLR8 has a single user (the owner) and no assignee field, so this is what "assigned to me" means; "due" = open issues due within dueWithinDays days from today, overdue ones included; "overdue" = open issues with a due date before today; "in_progress" = issues in a started status (e.g. In Progress, In Review); "done_today" = issues completed today; "triage" = issues in triage (the inbox); "sprint" = issues in the currently active sprint. Days are calendar days in Europe/Berlin. |
team | string | Only issues of this team. |
status | array of string | Only issues with one of these statuses: status names (case-insensitive, see list_statuses), status keys (triage, backlog, todo, in_progress, in_review, done, canceled, duplicate) or status types (unstarted, started, completed). |
label | string | Only issues with this label (name, case-insensitive). |
project | string | Only issues in this project (name, case-insensitive). |
dueWithinDays | integer | Window for the "due" filter, in days. Default: 7. |
snoozed | boolean | true = only snoozed issues (snoozedUntil is set), false = only issues that are not snoozed. Without it, snoozed issues are listed like any other; each shows its snoozedUntil. |
limit | integer | Maximum number of results. Default: 50. |
get_issueread
Get issue
Get one issue by identifier (e.g. "ACME-106", old identifiers resolve too) or internal id: all fields, the Markdown description with its version, comments, relations (blocks, related, duplicate), sub-issues, linked pull requests, related knowledge pages (knowledge, read them with get_article) and the most recent history entries.
| Parameter | Type | Description |
|---|---|---|
identifier | string | Issue identifier like "ACME-106" (case-insensitive, also "acme106" or "acme 106"; old identifiers work too). |
id | string | Internal issue id (from an earlier result). |
list_inboxread
List inbox
Read-only view of the owner's inbox, newest first: one entry per issue that agents created or changed and the owner has not removed yet. Each entry names the agents and their latest change per field (status, comment, description, …), and whether the owner has read it. Several changes to the same issue are one entry. Use it to see what is still waiting for the owner; reading and removing entries is reserved for the owner.
| Parameter | Type | Description |
|---|---|---|
unreadOnly | boolean | Only entries the owner has not read yet. Default: false. |
limit | integer | Maximum number of entries. Default: 50. |
Create and change issues
Section titled “Create and change issues”create_issueswrite
Create issues
Create 1 to 50 issues in one transaction. Teams are given by key, labels and project by name. Issues created by agents are marked as "not yet reviewed" for the owner. requestId makes the call safe to retry. The result lists the new identifiers and any warnings (e.g. priority budget exceeded). An issue created with a status of type completed or canceled (done, canceled, duplicate) gets no priority; a warning with code priority_cleared names the priority that was dropped.
| Parameter | Type | Description |
|---|---|---|
requestIdrequired | string | Idempotency key chosen by you (e.g. a UUID). Repeating a call with the same requestId and the same arguments returns the original result instead of acting twice; the same requestId with different arguments is rejected. |
issuesrequired | array of objects | Issues to create, 1 to 50. All are created in one transaction. |
issues[].teamrequired | string | Team key like "ACME" (case-insensitive). See list_teams. |
issues[].titlerequired | string | Issue title. |
issues[].description | string | Markdown description. |
issues[].status | string | Initial status. Default: triage for agents. A status name of the issue's team (case-insensitive, see list_statuses), or one of the keys triage, backlog, todo, in_progress, in_review, done, canceled, duplicate (the team's matching status). |
issues[].priority | integer or string | Priority: 0 = none, 1 = urgent, 2 = high, 3 = medium, 4 = low. The words "none", "urgent", "high", "medium", "low" are accepted too. |
issues[].labels | array of string | Label names (case-insensitive). The full set: replaces existing labels. See list_labels. |
issues[].project | string | Project name (case-insensitive), must belong to the team. |
issues[].estimate | number | Estimate in points. |
issues[].dueDate | string | Due date, YYYY-MM-DD. |
issues[].parent | string | Parent issue identifier, e.g. "ACME-100". |
update_issuewrite
Update issue
Change fields of one issue. Only the given fields change; null removes project, estimate, due date, snooze or parent. Pass expected with the values you saw to avoid overwriting a concurrent change. Changing the description requires expectedDescriptionVersion from get_issue. Set snoozedUntil to a future day to snooze an issue (hidden from the owner's lists, back in the inbox with a push that morning) and null to unsnooze it. The result lists applied fields, conflicts and warnings. Moving an issue to done, canceled or duplicate removes its priority (only open work carries one); a warning with code priority_cleared names the removed priority, and reopening the issue does not restore it.
| Parameter | Type | Description |
|---|---|---|
requestId | string | Idempotency key chosen by you (e.g. a UUID). Repeating a call with the same requestId and the same arguments returns the original result instead of acting twice; the same requestId with different arguments is rejected. Optional here; recommended together with expected, so that a retry after a lost response does not report a conflict with your own change. |
identifierrequired | string | Issue identifier like "ACME-106" (case-insensitive, also "acme106" or "acme 106"; old identifiers work too). |
title | string | Issue title. |
status | string | Workflow status. A status name of the issue's team (case-insensitive, see list_statuses), or one of the keys triage, backlog, todo, in_progress, in_review, done, canceled, duplicate (the team's matching status). |
priority | integer or string | Priority: 0 = none, 1 = urgent, 2 = high, 3 = medium, 4 = low. The words "none", "urgent", "high", "medium", "low" are accepted too. |
labels | array of string | Label names (case-insensitive). The full set: replaces existing labels. See list_labels. |
project | string or null | Project name, or null to remove. |
estimate | number or null | Estimate in points. |
dueDate | string or null | Due date YYYY-MM-DD, or null to remove. |
snoozedUntil | string or null | Snooze the issue until this day, YYYY-MM-DD (after today, Europe/Berlin), or null to unsnooze. A snoozed issue is hidden from the owner's lists; on that day, in the morning, it returns to the inbox with a push notification. Only open issues can be snoozed; closing an issue ends its snooze. |
parent | string or null | Parent identifier, or null to remove. |
description | string | New Markdown description (replaces the old one). Requires expectedDescriptionVersion. |
expectedDescriptionVersion | integer | Version of the description you based your edit on (from get_issue). If the description changed since, nothing is overwritten and the result tells you so. |
expected | object | Optional: the values you believe the fields have right now. If a field changed in the meantime, that field is not written and the result reports a conflict. Labels are compared as a set. Fields: title, status, priority, labels, project, estimate, dueDate, snoozedUntil, parent. |
set_statuswrite
Set status
Set the status of 1 to 50 issues at once, by status name of each issue's team (see list_statuses) or by key, e.g. "done" or "in_progress". Each change is recorded in the issue history with you as the actor. Moving an issue to done, canceled or duplicate removes its priority (only open work carries one); the result then has warnings with code priority_cleared naming each removed priority, and reopening does not restore it.
| Parameter | Type | Description |
|---|---|---|
requestId | string | Idempotency key chosen by you (e.g. a UUID). Repeating a call with the same requestId and the same arguments returns the original result instead of acting twice; the same requestId with different arguments is rejected. Optional here; recommended together with expected, so that a retry after a lost response does not report a conflict with your own change. |
identifiersrequired | array of string | Issues to change, 1 to 50. |
statusrequired | string | New status. A status name of the issue's team (case-insensitive, see list_statuses), or one of the keys triage, backlog, todo, in_progress, in_review, done, canceled, duplicate (the team's matching status). |
move_issueswrite
Move issues to another team
Move 1 to 50 issues to another team in one transaction. Each issue gets a new identifier in the target team (e.g. OPS-24 becomes ACME-120); the old identifier stays valid as an alias in every tool. What happens: the project is removed unless it belongs to the target team (projects belong to exactly one team); labels of the old team are removed, workspace labels stay; the status becomes the matching status of the target team (same default status, else same name, else same status type), the strict workflow order is not applied; sprint, parent, priority, estimate, due date, description, comments and history are kept. The result names old and new identifier, the removed project and labels and the status set for every issue; issues already in the target team are listed under unchanged. If any issue cannot be moved (unknown, in the trash), nothing is moved. requestId makes the call safe to retry.
| Parameter | Type | Description |
|---|---|---|
requestId | string | Idempotency key chosen by you (e.g. a UUID). Repeating a call with the same requestId and the same arguments returns the original result instead of acting twice; the same requestId with different arguments is rejected. Optional here; recommended together with expected, so that a retry after a lost response does not report a conflict with your own change. |
identifiersrequired | array of string | Issues to move, 1 to 50 (old identifiers work too). |
teamrequired | string | Key of the team to move the issues to. See list_teams. |
Comments
Section titled “Comments”add_commentwrite
Add comment
Add a Markdown comment to an issue, e.g. a progress report. requestId makes the call safe to retry without duplicate comments.
| Parameter | Type | Description |
|---|---|---|
requestIdrequired | string | Idempotency key chosen by you (e.g. a UUID). Repeating a call with the same requestId and the same arguments returns the original result instead of acting twice; the same requestId with different arguments is rejected. |
identifierrequired | string | Issue identifier like "ACME-106" (case-insensitive, also "acme106" or "acme 106"; old identifiers work too). |
bodyrequired | string | Comment in Markdown. |
Sprints
Section titled “Sprints”get_current_sprintread
Get current sprint
Get the active sprint (spans all teams): name, goal, dates, capacity, points done/total and its issues split into planned and added later. If no sprint is active, returns the sprint in planning, if any.
No parameters.
Knowledge pages
Section titled “Knowledge pages”These tools work in teams that have a knowledge area.
search_articlesread
Search knowledge pages
Full-text search over the knowledge pages of all teams or one team: titles and the whole text. Returns id, title, team, path of parent pages and a snippet; pages with all words first. Pages in the trash are not returned.
| Parameter | Type | Description |
|---|---|---|
qrequired | string | Search text (title and full text of the pages). |
team | string | Only pages of this team. |
limit | integer | Maximum number of results. Default: 20. |
list_articlesread
List knowledge pages
List the knowledge pages of one team as a tree (each page with its parent id), optionally only of one project or topic, without text. Also returns the team's topics. Use get_article for the text.
| Parameter | Type | Description |
|---|---|---|
teamrequired | string | Team whose knowledge area to list. See list_teams (field wiki). |
project | string | Only pages of this project (name, case-insensitive). |
topic | string | Only pages with this topic (name, case-insensitive). |
get_articleread
Get knowledge page
Get one knowledge page by id: title, Markdown text with its version (for update_article), sources, topics, project, path of parent pages, sub-pages, and who changed it when.
| Parameter | Type | Description |
|---|---|---|
idrequired | string | Article id (from search_articles, list_articles or an earlier result). |
create_articlewrite
Create knowledge page
Create a knowledge page in a team with a knowledge area, optionally as a sub-page, with project, topics (unknown ones are created) and structured sources. requestId makes the call safe to retry. Use search_articles first to avoid duplicates.
| Parameter | Type | Description |
|---|---|---|
requestIdrequired | string | Idempotency key chosen by you (e.g. a UUID). Repeating a call with the same requestId and the same arguments returns the original result instead of acting twice; the same requestId with different arguments is rejected. |
teamrequired | string | Team of the page. The team needs a knowledge area (list_teams: wiki). |
titlerequired | string | Page title. |
markdown | string | Markdown text of the page. |
parent | string | Parent page id: the new page becomes a sub-page. |
project | string | Project name (case-insensitive) of the same team, for project documentation. |
topics | array of string | Topic names (case-insensitive), the full set. Unknown topics are created in the team. At most 20. |
sources | array of objects | Sources of the page. |
sources[].url | string | http(s) address of the source. |
sources[].title | string | Title of the source (required if there is no url). |
sources[].author | string | Author or publisher. |
sources[].publishedAt | string | Publication date: YYYY, YYYY-MM or YYYY-MM-DD. |
sources[].accessedAt | string | Day the source was accessed, YYYY-MM-DD. Default: today. |
sources[].note | string | Short note, e.g. what the source supports. |
update_articlewrite
Update knowledge page
Change a knowledge page: title, parent, project, topics, and the text, either replaced (markdown with expectedVersion from get_article; a concurrent change fails with conflict) or extended (append, no version needed). addSources adds sources. The previous text is kept as an earlier version that the owner can restore. Deleting pages is reserved for the owner.
| Parameter | Type | Description |
|---|---|---|
requestIdrequired | string | Idempotency key chosen by you (e.g. a UUID). Repeating a call with the same requestId and the same arguments returns the original result instead of acting twice; the same requestId with different arguments is rejected. |
idrequired | string | Article id (from search_articles, list_articles or an earlier result). |
title | string | New title. |
parent | string or null | New parent page id, or null for the top level. |
project | string or null | Project name, or null to remove. |
topics | array of string | Topic names (case-insensitive), the full set. Unknown topics are created in the team. At most 20. |
markdown | string | New Markdown text (replaces the old one). Requires expectedVersion. |
expectedVersion | integer | Version of the text you based your edit on (from get_article). If the text changed since, nothing is overwritten and the call fails with conflict. |
append | string | Markdown to add at the end of the text (no version needed), e.g. new findings. |
addSources | array of objects | Sources to add at the end of the list. |
addSources[].url | string | http(s) address of the source. |
addSources[].title | string | Title of the source (required if there is no url). |
addSources[].author | string | Author or publisher. |
addSources[].publishedAt | string | Publication date: YYYY, YYYY-MM or YYYY-MM-DD. |
addSources[].accessedAt | string | Day the source was accessed, YYYY-MM-DD. Default: today. |
addSources[].note | string | Short note, e.g. what the source supports. |
Look up teams, projects, labels and statuses
Section titled “Look up teams, projects, labels and statuses”list_teamsread
List teams
List teams with key, name, whether they are dormant (inactive) and their knowledge area (wiki: "on" next to issues, "only" knowledge without issues, null none). Use the key in other tools.
| Parameter | Type | Description |
|---|---|---|
includeDormant | boolean | Also list dormant (inactive) teams. Default: true. |
list_projectsread
List projects
List projects with name, team and state. Every project belongs to exactly one team.
| Parameter | Type | Description |
|---|---|---|
team | string | Only projects of this team. |
includeClosed | boolean | Also list done and canceled projects. Default: false. |
list_labelsread
List labels
List labels with name, group and scope (workspace-wide or team). In an exclusive group an issue can carry only one label.
| Parameter | Type | Description |
|---|---|---|
team | string | Only workspace labels and labels of this team. |
list_statusesread
List statuses
List the workflow statuses of each team in workflow order: name, type (triage, backlog, unstarted, started, completed, canceled) and key. Teams define their own statuses; use the names in set_status, update_issue and list_issues. A team with strictOrder only allows moving to the next status, canceling, and the listed exceptions; get_issue then returns allowedStatuses, and a disallowed change fails with invalid_transition and the allowed targets.
| Parameter | Type | Description |
|---|---|---|
team | string | Only the statuses of this team. |