Skip to content

Issue Tools

Ten tools covering the full issue lifecycle on the board: create, create in bulk, update, delete, search, list-mine, prepare project/issue context, pick up an issue end-to-end, and render the daily Today snapshot.

create-issue

Create a new issue in a project.

Parameters

ParameterTypeRequiredDescription
project_idintegerYesThe project to create the issue in
titlestringYesIssue title (max 255 characters)
descriptionstringYesIssue description (max 65,535 characters)
lane_idintegerNoLane to place the issue in. Defaults to the first lane if omitted.
priorityintegerNo0 Highest, 1 High, 2 Medium (default), 3 Low, 4 Lowest
typeintegerNo0 Feature (default), 1 Bug
assignee_idintegerNoUser ID to assign. Use project members to find IDs.
sprint_idintegerNoSprint to add the issue to
epic_idintegerNoEpic to link the issue to. Bidirectional with update-epic's issue_ids.
label_idsarrayNoLabel IDs to attach (must belong to the same project). Omit or pass [] for none.
blocked_by_idsarrayNoIssue IDs that block this issue (must be in the same project)
blocks_idsarrayNoIssue IDs that this issue blocks (must be in the same project)
estimated_minutesintegerNoEstimated time in minutes (minimum 0)

Behavior

  • If lane_id is omitted, the issue is placed in the project's first lane automatically
  • The lane, sprint, and assignee are all validated to belong to the specified project
  • Blocking relations must reference issues within the same project
  • In the description, a plain @Full Name (or unique first name) of a project member becomes a real mention and notifies that member. Ambiguous or unknown names stay literal text, and names inside code blocks are never matched
  • Returns the created issue with its generated key (e.g., KD-0042), ID, lane, assignee, sprint, and blocking relations

Example Prompt

Create a high-priority bug in the kendo project: "Login form rejects valid email addresses". The form strips everything after a + in the address. Assign it to Jasper.

bulk-create-issues

Create up to 25 issues in one call. Use this instead of calling create-issue repeatedly when importing or generating a backlog — 250 issues becomes 10 calls rather than 250.

Parameters

ParameterTypeRequiredDescription
project_idintegerYesThe project to create the issues in
lane_idintegerNoLane for every issue in the batch. Defaults to the project's first lane. One lane applies to the whole batch.
rowsarrayYes1–25 issues to create. Each row: title (required, max 255), description (required, max 65,535), priority (optional), type (optional)

Behavior

  • Every issue lands in the backlog. No sprint_id is accepted, so created issues appear on the Backlog tab, not the board. Assign them afterwards with assign-issues-to-sprint, or link them to an epic with update-epic.
  • One lane for the batch. Per-row lanes aren't supported; move individual issues afterwards if they need different columns.
  • A malformed row rejects the entire call. Because every row field is validated up front, one row missing a title — or carrying an out-of-range priority — means nothing is created. Fix the row and resend the whole batch; there is no risk of duplicates.
  • A row that fails during creation does not stop the others. Infrastructure faults (a database error, a lock timeout) are reported per row in failed while its siblings still commit. The error text is fixed guidance, not a diagnosis — the underlying cause is recorded server-side rather than returned, so retry a failed row once and report it if it fails again.
  • Batch-created issues are indistinguishable from individually created ones — same key format, ranks, watchers, audit entries and lane placement — because this tool reuses the same creation path as create-issue.
  • @Full Name mentions in a description work exactly as they do on create-issue, and notify that member per issue.
  • Only these fields are supported per row. Assignee, sprint, epic, labels, blocking relations, estimates and attachments are deliberately out of scope — set them afterwards with update-issue or the bulk-assign tools.

Response Fields

FieldTypeDescription
created_countintegerHow many issues were created
failed_countintegerHow many rows failed
completebooleantrue when every row was created
keysarrayDisplay keys of the created issues (e.g. KD-0142), in the order the rows were submitted
failedarrayRows that failed. Each entry has index — the 0-based position in the rows array you sent — and error, a fixed guidance string. Resend only those rows, once; the others exist.

The response is deliberately thin: no descriptions are echoed back and no URLs are included, because mirroring create-issue's full payload across 25 rows would cost more tokens than the batching saves.

