Command-line client and MCP server for the Kaiten tracker,
in the spirit of gh / glab.
- Browse spaces, boards and cards from the terminal
- Create, edit, move and archive cards; manage members, tags, comments and checklists
--jsonoutput on every command for scripting- Built-in MCP server (
kaiten mcp serve) so coding agents can work with the tracker - Raw API escape hatch:
kaiten api GET /users/current
From crates.io:
cargo install kaiten-cliPrebuilt binaries for Linux (x86_64/aarch64), macOS (x86_64/aarch64) and Windows are attached to GitHub Releases.
From source:
git clone https://github.com/dsociative/kaiten-cli
cd kaiten-cli
cargo install --path crates/kaitenCreate an API token in your Kaiten profile (https://mycompany.kaiten.ru →
user profile → API tokens), then:
kaiten auth login # asks for the domain ("mycompany") and token, verifies them
kaiten auth status # shows domain, current user and where the token came fromEnvironment variables override the config file:
| Variable | Meaning |
|---|---|
KAITEN_TOKEN |
API token |
KAITEN_DOMAIN |
company domain: mycompany → https://mycompany.kaiten.ru/api/latest |
KAITEN_BASE_URL |
full API base URL (overrides the domain) |
KAITEN_CONFIG_DIR |
config directory (default: ~/.config/kaiten) |
~/.config/kaiten/config.toml — created by kaiten auth login with mode 600:
domain = "mycompany"
token = "your-api-token"
[defaults] # optional: used when --space/--board flags are omitted
space = 123
board = 456kaiten card list (and the list_cards MCP tool) only return non-archived cards
unless you pass --archived, which flips the filter to archived-only cards.
kaiten space list
kaiten board list --space 123
kaiten board view 456 # columns and lanes (ids for `card move`)
kaiten card list --mine
kaiten card list --board 456 --query "deploy" --limit 20
kaiten card view 67089469 --comments # a full card URL works too
kaiten card create --board 456 --title "Fix the flaky test" --description "..."
kaiten card edit 67089469 --title "New title" --asap true
kaiten card move 67089469 --column 6308511
kaiten card archive 67089469
kaiten card member add 67089469 user@example.com # user id or email
kaiten card member responsible 67089469 user@example.com
kaiten card comment add 67089469 --body "Done, please review"
kaiten card checklist add 67089469 --name "Release steps"
kaiten card checklist item add 67089469 91011 --text "Bump version"
kaiten card checklist item check 67089469 91011 121314
kaiten card tag add 67089469 backend
kaiten card link 67089469 --blocked-by 67089500 --reason "waiting for API"
kaiten card file add 67089469 ./screenshot.png # uploads get a PUBLIC url
kaiten card time add 67089469 --minutes 30 --date 2026-07-16
kaiten card list --mine --state in-progress --sort updated --desc
kaiten tag list
kaiten card-type list
kaiten api GET "/cards?query=deploy&limit=5" # raw API access
kaiten api POST /cards --data '{"board_id":456,"title":"Raw"}'Add --json to any command to print the raw JSON of the API response.
# zsh — add to ~/.zshrc (needs compinit enabled, as in most setups)
eval "$(kaiten completion zsh)"
# bash — add to ~/.bashrc
eval "$(kaiten completion bash)"
# fish — run once
kaiten completion fish > ~/.config/fish/completions/kaiten.fishThe same binary is an MCP server (stdio transport, 35 tools mirroring the CLI,
including compact card projections and a cursor-based poll_updates for
event-like agent workflows).
Claude Code:
claude mcp add kaiten -- kaiten mcp serveAny other MCP client:
{
"mcpServers": {
"kaiten": {
"command": "kaiten",
"args": ["mcp", "serve"]
}
}
}Authentication is shared with the CLI: run kaiten auth login once, or export
KAITEN_DOMAIN / KAITEN_TOKEN in the client configuration. Logs go to stderr
only — stdout carries the MCP protocol.
What this project covers of the Kaiten API, by area (✅ covered, ◐ partial, — not covered):
| Kaiten API area | CLI | MCP server |
|---|---|---|
| Auth, current user | ✅ | ✅ |
| Spaces | ◐ list | ◐ list |
| Boards, columns, lanes | ◐ read-only (board list/view) |
◐ read-only |
| Cards: create / list / view / edit / move / archive | ✅ | ✅ |
| Cards: delete | ✅ (with confirmation) | — deliberately: irreversible |
| Cards: batch update, history | — | — |
| Card list filters | ✅ space/board/column/member/mine/query/tag/type/archived/state/dates/sort/offset | ✅ same + lane/owner |
| Members: add / remove / set responsible | ✅ (by id or email) | ✅ (by id; list_users resolves) |
| Comments: list / add / edit / delete | ✅ | ✅ |
| Checklists: create, add items, check | ✅ | ✅ |
| Tags on cards, tag list | ✅ | ✅ |
| Card types | ◐ list | ◐ list |
| Users list (id lookup) | ✅ | ✅ |
| Card links: children / parents / blockers | ✅ card link/unlink/unblock |
✅ link_cards etc. |
| Files: attach / detach | ✅ (uploads get a PUBLIC url!) | ✅ |
| External links | — | — |
| Custom properties: reference + set values | ✅ property list/values, --properties-json |
✅ two tools + properties |
| Time logs | ✅ card time add/list |
✅ |
| Events: polling for changes | — | ✅ poll_updates (cursor-based) |
| Events: webhooks | — deliberately (needs a public URL) | — |
| Sprints, SLA, location history | — | — |
| Raw API escape hatch | ✅ kaiten api |
— |
Not covered and currently out of scope: administration (space/board CRUD,
roles, groups, automations), service desk, documents, custom directories.
Anything missing from the typed commands is reachable via kaiten api.
-v— debug logs to stderr: every HTTP request with method, path, status, duration-vv— trace logs including request/response bodies (the token is always redacted)RUST_LOG=kaiten_client=trace kaiten ...— fine-grained filtering without flags- decode errors report the exact JSON path that failed to parse
kaiten api <METHOD> <path> [--data <json>]— raw access when a typed command is not enough- API error bodies are printed as-is together with the HTTP status
cargo test
cargo clippy --all-targets -- -D warnings
cargo fmt --all -- --checkLicensed under either of MIT or Apache-2.0, at your option.