Skip to main content
Glama

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
KANBAN_PRO_DBNoPath to the SQLite database.~/.local/share/kanban-pro/kanban.db
KANBAN_PRO_ACTORNoWho is writing (format: kind:name).unknown
KANBAN_PRO_FLOWSNoPath to the flows.yaml file for workflow rules.
KANBAN_PRO_PROFILENoWhich backend to use (profile name).default

Capabilities

Features and capabilities supported by this server

CapabilityDetails
tools
{
  "listChanged": false
}
prompts
{
  "listChanged": false
}
resources
{
  "subscribe": false,
  "listChanged": false
}
experimental
{}

Tools

Functions exposed to the LLM to take actions

NameDescription
list_boardsA

List all boards.

get_boardA

Get one board (includes its columns and label registry).

create_boardA

Create a board. Omit id to have one generated; columns/labels may be inlined.

Send an idempotency_key (any unique string, REUSED on retry) so a retried call returns the original board instead of creating a duplicate.

update_boardB

Partially update a board — only the fields set in patch are applied.

delete_boardA

Delete a board permanently. Refused while live cards remain — move/archive first.

list_columnsA

List a board's columns (name, order, semantic category, wip_limit).

create_columnA

Add a column to a board. category gives it portable semantics (e.g. 'done'). idempotency_key (reused on retry) prevents duplicate creation.

update_columnB

Partially update a column (rename, reorder via order, set wip_limit...).

delete_columnA

Delete a column permanently. Refused while live cards sit in it — move/archive first.

list_cardsA

List a board's cards. Archived cards are hidden unless include_archived=true (that's how you find unarchive/purge targets).

get_cardB

Get one card (works for archived cards too).

create_cardA

Create a card. placements must have >=1 entry (board_id, column_id, position). Send an idempotency_key (any unique string, REUSED on retry) so retries return the original card instead of duplicating it.

update_cardA

Partially update a card — only the fields set in patch are applied.

record_work_reportA

Update one structured work_report section/item on a card.

Current state lives in card.ext["work_report"]; every successful call also emits a work_report.updated changelog event. Use this instead of rewriting the whole ext blob. List sections require item.id and are upserted by that id; singleton sections are replaced.

answer_work_report_questionC

Answer one work_report question and mirror the answer as a normal comment.

move_cardA

Move a card within a board it's already on (re-column / re-position).

Errors if the card has no placement on to_board_id (use add_placement), or if the card's workflow scheme forbids the transition — check list_transitions first. force=true deliberately overrides scheme + WIP validation; the override is always recorded in the change-log, never silent.

list_transitionsA

What moves are legal for this card right now, and under which resolved scheme.

Sources: the card's flow scheme (flow.yaml; 'free-roam' = unrestricted), the backend's own workflow (e.g. hermes), or free movement when nothing is configured.

list_flowsA

Available workflow schemes: every flow.yaml scheme (+ built-in 'free-roam'), with states, allowed transitions, and which scheme is the default.

add_placementA

Put a card on an additional board (one placement per board; errors if already on it).

remove_placementA

Take a card off one board (its other placements stay). The last placement can't be removed — archive_card instead.

archive_cardA

Archive a card (soft, recoverable — the default way to remove one).

unarchive_cardB

Restore an archived card.

delete_cardA

Permanently purge a card. Only allowed on an ARCHIVED card — archive_card first.

list_commentsA

List a card's comments.

add_commentB

Add a comment to a card (card_id, author = User id, body). idempotency_key (reused on retry) prevents duplicate comments.

delete_commentB

Delete a comment permanently.

list_relationsA

List a card's typed relations (blocks, parent/child, duplicates, ...).

add_relationA

Link two cards with a typed relation. Subtask = kind 'child' from parent card. idempotency_key (reused on retry) prevents duplicate relations.

delete_relationB

Delete a relation permanently.

list_workA