Rate Limits

A tenant may create up to 250 rows per minute (100 on the free plan). The batch is refused before anything is created, and the error names both the limit and when it resets. This is separate from the endpoint's own request limit — it exists because one bulk request carries 25× the writes of a single create.

Example Prompt

Take the twelve features from our roadmap doc and create them as issues in the kendo project backlog, with the two auth ones as Highest priority.

update-issue

Update an existing issue. Only provided fields are changed — omitted fields keep their current values.

Parameters

ParameterTypeRequiredDescription
issue_idintegerOne ofThe numeric ID of the issue (provide issue_id or issue_key, not both)
issue_keystringOne ofThe issue key, e.g. "KD-0042" (provide issue_id or issue_key, not both)
titlestringNoNew title (max 255 characters)
descriptionstringNoNew description (max 65,535 characters)
lane_idintegerNoTarget lane ID to move the issue to (must be in the same project)
priorityintegerNo0 Highest, 1 High, 2 Medium, 3 Low, 4 Lowest
typeintegerNo0 Feature, 1 Bug
assignee_idintegerNoUser ID to assign, or null to unassign
sprint_idintegerNoSprint ID, or null to remove from sprint. For multiple issues at once, prefer assign-issues-to-sprint — one batched call instead of looping.
epic_idintegerNoEpic ID, or null to unlink from epic. Bidirectional with update-epic's issue_ids.
blocked_by_idsarrayNoReplaces all "blocked by" relations. Omit to preserve, [] to clear.
blocks_idsarrayNoReplaces all "blocks" relations. Omit to preserve, [] to clear.
estimated_minutesintegerNoEstimated time in minutes, or null to clear

Behavior

  • Partial updates: only fields you include are modified. This is different from the API which requires all fields.
  • Lane changes: pass lane_id to move an issue to a different lane on the board. The lane must belong to the same project.
  • Blocking relations: omitting blocked_by_ids/blocks_ids preserves existing relations. Pass an empty array [] to explicitly clear them.
  • Mentions: in the description, a plain @Full Name (or unique first name) of a project member becomes a real mention and notifies that member. Ambiguous or unknown names stay literal text.
  • Pass null for assignee_id, sprint_id, or estimated_minutes to clear those values.

Example Prompt

Bump KD-42 to highest priority and assign it to Sarah

delete-issue

Permanently delete an issue and all its comments.

Destructive

This action cannot be undone. The issue and all associated comments are permanently removed.

Parameters

ParameterTypeRequiredDescription
issue_idintegerOne ofThe numeric ID of the issue (provide issue_id or issue_key, not both)
issue_keystringOne ofThe issue key, e.g. "KD-0042" (provide issue_id or issue_key, not both)

Example Prompt

Delete the duplicate issue KD-38, it's the same as KD-42

search-issues

Search issues within a project by text query and/or filters. This tool is read-only and safe to call repeatedly.

Parameters

ParameterTypeRequiredDescription
project_idintegerYesThe project to search in
querystringNoText search across title, description, and issue key (max 200 characters)
lane_idintegerNoFilter by lane
assignee_idintegerNoFilter by assignee
sprint_idintegerNoFilter by sprint
epic_idintegerNoFilter by epic
priorityintegerNoFilter by priority (04)
typeintegerNoFilter by type (0 Feature, 1 Bug)
label_idsarrayNoFilter by label IDs — returns issues carrying ANY of these labels (OR). All IDs must belong to the project.
limitintegerNoMax results (1–100, default 25)

Behavior

  • Results are ordered by most recently updated
  • All filters are optional and combine with AND logic
  • Returns matching issues with key, title, assignee, priority, and type
  • Each result includes attachments_count — the number of files attached to the issue
  • Marked as #[IsReadOnly] and #[IsIdempotent] — safe to call multiple times with no side effects

Response Fields

Alongside the issues array, the response surfaces truncation metadata so the caller knows when the result set was capped:

FieldTypeDescription
totalintegerNumber of issues actually returned
truncatedbooleantrue when the result set was capped at limit; refine filters to see more matches
limitintegerServer-side cap applied to this request
issuesobject[]Matching issues

