Skip to main content
Glama

sanban

Simple kanban that just works. No bloat, no login, no SaaS.

JSON-backed boards with a REST API, MCP server, and a dark UI. For devs who want tasks tracked without the overhead.

Screenshots

Welcome Board

Related MCP server: Obsidian Kanban MCP Server

Quick Start

uv sync
uv tool install .
sanban              # http://localhost:8900

The web server runs independently. Agents connect via MCP separately.

Setup with an AI Agent

Paste this into opencode, Claude Code, Cursor, or any AI agent — it will install sanban, start the server, register MCP, load the skill, and verify everything:

Clone https://github.com/aancw/sanban, run `uv tool install .` from inside the repo (binary lands at ~/.local/bin/sanban — ensure ~/.local/bin is on PATH, e.g. `export PATH="$HOME/.local/bin:$PATH"`), start the server with `sanban` running in the background (or nohup/disown), register it as an MCP server named "sanban" running `sanban --mcp-only`, copy SKILL.md from the cloned repo into the agent's skills folder (e.g. ~/.claude/skills/sanban/SKILL.md or ~/.agents/skills/sanban/SKILL.md), then call `list_boards` to confirm it works.

Features

  • Multiple boards with custom columns

  • Drag-and-drop between columns

  • Priority, effort, tags, assignees, due dates

  • Full-text search and filters

  • Markdown in titles and descriptions (code blocks with syntax highlighting)

  • Edit and delete buttons on every card

  • Keyboard shortcuts (/ search, n new, e expand)

  • Agent-ready via MCP server

Why

  • No database — one JSON file per board in ~/.sanban/boards/, easy to diff, commit, back up

  • No auth — local-first, runs on localhost

  • No framework — vanilla JS frontend, Geist font, dark mode

  • Multi-board — one server, unlimited boards

REST API

Method

Endpoint

Description

GET

/api/boards

List all boards

POST

/api/boards

Create board { name, columns? }

GET

/api/boards/:id

Get board with items

DELETE

/api/boards/:id

Delete board

GET

/api/boards/:id/items

List items (?q=, ?status=, ?tag=, ?assignee=)

POST

/api/boards/:id/items

Create item

PATCH

/api/boards/:id/items/:iid

Update item

DELETE

/api/boards/:id/items/:iid

Delete item

GET

/api/search?q=

Search across boards

MCP Server

Agents interact with boards via MCP stdio. This is a separate process from the web server — both read/write the same JSON files.

Agent Config (opencode.json)

{
  "mcp": {
    "sanban": {
      "type": "local",
      "command": ["sanban", "--mcp-only"],
      "enabled": true
    }
  }
}

Or running from source:

{
  "mcp": {
    "sanban": {
      "type": "local",
      "command": ["uv", "run", "--directory", "/path/to/sanban", "python", "-m", "sanban.server", "--mcp-only"],
      "enabled": true
    }
  }
}

Other agents: Adapt the config format for your CLI agent (Claude Desktop, Cursor, etc.). The command is always sanban --mcp-only — only the config wrapper changes.

Tools

Tool

Description

list_boards

List all boards

create_board(name, columns?)

Create a new board

get_board(board_id)

Get board details + items

create_item(board_id, title, ...)

Add an item

update_item(board_id, item_id, ...)

Update fields

move_item(board_id, item_id, new_status)

Move to column

delete_item(board_id, item_id)

Remove item

search(query, board_id?)

Search across boards

Run Modes

sanban                # web server (REST API + UI) — keep this running
sanban --mcp-only     # MCP stdio — for agent config
sanban --rest-only    # REST only, no UI
sanban --port 9000    # custom port

Typical setup: run sanban in a terminal (or background it), then add sanban --mcp-only to your agent config. Both use the same ~/.sanban/boards/ data.

Data

Boards live in ~/.sanban/boards/<id>.json. Override with SANBAN_DATA_DIR.

For Agents

See SKILL.md for the full agent reference — API examples, MCP tools, item fields, and keyboard shortcuts.

Tech

Python 3.10+, FastAPI, uvicorn, MCP SDK. No database, no framework, no build step.

License

MIT

Available Tools

