Skip to main content

MCP server bridging Claude Code with the Kanban Tool API v3.

Project description

kanbantool-mcp

An MCP server that connects Claude Code (and other MCP clients) to a Kanban Tool account.

CI PyPI Python License: MIT

New to MCP? This is an MCP server — you run it from an MCP-aware assistant. If you've never set one up, install Claude Code, Claude Desktop, or Cursor first, then come back here.

Why this exists

Kanban Tool holds the authoritative state of your boards, tasks, and workflow — but an LLM can't see any of it without help. This MCP server gives Claude Code (and any other MCP client) read access to boards and tasks, search via Kanban Tool's query DSL, and write tools to create, update, move, archive, comment on, and break down tasks. The point: stop re-explaining your kanban state to the model on every interaction, and let it act on the board directly when you want it to.

Status

Alpha, approaching v1.0. The 26-tool surface is settled and exercised against a real Kanban Tool account via the Live Integration workflow. Pre-1.0 means the surface may still evolve based on real-world feedback — pin a specific version if you need stability across upgrades. See SEMVER.md for the v1.0 stability commitment (which surfaces are stable, which are not, deprecation policy).

Roadmap & support

Where the project is going: see the open milestones. Larger workstreams are tagged with the epic label.

Maintainer is best-effort and typically responds to issues and PRs within ~a week. If something is blocking you and the silence is longer, a polite bump on the thread is welcome.

What this looks like

A short illustrative session — the shape of an interaction, not literal terminal output:

User:      What's on my Engineering board right now?
Assistant: (calls list_boards)            -> finds "Engineering" with id 4217
           (calls get_board 4217)         -> reads columns: Backlog / Doing / Review / Done
           (calls search_tasks
              query="archived:false",
              board_id=4217)              -> 14 active tasks, grouped by column

           Engineering has 14 active cards. Doing (3): "Migrate auth to OIDC",
           "Flaky CI on macOS", "Add rate-limit headers". Review (2): ...

Longer end-to-end walkthroughs (with realistic JSON request/response shapes) live in examples/.

Install

Configuration

Variable What it is Where to get it
KANBANTOOL_DOMAIN Your account's subdomain prefix — acme for https://acme.kanbantool.com. The URL you log into.
KANBANTOOL_API_TOKEN Bearer token for the Kanban Tool API v3. Profile -> API tokens in your Kanban Tool account.
KANBANTOOL_READ_ONLY Optional. Set to 1 (or true/yes/on) to register only the 11 read-class tools — see Read-only mode below.
KANBANTOOL_LOG_LEVEL Optional. Set to INFO for one stderr line per request (method + path) or DEBUG to also log status code + scrubbed body excerpts. Unset = silent (default). Output goes to stderr; stdout is reserved for MCP JSON-RPC.

The first two are required; the rest are optional and unset by default.

Wiring it into your client

The JSON shape is the same across MCP clients — only the file location and the launcher CLI differ. Pick your client below, drop the snippet into the matching mcp.json, and substitute your KANBANTOOL_DOMAIN / KANBANTOOL_API_TOKEN values.

Each snippet shows the PyPI form (uvx kanbantool-mcp) — swap the args for the git form below if you want to track main instead of a release:

"args": ["--from", "git+https://github.com/VeryLongOrgNameSuchWow/kanbantool-mcp", "kanbantool-mcp"]

Claude Code

Easiest path is the CLI:

claude mcp add-json kanbantool '{
  "command": "uvx",
  "args": ["kanbantool-mcp"],
  "env": {
    "KANBANTOOL_DOMAIN": "your-account",
    "KANBANTOOL_API_TOKEN": "your-token"
  }
}'

Or edit ~/.claude.json (project-scoped via claude mcp add-json -s project ...). See https://docs.claude.com/en/docs/claude-code/mcp for scopes.

Claude Desktop

Edit the config file (~/Library/Application Support/Claude/claude_desktop_config.json on macOS, %APPDATA%\Claude\claude_desktop_config.json on Windows). Setup docs: https://modelcontextprotocol.io/quickstart/user.

{
  "mcpServers": {
    "kanbantool": {
      "command": "uvx",
      "args": ["kanbantool-mcp"],
      "env": {
        "KANBANTOOL_DOMAIN": "your-account",
        "KANBANTOOL_API_TOKEN": "your-token"
      }
    }
  }
}

Cursor

Edit ~/.cursor/mcp.json (or per-project .cursor/mcp.json). Setup docs: https://cursor.com/docs/mcp.

{
  "mcpServers": {
    "kanbantool": {
      "command": "uvx",
      "args": ["kanbantool-mcp"],
      "env": {
        "KANBANTOOL_DOMAIN": "your-account",
        "KANBANTOOL_API_TOKEN": "your-token"
      }
    }
  }
}

Continue

Edit ~/.continue/config.yaml (Continue uses YAML, not JSON, for MCP entries). Setup docs: https://docs.continue.dev/customize/deep-dives/mcp.

