Appearance
Issue Tools
Five tools for managing issues on the board: create, update, delete, search, and get your assigned issues.
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. |
order | integer | No | Display order in the lane (default 0, minimum 0) |
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
- 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. - 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) |
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), the currently Active sprint, 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.
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 active_sprintisnullwhen no sprint in the project currently has statusActive(1)membersreturns 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) |
active_sprint | object | null | The project's currently Active sprint (id, title, status, start, end, issues_count), or null |
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, active sprint, 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, order, 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, order), 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.
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