8 tools
create_boardA

Create a new kanban board.

Args: name: Board name columns: Column names (default: backlog, in_progress, done)

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
columnsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must disclose behavioral traits. It only says 'create' without mentioning side effects, permissions, or error conditions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise at two lines, front-loading the purpose and parameter info with no waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple create tool with an output schema, the description covers purpose and params but lacks usage guidelines and behavioral detail, leaving gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, but the description adds meaning by stating name is board name and columns are column names with default, exceeding the schema's type-only info.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Create a new kanban board' with a specific verb and resource, distinguishing it from sibling tools like create_item and get_board.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool vs alternatives, nor prerequisites or context for usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_itemB

Create an item on a board.

Args: board_id: Board ID title: Item title status: Column/status to place it in description: Full description priority: critical/high/medium/low/none effort: XS/S/M/L/XL tags: List of tags assignee: Assigned person due_date: Due date (ISO format)

ParametersJSON Schema
NameRequiredDescriptionDefault
board_idYes
titleYes
statusNobacklog
descriptionNo
priorityNonone
effortNo
tagsNo
assigneeNo
due_dateNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. It only lists parameters and does not disclose behavioral traits like side effects, authentication needs, rate limits, or what happens on creation (e.g., success response).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description starts with a clear purpose sentence followed by a bullet-list of parameters. It is concise and well-structured, though the parameter list could be slightly more front-loaded with the main action.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 9 parameters, 0% schema coverage, and no annotations, the description explains all parameters but lacks behavioral context and usage guidance. It does not mention output schema, even though one exists. With sibling tools, some guidance on when to create vs update would improve completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so description adds all parameter meaning. It explains each parameter with brief but sufficient descriptions, including enums for priority and effort. Some explanations are terse but overall informative.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Create an item on a board.' This is a specific verb and resource that distinguishes it from siblings like create_board, delete_item, update_item, and move_item.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives. There is no mention of prerequisites, when not to use, or how it compares to update_item or other tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_itemC

Delete an item from a board.

Args: board_id: Board ID item_id: Item ID

ParametersJSON Schema
NameRequiredDescriptionDefault
board_idYes
item_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, and the description does not disclose any behavioral traits such as irreversibility, permission requirements, or side effects. It simply states 'Delete' without implications.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is very short but lacks necessary detail. Its brevity comes at the cost of completeness, making it under-specified for an effective tool definition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no annotations, no parameter explanations, and no mention of return values or error handling (despite an output schema existing), the description is insufficient for understanding the full context of the tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%; the description lists parameter names but adds no explanations beyond the schema. The schema already provides titles, so the description offers no added value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Delete an item from a board,' specifying the verb and resource. It is concise and distinguishes from siblings like create_item, update_item, and move_item.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives, prerequisites, or exclusions. The description lacks context for decision-making.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_boardB

Get board details and all items.

Args: board_id: Board ID

ParametersJSON Schema
NameRequiredDescriptionDefault
board_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must disclose behavior. It implies a read operation by saying 'Get,' but does not explicitly state that it is non-destructive or safe, nor does it mention permissions, rate limits, or other side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is very concise at two short sentences, with the key purpose stated first. However, it could be slightly more informative without adding verbosity, such as clarifying the return type or board ID format.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has only one parameter and an output schema exists, the description adequately covers the basic inputs and outputs ('Get board details and all items'). It is complete enough for a simple read action, though it lacks context on filtering or pagination.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 0% coverage (no description for the parameter), and the description only repeats the parameter name ('board_id: Board ID'), adding no semantic meaning beyond the name. For a tool with one parameter, the description should clarify what constitutes a valid board ID or how to obtain it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description specifies 'Get board details and all items,' clearly indicating the verb (Get) and resource (board details and items). This distinguishes it from sibling tools like list_boards, which likely returns summary information, and create_board, which writes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives like list_boards or search. It does not specify prerequisites or when not to use it, leaving the agent to infer usage context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_boardsA

