kaiten-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| KAITEN_URL | Yes | Kaiten instance URL, e.g. https://your-company.kaiten.ru | |
| KAITEN_API_TOKEN | Yes | API token (Bearer) for Kaiten. | |
| KAITEN_CACHE_TTL_MS | No | TTL for cached reference data in milliseconds (default: 300000). | |
| KAITEN_DEFAULT_SPACE_ID | No | Default space ID for search when spaceId is omitted. | |
| KAITEN_ALLOWED_BOARD_IDS | No | Comma-separated whitelist of board IDs. | |
| KAITEN_ALLOWED_SPACE_IDS | No | Comma-separated whitelist of space IDs the AI can access. | |
| KAITEN_REQUEST_TIMEOUT_MS | No | HTTP request timeout in milliseconds (default: 10000). |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| logging | {} |
| prompts | {
"listChanged": true
} |
| resources | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| kaiten_get_cardA | Get a single card by ID. Use verbosity=max for full detail (default is min, which returns 9 core fields). Set includeChildren=true to also fetch child cards. Resolve cardId via kaiten_search_cards or kaiten_get_board_cards. Returns: a single card object (simplified per verbosity). |
| kaiten_search_cardsA | Search cards with filters and pagination. Pass boardId (from kaiten_list_boards) or spaceId (from kaiten_list_spaces) to limit scope. The |
| kaiten_get_space_cardsA | Recent cards in a space (newest first, no filters). For filtered search use kaiten_search_cards. |
| kaiten_get_board_cardsA | Recent cards on a board (newest first, no filters). For filtered search use kaiten_search_cards. |
| kaiten_create_cardA | Create card. Requires boardId (from kaiten_list_boards) and columnId (from kaiten_list_columns). Optional: laneId (kaiten_list_lanes), typeId (kaiten_list_card_types), sizeText. ownerId must be a positive integer (Kaiten requires every card to have an owner). NOTE: response in min/normal verbosity may show |
| kaiten_update_cardA | Update card fields. For moves use kaiten_list_columns, kaiten_list_lanes, kaiten_list_boards IDs. To change state — move the card via columnId (Kaiten state is computed from column.type, not settable directly). To change size — use sizeText (the numeric size field on a card is read-only). Set custom property values via the |
| kaiten_delete_cardA | Permanently delete a card (cannot be undone). Resolve cardId via kaiten_search_cards or kaiten_get_card. NOTE: cards with logged time cannot be deleted (Kaiten returns 400 'Card removing with logged time not allowed'). Delete the timelogs first via kaiten_delete_timelog. |
| kaiten_get_card_location_historyA | Get the card movement history — every time the card was moved between boards, columns, lanes, or sprints, with a timestamp and the author who performed the move. Useful for audit ('who moved this card and when') and cycle-time analytics ('how long did this card sit in each column'). Sorted newest-first by |
| kaiten_get_card_commentsA | List all comments on a card. Each comment exposes its |
| kaiten_create_commentA | Add a comment to a card. Markdown by default — if you are sending HTML, also pass |
| kaiten_update_commentA | Replace the body of an existing comment. Markdown by default — if you are sending HTML, also pass |
| kaiten_delete_commentA | Delete comment. commentId and cardId from kaiten_get_card_comments. |
| kaiten_get_user_timelogsA | List a user's timelogs across cards. Returns array; |
| kaiten_get_card_timelogsA | List a card's timelogs. Returns array; |
| kaiten_create_timelogA | Log time (in minutes) on a card. roleId from kaiten_list_company_roles; cardId from kaiten_search_cards; verify with kaiten_get_card_timelogs. |
| kaiten_update_timelogA | Patch a timelog (timeSpentMinutes is in minutes). logId and cardId from kaiten_get_card_timelogs or kaiten_get_user_timelogs. |
| kaiten_get_timesheetA | Get the global timesheet across cards and users for a date range — answers 'who logged how much time on which cards last week'. |
| kaiten_delete_timelogA | Delete a timelog. WARNING: Kaiten ignores cardId in the URL path and resolves the log purely by logId — passing a wrong cardId will still delete the log from its real owner card. Always verify the pair via kaiten_get_card_timelogs(cardId) before deleting. |
| kaiten_list_spacesA | List spaces visible to current user. Typical drill-down: kaiten_get_space for detail, kaiten_list_boards(spaceId) for the boards in a space, kaiten_list_space_users(spaceId) for members. Space IDs also feed kaiten_search_cards, kaiten_create_card, and kaiten_list_custom_properties. |
| kaiten_get_spaceA | Fetch one space by ID including settings and allowed card types at verbosity=normal/max. Typical drill-down: kaiten_list_boards(spaceId) for the boards in this space, kaiten_list_space_users(spaceId) for members. spaceId from kaiten_list_spaces. |
| kaiten_list_boardsA | List boards in a space. boardId feeds kaiten_get_board, kaiten_list_columns, kaiten_list_lanes, kaiten_get_board_cards, kaiten_search_cards, kaiten_create_card, and kaiten_update_card. spaceId from kaiten_list_spaces. |
| kaiten_get_boardA | Get board metadata. verbosity=max returns inline columns and lanes — no need to call kaiten_list_columns / kaiten_list_lanes separately for a board overview. boardId from kaiten_list_boards. |
| kaiten_list_columnsA | Board columns (statuses). Each column has a col_type (1=queued, 2=in_progress, 3=done) — THIS is the mechanism for moving card state: pass the columnId of a column with the desired type to kaiten_update_card to change the card's state. columnId for kaiten_create_card, kaiten_update_card. boardId from kaiten_list_boards. |
| kaiten_list_subcolumnsA | List subcolumns of a parent column. Subcolumns split a column into vertical lanes (e.g. 'In Progress' → 'Implementation' / 'Review'). Each subcolumn has |
| kaiten_list_lanesA | Swimlanes for a board. Optional laneId on kaiten_create_card and kaiten_update_card when the board uses lanes. NOTE: the default lane often has an empty |
| kaiten_list_card_typesA | Card types defined globally per company (NOT per-board — a per-board endpoint does not exist). Returns Bug, Story, Feature, etc. typeId for kaiten_create_card or kaiten_update_card. |
| kaiten_list_space_usersA | Members of a space. Use to find user IDs for kaiten_update_card.ownerId or kaiten_create_card.ownerId when the target user isn't the API caller. spaceId from kaiten_list_spaces. |
| kaiten_get_current_userA | Current user (id, name, email). id for kaiten_get_user_timelogs and kaiten_search_cards.ownerId. Calling this also warms an internal cache used by enrichAuthor for comments and timelogs — so author_name is populated on create_comment / create_timelog responses instead of coming back null. |
| kaiten_list_usersA | Returns the full company user list — no pagination and no server-side filtering, suitable for small workspaces only. IDs feed kaiten_search_cards filters, kaiten_create_card.ownerId and kaiten_update_card.ownerId. If /users is denied on the current token, fall back to kaiten_get_current_user as a single-user source. |
| kaiten_list_company_rolesA | Global role definitions for the company. id → kaiten_create_timelog.roleId. NOTE: the system 'Employee' role has id -1, which is valid for kaiten_create_timelog but would fail .positive() validation — that's why roleId on create_timelog/update_timelog is not strict-positive. |
| kaiten_list_subtasksA | List child cards linked to a parent card. |
| kaiten_attach_subtaskA | Link an existing child card to a parent card. Subtask = a real Kaiten card linked as a child (NOT a checklist item — for to-do items use kaiten_add_checklist_item). Child via kaiten_create_card; verify via kaiten_list_subtasks. Idempotent — re-attaching the same pair returns success without creating a duplicate link. Cycles (A→B and B→A) and cross-board attaches are accepted by Kaiten without warning. |
| kaiten_detach_subtaskA | Unlink child from parent; cards stay. Inverse of kaiten_attach_subtask. WARNING: Detaching a non-existent or wrong-pair link returns success silently. Verify the link exists via kaiten_list_subtasks(parentCardId) before relying on the success message. |
| kaiten_list_card_tagsA | List tags currently attached to a card. Endpoint: GET /cards/{card_id}/tags. cardId from kaiten_search_cards or kaiten_get_card. To create a new tag, just call kaiten_add_tag with a name; Kaiten auto-creates missing tags on demand. For the workspace-wide tag pool (across all cards), use kaiten_list_workspace_tags. |
| kaiten_add_tagA | Attach a tag to a card by name. cardId from kaiten_search_cards or kaiten_get_card. If a tag with this name does not yet exist in the workspace, Kaiten will auto-create it (and it will then also appear in kaiten_list_workspace_tags). Returns the tag object (including its ID, which you need for kaiten_remove_tag). Idempotent — re-adding the same tag name returns the same tagId (no duplicate). |
| kaiten_remove_tagA | Remove a tag from a card. WARNING: Kaiten returns success even when tagId does not belong to the card (or doesn't exist at all). Verify the tag is actually attached via kaiten_list_card_tags before relying on the success message. tagId from kaiten_list_card_tags or kaiten_add_tag. |
| kaiten_list_workspace_tagsA | List ALL tags in the workspace (across all cards). For tags on a specific card, use kaiten_list_card_tags. tagId for kaiten_remove_tag. Tags auto-create when added to a card via kaiten_add_tag. |
| kaiten_create_checklistA | Create an empty checklist on a card. Add rows with kaiten_add_checklist_item; read back with kaiten_get_checklist. |
| kaiten_get_checklistA | Get a checklist with its items. NOTE: Kaiten resolves checklists by checklistId alone — passing a wrong cardId still returns the real checklist if checklistId is valid. Verify via the returned checklist's parent card if cardId is reconstructed from memory. checklistId from kaiten_create_checklist or kaiten_get_card (verbosity=max). |
| kaiten_delete_checklistA | Delete checklist and all items (irreversible). checklistId from kaiten_get_checklist or kaiten_get_card. |
| kaiten_add_checklist_itemA | Add a checklist item. text has a 4096-character limit (Kaiten server-side cap). Item supports text and checked state only — |
| kaiten_update_checklist_itemA | Update a checklist item's text or checked flag. text has a 4096-character limit (Kaiten server-side cap). Item supports text and checked state only — |
| kaiten_delete_checklist_itemA | Remove a single item from a checklist. cardId, checklistId, and itemId all from kaiten_get_checklist. NOTE: Kaiten resolves the item by itemId alone — wrong cardId/checklistId still deletes the real item. Verify the pair before deleting. |
| kaiten_rename_checklistA | Rename a checklist. cardId and checklistId from kaiten_get_checklist. The only field supported is name; items are managed via the *_checklist_item tools. |
| kaiten_list_filesA | List card attachments. fileId for kaiten_delete_file; cardId from kaiten_search_cards or kaiten_get_card. NOTE: |
| kaiten_upload_fileA | Upload file attachment (base64). Verify with kaiten_list_files. Prefer description links for large files. Note: Kaiten does not persist the multipart Content-Type — |
| kaiten_delete_fileA | Remove an attachment. fileId and cardId come from kaiten_list_files. Re-delete of an already-deleted file returns success silently (Kaiten side is idempotent). |
| kaiten_list_custom_propertiesA | List company-wide custom property definitions (custom fields). In Kaiten, custom properties are global per company/workspace, not per space. The |
| kaiten_list_custom_property_select_valuesA | Get the valid select / multi_select values for a custom property. Use this BEFORE writing the |
| kaiten_list_card_membersA | List users assigned to a card (members and the responsible user). Each row carries |
| kaiten_add_card_memberA | Attach a user to a card as a member. The user will be listed by kaiten_list_card_members with type=1 (member). Use kaiten_set_card_responsible to promote an existing member to type=2 (responsible). userId from kaiten_list_users or kaiten_list_space_users. Returns: the added user (simplified per verbosity) including the |
| kaiten_remove_card_memberA | Detach a user from a card. WARNING: Kaiten resolves the member by userId alone — this preflight verifies the user is actually a member of this specific card before deleting. cardId from kaiten_search_cards; userId from kaiten_list_card_members. Returns: the removed userId. |
| kaiten_set_card_responsibleA | Promote an existing card member to |
| kaiten_list_card_blockersA | List all blockers on a card, INCLUDING released ones ( |
| kaiten_add_card_blockerA | Block a card. At least one of |
| kaiten_update_card_blockerA | Patch an existing blocker. Updatable fields: reason, blockerCardId, dueDate, dueDateTimePresent. Cannot set released — that's a separate endpoint, use kaiten_release_card_blocker. Cannot un-release — once released:true, no API path back to released:false. Preflight verifies the blocker belongs to this card. blockerId from kaiten_list_card_blockers. |
| kaiten_release_card_blockerA | Release a blocker on a card. Despite using DELETE under the hood, this does NOT remove the row — Kaiten flips released:true / released_by_id and keeps the blocker in history. The released blocker continues to appear in kaiten_list_card_blockers. To filter active vs released, check the released field client-side. There is no hard-delete API for blockers in Kaiten. Preflight verifies the blocker belongs to this card. blockerId from kaiten_list_card_blockers. |
| kaiten_list_card_external_linksA | List external links attached to a card. External links are URLs (Jira issues, GitHub PRs, design docs, etc.) that live in their own UI section on the card — separate from the card description, so attaching one does not pollute the description text. Returns id, url, description plus timestamps. Empty array if the card has no external links. cardId from kaiten_get_card or kaiten_search_cards. |
| kaiten_add_card_external_linkA | Attach an external link (URL) to a card. Useful for linking to Jira issues, GitHub PRs, design docs, etc., without bloating the card description. url must be a valid URL (max 16384 chars). description is optional (max 512 chars). cardId from kaiten_get_card. Returns: the created link (simplified per verbosity). NOTE: the POST response does not carry card_id / external_link_id — those fields only appear in the subsequent kaiten_list_card_external_links response. |
| kaiten_update_card_external_linkA | Update url or description of an existing card external link. At least one of url / description must be provided (empty PATCH rejected before the API call). description accepts null to clear the label. linkId belongs to a specific card — use kaiten_list_card_external_links to discover ids. Preflight verifies the link belongs to the given card before PATCHing, to prevent silent cross-card mutation. |
| kaiten_remove_card_external_linkA | Remove an external link from a card permanently. Unlike blockers (where DELETE is a soft release), this is a true hard-delete — the link disappears from kaiten_list_card_external_links afterwards. Preflight verifies the cardId+linkId pair matches before deletion, to prevent silent cross-card removal. linkId from kaiten_list_card_external_links. |
| kaiten_list_sprintsA | List company sprints with an optional active-flag filter. A sprint in Kaiten is a scrum-style time-box with velocity/committed tracking. Not every workspace uses sprints — an empty array means sprints are simply not configured here, not that your access is broken. Returns id, title, active, dates, velocity. Requires access to the company entities tree (403 otherwise). Use kaiten_get_sprint for the full per-sprint summary including cards. |
| kaiten_get_sprintA | Get a full sprint summary: sprint metadata PLUS the cards in the sprint, their version history (cardUpdates), and the custom properties used. The response is LARGE at verbosity=max — prefer min (returns cards_count only) or normal (returns brief {id,title,state} per card) unless you specifically need cardUpdates or customProperties. excludeDeletedCards filters out cards in condition=3 (deleted). Returns 404 if the sprintId is not found, 403 if the caller has no access to the sprint's space. sprintId from kaiten_list_sprints. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| create-card | Create a new card on a Kaiten board |
| time-report | Generate a time tracking report for a user |
| board-overview | Get an overview of a Kaiten board |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| spaces | All spaces with IDs and titles. Use spaceId in kaiten_list_boards, kaiten_get_space_cards, kaiten_list_custom_properties. |
| boards | All boards across spaces (id, title, spaceId). Use boardId in kaiten_list_columns, kaiten_create_card, kaiten_search_cards. |
TDQS
Scored across 63 tools
Every tool maps to a distinct resource-action pair, and the few potentially overlapping tools (search_cards vs get_space_cards/get_board_cards, list_card_tags vs list_workspace_tags) are explicitly cross-referenced and disambiguated in their descriptions. The descriptions consistently tell the agent where IDs come from and which alternate tool to use, so misselection risk is low.
All tool names follow a kaiten_<verb>_<noun> snake_case pattern with predictable verbs like get, list, create, update, delete, add, and remove. The main deviation is mixing get and list for collection-style tools (get_card_comments, get_space_cards, get_user_timelogs vs list_boards, list_spaces), plus a few one-off verbs like release and attach, but the overall pattern remains readable and consistent.
63 tools is far beyond the 25+ threshold and creates a heavy tool surface for an agent to navigate, even though the domain is broad. Several tools could be consolidated or exposed through verbosity options (e.g. get_space_cards/get_board_cards vs search_cards, get_card includeChildren vs list_subtasks), so the count feels over-scoped rather than well-trimmed.
The server provides thorough lifecycle coverage for cards, comments, timelogs, checklists, tags, files, members, blockers, external links, and sprints, including create/read/update/delete where the API supports it. Minor gaps exist: no board/space creation or administration, no explicit archive/unarchive card tool, and no global tag deletion or custom property management, but most workflows complete without dead ends.