Skip to content

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.

  • Issues by identifier, such as ACME-42. Spelling is forgiving (acme42 and acme 42 work), 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.

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.

ParameterTypeDescription
qrequiredstringSearch text (title and description).
teamstringOnly issues of this team.
includeClosedbooleanAlso return done, canceled and duplicate issues. Default: true.
limitintegerMaximum 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.

ParameterTypeDescription
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.
teamstringOnly issues of this team.
statusarray of stringOnly 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).
labelstringOnly issues with this label (name, case-insensitive).
projectstringOnly issues in this project (name, case-insensitive).
dueWithinDaysintegerWindow for the "due" filter, in days. Default: 7.
snoozedbooleantrue = 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.
limitintegerMaximum 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.

ParameterTypeDescription
identifierstringIssue identifier like "ACME-106" (case-insensitive, also "acme106" or "acme 106"; old identifiers work too).
idstringInternal 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.

ParameterTypeDescription
unreadOnlybooleanOnly entries the owner has not read yet. Default: false.
limitintegerMaximum number of entries. Default: 50.

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.

ParameterTypeDescription
requestIdrequiredstringIdempotency 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.
issuesrequiredarray of objectsIssues to create, 1 to 50. All are created in one transaction.
issues[].teamrequiredstringTeam key like "ACME" (case-insensitive). See list_teams.
issues[].titlerequiredstringIssue title.
issues[].descriptionstringMarkdown description.
issues[].statusstringInitial 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[].priorityinteger or stringPriority: 0 = none, 1 = urgent, 2 = high, 3 = medium, 4 = low. The words "none", "urgent", "high", "medium", "low" are accepted too.
issues[].labelsarray of stringLabel names (case-insensitive). The full set: replaces existing labels. See list_labels.
issues[].projectstringProject name (case-insensitive), must belong to the team.
issues[].estimatenumberEstimate in points.
issues[].dueDatestringDue date, YYYY-MM-DD.
issues[].parentstringParent 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.

ParameterTypeDescription
requestIdstringIdempotency 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.
identifierrequiredstringIssue identifier like "ACME-106" (case-insensitive, also "acme106" or "acme 106"; old identifiers work too).
titlestringIssue title.
statusstringWorkflow 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).
priorityinteger or stringPriority: 0 = none, 1 = urgent, 2 = high, 3 = medium, 4 = low. The words "none", "urgent", "high", "medium", "low" are accepted too.
labelsarray of stringLabel names (case-insensitive). The full set: replaces existing labels. See list_labels.
projectstring or nullProject name, or null to remove.
estimatenumber or nullEstimate in points.
dueDatestring or nullDue date YYYY-MM-DD, or null to remove.
snoozedUntilstring or nullSnooze 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.
parentstring or nullParent identifier, or null to remove.
descriptionstringNew Markdown description (replaces the old one). Requires expectedDescriptionVersion.
expectedDescriptionVersionintegerVersion 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.
expectedobjectOptional: 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.

ParameterTypeDescription
requestIdstringIdempotency 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.
identifiersrequiredarray of stringIssues to change, 1 to 50.
statusrequiredstringNew 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.

ParameterTypeDescription
requestIdstringIdempotency 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.
identifiersrequiredarray of stringIssues to move, 1 to 50 (old identifiers work too).
teamrequiredstringKey of the team to move the issues to. See list_teams.

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.

ParameterTypeDescription
requestIdrequiredstringIdempotency 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.
identifierrequiredstringIssue identifier like "ACME-106" (case-insensitive, also "acme106" or "acme 106"; old identifiers work too).
bodyrequiredstringComment in Markdown.

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.

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.

ParameterTypeDescription
qrequiredstringSearch text (title and full text of the pages).
teamstringOnly pages of this team.
limitintegerMaximum 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.

ParameterTypeDescription
teamrequiredstringTeam whose knowledge area to list. See list_teams (field wiki).
projectstringOnly pages of this project (name, case-insensitive).
topicstringOnly 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.

ParameterTypeDescription
idrequiredstringArticle 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.

ParameterTypeDescription
requestIdrequiredstringIdempotency 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.
teamrequiredstringTeam of the page. The team needs a knowledge area (list_teams: wiki).
titlerequiredstringPage title.
markdownstringMarkdown text of the page.
parentstringParent page id: the new page becomes a sub-page.
projectstringProject name (case-insensitive) of the same team, for project documentation.
topicsarray of stringTopic names (case-insensitive), the full set. Unknown topics are created in the team. At most 20.
sourcesarray of objectsSources of the page.
sources[].urlstringhttp(s) address of the source.
sources[].titlestringTitle of the source (required if there is no url).
sources[].authorstringAuthor or publisher.
sources[].publishedAtstringPublication date: YYYY, YYYY-MM or YYYY-MM-DD.
sources[].accessedAtstringDay the source was accessed, YYYY-MM-DD. Default: today.
sources[].notestringShort 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.

ParameterTypeDescription
requestIdrequiredstringIdempotency 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.
idrequiredstringArticle id (from search_articles, list_articles or an earlier result).
titlestringNew title.
parentstring or nullNew parent page id, or null for the top level.
projectstring or nullProject name, or null to remove.
topicsarray of stringTopic names (case-insensitive), the full set. Unknown topics are created in the team. At most 20.
markdownstringNew Markdown text (replaces the old one). Requires expectedVersion.
expectedVersionintegerVersion 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.
appendstringMarkdown to add at the end of the text (no version needed), e.g. new findings.
addSourcesarray of objectsSources to add at the end of the list.
addSources[].urlstringhttp(s) address of the source.
addSources[].titlestringTitle of the source (required if there is no url).
addSources[].authorstringAuthor or publisher.
addSources[].publishedAtstringPublication date: YYYY, YYYY-MM or YYYY-MM-DD.
addSources[].accessedAtstringDay the source was accessed, YYYY-MM-DD. Default: today.
addSources[].notestringShort 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.

ParameterTypeDescription
includeDormantbooleanAlso list dormant (inactive) teams. Default: true.

list_projectsread

List projects

List projects with name, team and state. Every project belongs to exactly one team.

ParameterTypeDescription
teamstringOnly projects of this team.
includeClosedbooleanAlso 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.

ParameterTypeDescription
teamstringOnly 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.

ParameterTypeDescription
teamstringOnly the statuses of this team.