Example Prompt

Show me all high-priority bugs assigned to Jasper in the kendo project

get-my-issues

Get issues assigned to you — your current work, tasks, and tickets. Excludes issues in the "done" lane (last lane per project).

Parameters

ParameterTypeRequiredDescription
project_idintegerNoFilter to a specific project (omit for all accessible projects)
priorityintegerNoFilter by priority (04)
typeintegerNoFilter by type (0 Feature, 1 Bug)
querystringNoText search across issue title and key (max 255 characters)

Behavior

  • Returns only issues assigned to the authenticated user
  • Excludes issues in the last lane (done) of each project
  • Results ordered by most recently updated
  • Respects project accessibility — non-admin users only see issues in projects they can access
  • Marked as #[IsReadOnly] and #[IsIdempotent]

Response Fields

Alongside the issues array, the response surfaces truncation metadata so the caller knows when the result set was capped at the server-side cap (currently 500):

FieldTypeDescription
countintegerNumber of issues actually returned
truncatedbooleantrue when the result set was capped at limit; refine filters to see more matches
limitintegerServer-side cap applied to this request
issuesobject[]List of assigned issues

Example Prompts

What am I working on right now?

Show me my high-priority bugs across all projects

What tickets do I have in the kendo project?

prepare-project-context

Bundle the project's structural meta into one read: the project itself, all its lanes (board columns), all Planned and Active sprints (with active_sprint as a shortcut to the currently Active one), the project's labels, the project members (for assignee lookup), and the calling user. Use this as the gather step for any project-scoped flow — triage, board sync, branch creation, picking up an issue. Replaces separate reads of kendo://projects/{id}, kendo://projects/{id}/lanes, kendo://projects/{id}/sprints, and kendo://projects/{id}/members. For Completed sprints, use get-sprints with status=2.

Pair with prepare-issue-context

When you also need a specific issue's payload (comments, branch links, attachments), fire prepare-project-context and prepare-issue-context in parallel — same wall-clock as one round-trip. See Workflows → Prepare an issue.

Parameters

ParameterTypeRequiredDescription
project_idintegeryesThe numeric ID of the project

Behavior

  • Marked as #[IsReadOnly] and #[IsIdempotent] — safe to call repeatedly with no side effects
  • sprints contains only Planned (0) and Active (1) sprints, ordered by start date. Completed sprints are excluded — use get-sprints with status=2 for those
  • active_sprint is a shortcut to the Active sprint from sprints, or null when none is Active
  • members returns every user who reaches the project via team membership or direct membership, ordered by first name then last name
  • members_count companion field lets you shortcut without iterating
  • current_user is the authenticated MCP user — use this instead of guessing from git config user.email when deciding the assignee for a "start working on this" flow
  • The full issue list is not included; for a single issue's payload (comments, branches, attachments), call prepare-issue-context — typically in parallel

Response Fields

FieldTypeDescription
projectobjectProject payload — the same fields as kendo://projects/{id}, including its archived state
lanesobject[]Project lanes ordered by position (id, title, color, order, issues_count)
sprintsobject[]Planned and Active sprints ordered by start date (id, title, status, start, end, issues_count). Completed sprints excluded.
active_sprintobject | nullShortcut to the currently Active sprint from sprints (id, title, status, start, end, issues_count), or null
labelsobject[]Project labels ordered by position (id, name, color, order) — use label.id as label_ids in search-issues or sync-issue-labels
membersobject[]Project members ordered by first_name, then last_name (id, name, email) — use member.id as assignee_id
members_countintegerTotal number of members returned
current_userobjectThe authenticated MCP user (id, name, email)

Example Prompt

Pull together the project context for kendo: lanes, sprints, labels, members, and tell me who I am.

prepare-issue-context

Bundle a single issue's full payload into one read: the issue (with comments, branch links, time spent, attachments) and its linked epic. For project meta (lanes, active sprint, members, calling user), call prepare-project-context — typically in parallel with this tool.

Pair with start-work-on-issue

Call prepare-issue-context and prepare-project-context in parallel to gather, then start-work-on-issue to act (assign, move lane, link branch) in one idempotent write. See Workflows → Prepare an issue.

