Skip to main content
Glama

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
KAITEN_URLYesKaiten instance URL, e.g. https://your-company.kaiten.ru
KAITEN_API_TOKENYesAPI token (Bearer) for Kaiten.
KAITEN_CACHE_TTL_MSNoTTL for cached reference data in milliseconds (default: 300000).
KAITEN_DEFAULT_SPACE_IDNoDefault space ID for search when spaceId is omitted.
KAITEN_ALLOWED_BOARD_IDSNoComma-separated whitelist of board IDs.
KAITEN_ALLOWED_SPACE_IDSNoComma-separated whitelist of space IDs the AI can access.
KAITEN_REQUEST_TIMEOUT_MSNoHTTP 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

CapabilityDetails
tools
{
  "listChanged": true
}
logging
{}
prompts
{
  "listChanged": true
}
resources
{
  "listChanged": true
}

Tools

Functions exposed to the LLM to take actions

NameDescription
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 query parameter performs a substring match against card titles (server searches the title field only). The condition parameter accepts only 1=live (default) or 2=archived — Kaiten has no 'all' filter. To list live + archived together, omit condition (defaults to live) and call again with condition: 2. Use kaiten_get_card for full detail on a specific card. Returns: array of cards (simplified per verbosity).

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 board_title:null and column_title:null because POST /cards returns a flat payload. Re-fetch via kaiten_get_card to populate, or use verbosity=raw.

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 properties map (see kaiten_list_custom_properties for IDs and types). NOTE: response in min/normal verbosity may show board_title:null and column_title:null because PATCH /cards/{id} returns a flat payload. Re-fetch via kaiten_get_card to populate, or use verbosity=raw.

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 changed. NOTE: unlike most Kaiten endpoints the history id field is a STRING (not an integer) — treat it as an opaque identifier. condition: 1=Active, 2=Archived, 3=Deleted. cardId from kaiten_get_card or kaiten_search_cards.

kaiten_get_card_commentsA

List all comments on a card. Each comment exposes its id — pass it as commentId to kaiten_update_comment or kaiten_delete_comment. Resolve cardId via kaiten_search_cards or kaiten_get_card. Returns: array of comments (simplified per verbosity).

kaiten_create_commentA

Add a comment to a card. Markdown by default — if you are sending HTML, also pass textFormat: 'html' so Kaiten stores and renders the comment as HTML. Without that hint, raw HTML shows up in the UI as literal angle brackets. QUIRK: Kaiten's comment markdown parser is a CommonMark subset and does NOT support ATX headings (### Header) — they render as literal text. Bold, italic, lists, inline code, code blocks, links and blockquotes all work. Card DESCRIPTION markdown does support headings — the limitation is comment-specific. Use plain bold or switch to HTML if you need a heading inside a comment. Resolve cardId via kaiten_search_cards or kaiten_get_card; list existing comments via kaiten_get_card_comments. Returns: the created comment object (including its id, needed for kaiten_update_comment / kaiten_delete_comment).

kaiten_update_commentA

Replace the body of an existing comment. Markdown by default — if you are sending HTML, also pass textFormat: 'html'. QUIRK: Kaiten's comment markdown does NOT support ATX headings (### Header renders as literal text). Use bold or switch to HTML if you need a heading inside a comment. Resolve commentId via kaiten_get_card_comments. The cardId is part of the URL path — both cardId and commentId must reference the actual card-comment pair (mismatched pair returns 500 from Kaiten). Returns: the updated comment object.

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; time_spent is in minutes. from/to in YYYY-MM-DD format. userId from kaiten_get_current_user or kaiten_list_users. Card titles via kaiten_get_card.

kaiten_get_card_timelogsA