mcpServers:
  - name: kanbantool
    command: uvx
    args:
      - kanbantool-mcp
    env:
      KANBANTOOL_DOMAIN: your-account
      KANBANTOOL_API_TOKEN: your-token

Cline

Edit cline_mcp_settings.json via the Cline panel's MCP Servers > Edit Config button. Setup docs: https://docs.cline.bot/mcp/configuring-mcp-servers.

{
  "mcpServers": {
    "kanbantool": {
      "command": "uvx",
      "args": ["kanbantool-mcp"],
      "env": {
        "KANBANTOOL_DOMAIN": "your-account",
        "KANBANTOOL_API_TOKEN": "your-token"
      }
    }
  }
}

Generic MCP-over-stdio

Any MCP client that supports launching a stdio server. Spawn this command with the env vars set in the child process; the server speaks JSON-RPC on stdin/stdout.

KANBANTOOL_DOMAIN=your-account \
  KANBANTOOL_API_TOKEN=your-token \
  uvx kanbantool-mcp

Read-only mode

Set KANBANTOOL_READ_ONLY=1 (or true/yes/on) to register only the 11 read-class tools. Any value outside that set, including the empty string, leaves the full 26-tool surface intact.

Use this when you want to give an LLM safe access to your boards — search, browse, summarise, answer questions about state — without giving it the ability to create, update, move, archive, comment on, or delete anything. The write tools simply don't appear in the tool list, so the model can't call them even if it tried.

Read-class tools (always registered):

list_boards            get_board                       get_user
search_tasks           list_board_collaborators        whoami
get_task               list_custom_field_definitions   list_my_timers
recent_changes         list_subtasks

Write tools (suppressed when read-only): create_task, update_task, move_task, archive_task, set_custom_field, add_comment, delete_comment, add_subtask, update_subtask, delete_subtask, reorder_subtasks, start_timer, stop_timer, delete_timer.

The transport smoke test ping is always registered regardless of mode.

Verify your install

Run kanbantool-mcp --check (e.g. uvx kanbantool-mcp --check) — it validates your env vars, hits the whoami endpoint, and prints a one-line OK/FAIL signal. Sample success output:

OK: Alice Example (your-account) — token resolves; you can use kanbantool-mcp now

The flag exits 0 on success and non-zero on failure (missing env, 401/403 auth, network failure), with an actionable hint per error class. Run it once after wiring the server into your client to confirm the token reaches Kanban Tool before asking your assistant to do anything with it.

To check which version you have installed, run kanbantool-mcp --version (e.g. uvx kanbantool-mcp --version). Useful when reporting an issue.

You can also verify from inside the assistant: ask "who am I?" — it'll call the whoami tool and confirm your token resolves. If that comes back with your name, the server is reachable and your credentials work.

Tool reference

Tool Purpose Key params
list_boards List boards visible to the authenticated user.
get_board Fetch a board with its columns, swimlanes, and custom-field definitions. board_id
search_tasks Search tasks across boards using Kanban Tool's query DSL (e.g. @alice priority:high tags:bug). Forwarded to the API verbatim. Returns a SearchResults wrapper exposing results, total_count, page, and has_more. query, board_id?, limit?, page?
get_task Fetch a task by id with headline metadata, subtask/comment counts, and tracked time. task_id
recent_changes Fetch the changelog feed for a board — the change-tracking primitive that stands in for webhooks (Kanban Tool ships none). Poll sparingly. since is required (raises ValueError if None); for first-poll use a short lookback like datetime.now(UTC) - timedelta(hours=1). board_id, since
create_task Create a new task on a board. Optional kwargs are omitted when unset. name, board_id, description?, lane_id?, priority?, tags?, ...
update_task Partial update of an existing task; only kwargs the caller passes are sent. None means omit, not clear. task_id, name?, description?, priority?, ...
move_task Move a task between columns, swimlanes, or positions. At least one target must be set. task_id, column_id?, swimlane_id?, position?
archive_task Archive a task. Idempotent. task_id
add_comment Post a comment on a task. task_id, content
delete_comment Soft-delete a comment on a task. Returns the deleted comment with deleted_at populated. The API has no edit endpoint — delete and re-post if you need to change a comment. task_id, comment_id
list_subtasks List subtasks attached to a task. task_id
add_subtask Add a subtask to a task. task_id, name
update_subtask Partial update of an existing subtask — mark complete, rename, change assignee. None kwargs are omitted. subtask_id, name?, is_completed?, assigned_user_id?
delete_subtask Soft-delete a subtask. Returns the deleted subtask with deleted_at populated. subtask_id
reorder_subtasks Reorder all subtasks under a task. ids must include the full set in the desired order. task_id, ids: list[int]
whoami Fetch the authenticated user's profile — id, role flags, locale. Use to resolve "me" / "myself" in user requests.
get_user Fetch one user by id. user_id
list_board_collaborators List users with access to a board (the canonical user-discovery surface — the API has no bulk list-users endpoint). board_id
list_custom_field_definitions List the per-board metadata for the 15 custom_field_* slots (label, type, enabled state). Use to interpret the values surfaced on Task.custom_fields. board_id
set_custom_field Set or clear one of the 15 custom_field_N slots on a task. value=None clears (sends literal null). task_id, slot (1..15), value
start_timer Start a per-user time tracker on a task. task_id, board_id
stop_timer Stop a running time tracker. ended_at defaults to "now" if omitted. timer_id, ended_at?
delete_timer Delete a time tracker (hard-delete). Returns None. timer_id
list_my_timers List the authenticated user's time trackers across all tasks.

