Appearance
Issue Tools
Nine tools covering the full issue lifecycle on the board: create, 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
| Parameter | Type | Required | Description |
|---|---|---|---|
project_id | integer | Yes | The project to create the issue in |
title | string | Yes | Issue title (max 255 characters) |
description | string | Yes | Issue description (max 65,535 characters) |
lane_id | integer | No | Lane to place the issue in. Defaults to the first lane if omitted. |
priority | integer | No | 0 Highest, 1 High, 2 Medium (default), 3 Low, 4 Lowest |
type | integer | No | 0 Feature (default), 1 Bug |
assignee_id | integer | No | User ID to assign. Use project members to find IDs. |
sprint_id | integer | No | Sprint to add the issue to |
epic_id | integer | No | Epic to link the issue to. Bidirectional with update-epic's issue_ids. |
label_ids | array | No | Label IDs to attach (must belong to the same project). Omit or pass [] for none. |
blocked_by_ids | array | No | Issue IDs that block this issue (must be in the same project) |
blocks_ids | array | No | Issue IDs that this issue blocks (must be in the same project) |
estimated_minutes | integer | No | Estimated time in minutes (minimum 0) |
Behavior
- If
lane_idis 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.
update-issue
Update an existing issue. Only provided fields are changed — omitted fields keep their current values.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
issue_id | integer | One of | The numeric ID of the issue (provide issue_id or issue_key, not both) |
issue_key | string | One of | The issue key, e.g. "KD-0042" (provide issue_id or issue_key, not both) |
title | string | No | New title (max 255 characters) |
description | string | No | New description (max 65,535 characters) |
lane_id | integer | No | Target lane ID to move the issue to (must be in the same project) |
priority | integer | No | 0 Highest, 1 High, 2 Medium, 3 Low, 4 Lowest |
type | integer | No | 0 Feature, 1 Bug |
assignee_id | integer | No | User ID to assign, or null to unassign |
sprint_id | integer | No | Sprint ID, or null to remove from sprint. For multiple issues at once, prefer assign-issues-to-sprint — one batched call instead of looping. |
epic_id | integer | No | Epic ID, or null to unlink from epic. Bidirectional with update-epic's issue_ids. |
blocked_by_ids | array | No | Replaces all "blocked by" relations. Omit to preserve, [] to clear. |
blocks_ids | array | No | Replaces all "blocks" relations. Omit to preserve, [] to clear. |
estimated_minutes | integer | No | Estimated 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_idto 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_idspreserves 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
nullforassignee_id,sprint_id, orestimated_minutesto 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
| Parameter | Type | Required | Description |
|---|---|---|---|
issue_id | integer | One of | The numeric ID of the issue (provide issue_id or issue_key, not both) |
issue_key | string | One of | The 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
| Parameter | Type | Required | Description |
|---|---|---|---|
project_id | integer | Yes | The project to search in |
query | string | No | Text search across title, description, and issue key (max 200 characters) |
lane_id | integer | No | Filter by lane |
assignee_id | integer | No | Filter by assignee |
sprint_id | integer | No | Filter by sprint |
epic_id | integer | No | Filter by epic |
priority | integer | No | Filter by priority (0–4) |
type | integer | No | Filter by type (0 Feature, 1 Bug) |
label_ids | array | No | Filter by label IDs — returns issues carrying ANY of these labels (OR). All IDs must belong to the project. |
limit | integer | No | Max 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:
| Field | Type | Description |
|---|---|---|
total | integer | Number of issues actually returned |
truncated | boolean | true when the result set was capped at limit; refine filters to see more matches |
limit | integer | Server-side cap applied to this request |
issues | object[] | 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
| Parameter | Type | Required | Description |
|---|---|---|---|
project_id | integer | No | Filter to a specific project (omit for all accessible projects) |
priority | integer | No | Filter by priority (0–4) |
type | integer | No | Filter by type (0 Feature, 1 Bug) |
query | string | No | Text 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):
| Field | Type | Description |
|---|---|---|
count | integer | Number of issues actually returned |
truncated | boolean | true when the result set was capped at limit; refine filters to see more matches |
limit | integer | Server-side cap applied to this request |
issues | object[] | 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
| Parameter | Type | Required | Description |
|---|---|---|---|
project_id | integer | yes | The numeric ID of the project |
Behavior
- Marked as
#[IsReadOnly]and#[IsIdempotent]— safe to call repeatedly with no side effects sprintscontains only Planned (0) and Active (1) sprints, ordered by start date. Completed sprints are excluded — useget-sprintswithstatus=2for thoseactive_sprintis a shortcut to the Active sprint fromsprints, ornullwhen none is Activemembersreturns every user who reaches the project via team membership or direct membership, ordered by first name then last namemembers_countcompanion field lets you shortcut without iteratingcurrent_useris the authenticated MCP user — use this instead of guessing fromgit config user.emailwhen 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
| Field | Type | Description |
|---|---|---|
project | object | Project payload — same shape as kendo://projects/{id} (id, name, description, issues_count, github_repos) |
lanes | object[] | Project lanes ordered by position (id, title, color, order, issues_count) |
sprints | object[] | Planned and Active sprints ordered by start date (id, title, status, start, end, issues_count). Completed sprints excluded. |
active_sprint | object | null | Shortcut to the currently Active sprint from sprints (id, title, status, start, end, issues_count), or null |
labels | object[] | Project labels ordered by position (id, name, color, order) — use label.id as label_ids in search-issues or sync-issue-labels |
members | object[] | Project members ordered by first_name, then last_name (id, name, email) — use member.id as assignee_id |
members_count | integer | Total number of members returned |
current_user | object | The 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
| Parameter | Type | Required | Description |
|---|---|---|---|
issue_id | integer | One of | The numeric ID of the issue (provide issue_id or issue_key, not both) |
issue_key | string | One of | The 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 epicisnullwhen the issue has no linked epic- Project meta (lanes, active sprint, members, current user) is not included by design — use
prepare-project-contextfor that, in parallel when you need both
Response Fields
| Field | Type | Description |
|---|---|---|
issue | object | Full 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) |
epic | object | null | Epic 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
| Parameter | Type | Required | Description |
|---|---|---|---|
issue_id | integer | One of | The numeric ID of the issue (provide issue_id or issue_key, not both) |
issue_key | string | One of | The issue key, e.g. "KD-0042" (provide issue_id or issue_key, not both) |
branch_name | string | Yes | The git branch name to link to the issue |
assignee_id | integer | No | User ID to assign the issue to |
lane_id | integer | No | Target lane ID to move the issue to (must be in the same project) |
sprint_id | integer | No | Sprint ID. Omit to preserve existing; pass null to remove from sprint; pass an ID to set. |
repo_id | integer | Conditional | Target 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, andsprint_idproduces no further state change - The branch is linked against the project's only GitHub repo when there is exactly one — no
repo_idneeded - On multi-repo projects without
repo_id, the tool returns a candidate-listing error rather than guessing — retry with the rightrepo_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
| Field | Type | Description |
|---|---|---|
activeSprints | object[] | Active sprints across accessible projects — each with id, title, projectId, projectName, myOpenIssuesCount |
myIssues | object[] | User's open issues (excluding final-lane) — each with id, key, title, type (feature | bug | task), projectId, projectName |
todayMinutes | integer | Total 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}andkendo://projects/{id}/issues - Issues & Board Guide — Understanding the board, lanes, and blocking relationships
- Issues API — REST endpoints for issue management