List a card's timelogs. Returns array; time_spent is in minutes. logId is used by kaiten_update_timelog / kaiten_delete_timelog; cardId from kaiten_search_cards. NOTE: returns [] for nonexistent cards as well as cards with no timelogs — verify cardId via kaiten_search_cards if you need to distinguish.

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'. from and to are REQUIRED (YYYY-MM-DD; the API returns 400 without them). Optional array filters narrow by users, cards, boards, spaces, columns, tags, or groups — pass JSON arrays, the handler joins them with commas internally. Empty arrays are skipped entirely (passing an empty filter would itself return 400). For per-user timelogs prefer kaiten_get_user_timelogs; for per-card prefer kaiten_get_card_timelogs. Returns an array of timelog objects, each with author_id / author_name enriched when the author is the API caller. limit max 200.

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 column_id set to the parent at verbosity=max. Returns standard column shape via simplifyColumn. Empty array if the column has no subcolumns — most boards don't use them. columnId from kaiten_list_columns.

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 title — refer to it by lowest sort_order if you need to identify it. boardId from kaiten_list_boards.

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. cardId is the PARENT card; the tool returns its CHILD cards. Add new children: kaiten_create_card + kaiten_attach_subtask. An alternative is kaiten_get_card(cardId, includeChildren=true), which embeds the children inline.

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 — due_date and responsible_id are not exposed by this fork. checklistId from kaiten_create_checklist or kaiten_get_checklist; edit with kaiten_update_checklist_item.

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 — due_date and responsible_id are not exposed by this fork. itemId from kaiten_get_checklist.

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: mime_type is inferred from filename extension client-side because Kaiten does not persist the multipart Content-Type header. Unknown extensions return mime_type: null.

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 — mime_type in responses is inferred from the file extension. contentBase64 is decoded leniently — empty strings and garbage produce 0-byte uploads silently. Validate before calling.

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 type field on each property determines the value shape when writing via kaiten_update_card.properties: string | number | date | select id | multi_select ids[] | user id | catalog uid | tree uid | etc. Endpoint: GET /company/custom-properties.

kaiten_list_custom_property_select_valuesA

Get the valid select / multi_select values for a custom property. Use this BEFORE writing the properties map via kaiten_update_card for any select / multi_select field — passing arbitrary integers will either fail or silently misassign. propertyId comes from kaiten_list_custom_properties (filter results by type='select' or type='multi_select'). Returns id, value (the display label), color, sort_order, condition. IMPORTANT: if the property exists but is not a select-type, the endpoint returns an empty array (not 400), so check the property type first. 404 means the propertyId is not in your company.

kaiten_list_card_membersA

List users assigned to a card (members and the responsible user). Each row carries type: 1=member, 2=responsible. cardId from kaiten_search_cards or kaiten_get_card. Returns: array of user objects (per verbosity) with a type field added.

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 type field.

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 type=2 (responsible). Kaiten's API only accepts type:2 on this endpoint — there is no 'unset responsible' call (demote via kaiten_remove_card_member then re-add with kaiten_add_card_member). The user must already be a member; call kaiten_add_card_member first if needed. userId from kaiten_list_card_members. Returns: the updated user.

kaiten_list_card_blockersA

List all blockers on a card, INCLUDING released ones (released:true rows are kept in history). Filter by the released field client-side to find currently-active blockers. Each blocker has either a free-text reason, a pointer to a blocking card (blocker_card_id + blocker_card_title), or both. Release a blocker via kaiten_release_card_blocker (which uses Kaiten's DELETE endpoint as a soft release — there is no hard-delete API). cardId from kaiten_search_cards. Returns: array of blocker objects (simplified per verbosity).

kaiten_add_card_blockerA

Block a card. At least one of reason (free-text) or blockerCardId (pointer to blocking card) must be provided. A card blocker can have BOTH: e.g., blockerCardId=42 plus reason='waiting for the design review on that card'. Returns: the created blocker object.

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

NameDescription
create-cardCreate a new card on a Kaiten board
time-reportGenerate a time tracking report for a user
board-overviewGet an overview of a Kaiten board

Resources

Contextual data attached and managed by the client

NameDescription
spacesAll spaces with IDs and titles. Use spaceId in kaiten_list_boards, kaiten_get_space_cards, kaiten_list_custom_properties.
boardsAll boards across spaces (id, title, spaceId). Use boardId in kaiten_list_columns, kaiten_create_card, kaiten_search_cards.

TDQS

A3.9/5.0

Scored across 63 tools

Disambiguation5/5

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.

Naming Consistency4/5

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.

Tool Count2/5

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.

Completeness4/5

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.

Maintenance

ActivityInactive
ResponsivenessNo issues