Parameters

ParameterTypeRequiredDescription
issue_idintegerOne ofThe numeric ID of the issue (provide issue_id or issue_key, not both)
issue_keystringOne ofThe issue key, e.g. "KD-0042" (provide issue_id or issue_key, not both)

Behavior

  • Marked as #[IsReadOnly] and #[IsIdempotent] — safe to call repeatedly with no side effects
  • epic is null when the issue has no linked epic
  • Project meta (lanes, active sprint, members, current user) is not included by design — use prepare-project-context for that, in parallel when you need both

Response Fields

FieldTypeDescription
issueobjectFull issue payload — same shape as kendo://issues/{key} (id, key, title, description, priority, type, project, lane, assignee, sprint, comments, blocked_by_ids, blocks_ids, epic_id, user_id, branch_links, estimated_minutes, total_minutes_spent, attachments, created_at, updated_at)
epicobject | nullEpic linked to the issue (id, title, description, status, status_value, color, start, end), or null

Example Prompt

I want to start working on KD-42. Fire prepare-issue-context and prepare-project-context in parallel and tell me what I'm picking up.

start-work-on-issue

Pick up an issue in one idempotent call — assign it, move it to the target lane (e.g. "In Progress"), optionally add it to a sprint, and link a git branch. Re-running with the same values is a no-op. The GitHub repository is auto-resolved from the project's primary repo.

Pair with the prepare-context tools

Call prepare-issue-context and prepare-project-context in parallel to gather the issue payload and project meta, then start-work-on-issue to act — assign, move lane, link branch — in one write. See Workflows → Prepare an issue.

Parameters

ParameterTypeRequiredDescription
issue_idintegerOne ofThe numeric ID of the issue (provide issue_id or issue_key, not both)
issue_keystringOne ofThe issue key, e.g. "KD-0042" (provide issue_id or issue_key, not both)
branch_namestringYesThe git branch name to link to the issue
assignee_idintegerNoUser ID to assign the issue to
lane_idintegerNoTarget lane ID to move the issue to (must be in the same project)
sprint_idintegerNoSprint ID. Omit to preserve existing; pass null to remove from sprint; pass an ID to set.
repo_idintegerConditionalTarget GitHub repo ID. Omit on single-repo projects. On multi-repo projects, omit on the first attempt; if you get a candidate-listing error, retry with one of the listed repo IDs (look up IDs via the kendo://projects/{id}/github-repos resource) or ask the human to pick.

Behavior

  • Idempotent — re-running with the same branch_name, assignee_id, lane_id, and sprint_id produces no further state change
  • The branch is linked against the project's only GitHub repo when there is exactly one — no repo_id needed
  • On multi-repo projects without repo_id, the tool returns a candidate-listing error rather than guessing — retry with the right repo_id
  • Returns the updated issue (with lane, assignee, sprint) and the branch-link record (existing on replay, otherwise newly created)

Example Prompt

Start work on KD-0042: assign it to me, move it to "In Progress", add it to the active sprint, and link branch KD-0042-fix-login-form.

kendo-today

Render the Kendo Today card inline in Claude Desktop (MCP Apps / SEP-1865). Returns the user's active sprints, open issues grouped per project, and today's logged minutes as a single atomic snapshot. Prefer this over get-my-issues for daily-overview questions like "what's on my plate today" — the widget bundles the deep-links and quick-log chips the user needs.

Parameters

No parameters — operates on the authenticated user.

Response Fields

FieldTypeDescription
activeSprintsobject[]Active sprints across accessible projects — each with id, title, projectId, projectName, myOpenIssuesCount
myIssuesobject[]User's open issues (excluding final-lane) — each with id, key, title, type (feature | bug | task), projectId, projectName
todayMinutesintegerTotal minutes logged by the user today across accessible projects

Example Prompt

What's on my plate today?

See Also

  • Resources — Read issue data via kendo://issues/{id} and kendo://projects/{id}/issues
  • Issues & Board Guide — Understanding the board, lanes, and blocking relationships
  • Issues API — REST endpoints for issue management