(ping exists as a transport smoke test; not listed above.)

What this server does not cover

The tool surface is bounded by what the Kanban Tool API v3 actually exposes. A few common workflows are intentionally absent because there is no upstream endpoint to call:

  • Board lifecycle. The API has no POST /boards, PUT /boards/{id}, or DELETE /boards/{id} — boards must be created, renamed, and archived through the Kanban Tool web UI, not via the MCP. list_boards and get_board are the only board-scoped surfaces. Verified via live spike against the API (every variant returns 404; see #130). Provision the board out-of-band first, then point the LLM at it.
  • Column / swimlane structure. Board.columns and Board.swimlanes are read-only on the wire. Re-shape your workflow in the web UI; the MCP can read the result but not edit it.
  • Comment editing. The API has no comment-edit endpoint. delete_comment + add_comment is the supported "fix a comment" pattern.
  • Webhooks. Kanban Tool ships none. recent_changes(board_id, since) is the polling primitive that stands in.
  • Bulk user listing. No global /users endpoint. list_board_collaborators(board_id) is the canonical user-discovery surface (per board).

Per the project's "be honest about the upstream" principle (see CLAUDE.md), these gaps are surfaced explicitly rather than papered over with shims.

Examples

A short write-flow alongside the read-flow shown above. Illustrative — shape of a session, not literal terminal output. For longer walkthroughs with realistic JSON shapes, see examples/.

User:      Create a high-priority task in Engineering called "Fix login bug",
           and leave a comment that I'm picking it up today.
Assistant: (calls list_boards)             -> resolves "Engineering" -> id 4217
           (calls create_task
              name="Fix login bug",
              board_id=4217,
              priority="high")             -> task id 88231 created
           (calls add_comment
              task_id=88231,
              content="Picking this up today.")

           Created "Fix login bug" (id 88231) in Engineering at high priority,
           and added your comment.

Development

git clone https://github.com/VeryLongOrgNameSuchWow/kanbantool-mcp.git
cd kanbantool-mcp
uv sync
uv run pytest
uv run ruff check .
uv run ty check

Tests are offline-only and mock HTTP via respx — no Kanban Tool account needed to contribute.

Documentation

File What it covers
CONTRIBUTING.md Local setup, conventional-commit rules, what a good PR looks like, how reviews work.
RELEASING.md Release flow end-to-end (conventional commits → release-please → PyPI), the GitHub App that auths release-please, and break-glass procedures for stuck release PRs.
SEMVER.md Compatibility commitment for v1.0+ — which surfaces are stable, which are unstable, deprecation policy.
SECURITY.md How to report security vulnerabilities (GitHub private security advisories).

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

kanbantool_mcp-0.8.3.tar.gz (217.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

kanbantool_mcp-0.8.3-py3-none-any.whl (45.9 kB view details)

Uploaded Python 3

File details

Details for the file kanbantool_mcp-0.8.3.tar.gz.

File metadata

  • Download URL: kanbantool_mcp-0.8.3.tar.gz
  • Upload date:
  • Size: 217.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for kanbantool_mcp-0.8.3.tar.gz
Algorithm Hash digest
SHA256 5259761737f87d2a1cfa584a931cd2da679de3e3715829d9e324f8242f0b6a95
MD5 393467c204b8d2a7234b6cdf9eeb1322
BLAKE2b-256 6919eb52f3637f589f9851d494f791dd7655ef3129ae3c2430a3825671ab0a3e

See more details on using hashes here.

Provenance

The following attestation bundles were made for kanbantool_mcp-0.8.3.tar.gz:

Publisher: release.yml on VeryLongOrgNameSuchWow/kanbantool-mcp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file kanbantool_mcp-0.8.3-py3-none-any.whl.

File metadata

  • Download URL: kanbantool_mcp-0.8.3-py3-none-any.whl
  • Upload date:
  • Size: 45.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for kanbantool_mcp-0.8.3-py3-none-any.whl
Algorithm Hash digest
SHA256 f42dd2cf0282fe173cafa41e7aca077d8846f1a2b7710ddc6ed3587ee6e4d996
MD5 23d5e4ce3bc934ad44243100b2464277
BLAKE2b-256 02ab779a0f40512710261864766c40631e0db104dd2dc4bb9983cdda99dc2f26

See more details on using hashes here.

Provenance

The following attestation bundles were made for kanbantool_mcp-0.8.3-py3-none-any.whl:

Publisher: release.yml on VeryLongOrgNameSuchWow/kanbantool-mcp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page