What should I work on? Workable cards for assignee (default: YOU, this connection's actor) — assigned to you or unassigned, in backlog/ready/started columns, cards leased to others excluded. Each item carries its legal transitions, so one call gives you the whole plan.

claim_cardA

Atomically lease a card so no other agent picks it up (visible in list_work). The lease expires after ttl_seconds unless renewed via heartbeat_claim — a crashed agent's card becomes claimable again automatically. owner overrides the actor (claim on behalf of a specific worker); defaults to the connection's own actor. Convention: after claiming, assign yourself and move the card to a started column.

heartbeat_claimA

Renew your live lease on a card while still working it. owner must match the one the claim was taken with (claims held on a worker's behalf renew on that worker's behalf); defaults to the connection's own actor.

release_claimA

Release your lease (done or giving up). owner overrides the actor (release on behalf of the claimed worker); defaults to the connection's own actor.

raise_attentionA

Flag a card as needing a decision or input (e.g. a question only a human or a specific agent can answer). Routable: the change-log event carries the reason and the target actor, so notifier agents DM the right party. Put the actual question in a comment; this flag is the signal, not the discussion.

clear_attentionA

Clear a card's attention flag (question answered / decision made). Put the answer in a comment; resolution is a one-liner for the event stream.

list_changesA

Change feed: every recorded write after cursor since (audit trail + sync).

Each event carries seq (the cursor — pass the last seq back as since), ts, actor (who did it), entity/op (e.g. card.moved), and a slim data payload.

wait_changesA

Long-poll change feed: returns AS SOON AS events exist after cursor since (instant for writes through this server; other processes within ~2s), or empty after timeout_seconds. since=-1 probes the current cursor without replaying history — call that once, then loop with the returned cursor. Push semantics without polling loops.

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription
event_schema_resourceThe full contract for consuming the change-feed — event shapes, data keys, attention routing, and the notifier pattern. Call this once, then loop ``wait_changes`` / ``list_changes`` with confidence.
capabilities_resourceActive profile's capabilities, each with its fulfilment (SPEC decision 2): native (backend does it), polyfilled (kanban-pro fulfils it), unavailable.
boards_resourceAll boards as canonical JSON.
work_distribution_resourceThe work-distribution contract: how agents claim/lease/work/release cards. ``list_work`` returns a ``WorkQueue {actor, items: [WorkItem, ...]}``. Each ``WorkItem`` has the full ``Card``, the column it's in (id/name/category), whether YOU currently hold the lease (``claimed_by_me``), and the legal transitions from this column (``transitions`` — see ``kanban://workflow``). The life of a claim: 1. ``claim_card(card_id, ttl_seconds=900)`` — CAS lease. Fails with ``conflict`` if another agent holds it. 2. ``heartbeat_claim(card_id, ttl_seconds)`` — keep the lease alive while working. 3. When the worker finishes: move the card + ``release_claim(card_id)``. 4. On crash / timeout: the lease expires, the card is reclaimable. The dispatcher / next agent sees it in ``list_work`` again. Claiming does NOT move or assign the card — convention: claim → assign yourself → move to a started column, all recorded in the change-log.
workflow_resourceThe workflow contract: how to move cards and what's legal. ``list_transitions(card_id, board_id?)`` returns a ``TransitionInfo``: ``{options: [{column_id, name}, ...], resolved_scheme, source}``. Each ``column_id`` in ``options[]`` is a valid target for ``move_card``. The ``source`` field tells you where the rules came from: - ``flow`` — flow.yaml scheme (the default) - ``free-roam`` — the reserved scheme; any column is reachable - ``backend`` — the adapter's own lifecycle (e.g. Hermes ready/blocked/done) - ``free`` — current column not modeled by the scheme → free movement ``force=true`` on ``move_card`` overrides the scheme + WIP checks. The override is ALWAYS recorded in the change-log — it's for unblocking, never routine.
domain_resourceThe canonical domain model: types, conventions, and ext namespaces. ``Card`` is the unit of work. A card's ``placements[]`` (≥1) is where it lives — one placement per board. ``ext`` is free-form metadata; these namespaces are reserved: | key | owner | meaning | |---|---|---| | ``kanban_pro.scheme`` | flow engine | workflow scheme name (see kanban://workflow) | | ``kanban_pro.attention`` | attention signal | ``{reason, raised_by, for}`` | | ``kanban_pro.migrated_from`` | migration | provenance ``"<profile>/<board-id>"`` | | ``hermes`` | hermes adapter | backend-specific fields | | ``work`` | kanban-dispatcher | ``{log, attempts, quota_hits, retry_at}`` | | ``session`` | the working agent | ``{actor, log, kind}`` — session log the UI tails live | Patches (``CardPatch``, ``BoardPatch``, …) are PARTIAL UPDATES: only set fields apply. ``ext`` is a SHALLOW MERGE: patch keys → stored dict; a key set to None is REMOVED. This protects concurrent writers from clobbering each other's ext data.
work_report_schema_resourceStructured card report schema and write rules.

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/galvani/kanban-pro'

If you have feedback or need assistance with the MCP directory API, please join our Discord server