List all kanban boards.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so the description must disclose behavioral traits. It fails to mention key aspects: whether pagination, filtering, or ordering are supported, or if it returns all fields or summaries. For a list operation, these details are important for effective use.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single short sentence with no wasted words. It is front-loaded with the core functionality and perfectly concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (no parameters, output schema exists), the description is mostly complete. However, it could hint at whether the list is comprehensive or filtered, and at the expected return format. Still, it meets the basic needs for a straightforward list tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and 100% schema description coverage. While the description does not add semantic meaning beyond the schema, the absence of parameters makes any additional explanation unnecessary. Baseline 4 for 0 parameters is justified.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description 'List all kanban boards' clearly states the action (list) and the resource (kanban boards). It is a specific verb+resource pair that distinguishes it from sibling tools like get_board (likely single board) and create_board.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no explicit guidance on when to use this tool versus alternatives like get_board or search. However, the simple list operation implicitly suggests it is for obtaining an overview of all boards, which is a typical use case.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

move_itemB

Move an item to a different column/status.

Args: board_id: Board ID item_id: Item ID new_status: Target column name

ParametersJSON Schema
NameRequiredDescriptionDefault
board_idYes
item_idYes
new_statusYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of disclosing behavioral traits. It only states the action without mentioning side effects, permissions required, idempotency, or whether the move is reversible. This is insufficient for safe tool invocation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise: a single sentence followed by a clean argument list. No unnecessary words, and the purpose is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having an output schema (per context signals), the description omits crucial context: it doesn't clarify when to use this over update_item, doesn't specify constraints on new_status (e.g., valid column names), and lacks behavioral details. For a move operation, the description is incomplete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It provides basic descriptions for each parameter: 'Board ID', 'Item ID', and 'Target column name'. The last adds a bit of meaning beyond the parameter name, but overall the descriptions are minimal and redundant.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: moving an item to a different column or status. The verb 'Move' and resource 'item' are specific, and it distinguishes this tool from sibling tools like create, delete, get, list, search, and especially update_item, as moving implies a specific type of update.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives like update_item. It does not mention prerequisites, when not to use it, or how it relates to sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_itemC

Update an item's fields.

Args: board_id: Board ID item_id: Item ID title: New title status: New status/column description: New description priority: New priority effort: New effort estimate tags: New tags list assignee: New assignee due_date: New due date sort_order: New sort order

ParametersJSON Schema
NameRequiredDescriptionDefault
board_idYes
item_idYes
fieldsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are present, so the description must disclose behavioral traits. It states 'Update an item's fields' but does not specify whether updates are overwrites or merges, what happens to unspecified fields, or any permission requirements. The parameter list is misleading as it suggests separate parameters when the schema has only three.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a long, code-style parameter listing that is not concise. It could be shortened and restructured to highlight key points first.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity with many fields in an object, the description is incomplete. It does not explain the 'fields' object structure, nor does it mention the output schema content. The description could help by clarifying the parameter hierarchy.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 0% description coverage. The description adds a list of field names (title, status, etc.) that are presumably inside the 'fields' object, providing some meaning beyond the bare schema. However, the structure of 'fields' is not explained, leaving ambiguity.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The tool name 'update_item' with description 'Update an item's fields' clearly indicates the action and resource. However, it does not differentiate from sibling tools like 'move_item' or 'create_item', which could be confused.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives. The description does not mention context, prerequisites, or typical use cases.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 8 tool updatesv0.1.0
    • First observedcreate_board
    • First observedcreate_item
    • First observeddelete_item
    • First observedget_board
    • First observedlist_boards
    • First observedmove_item
    • First observedsearch
    • First observedupdate_item

TDQS

B3.3/5.0

Scored across 8 tools

Disambiguation5/5

Each tool has a clear, distinct purpose: board creation, item CRUD, movement, and search. No overlap in functionality.

Naming Consistency4/5

Most tools follow a verb_noun pattern (e.g., create_item, delete_item). The 'search' tool deviates slightly without a noun, but it's a common, acceptable exception.

Tool Count5/5

8 tools is well-scoped for a kanban board server, covering essential operations without excess.

Completeness3/5

Covers core item CRUD and board creation/listing, but missing board update and delete operations, which are notable gaps for full lifecycle management.

Maintenance

ActivityStale
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers