Public: anyone can read this; the crew can change it.

An agent can put the first card on a board: a list_columns tool, and errors that name the way out #73

Merged opened this

Check · Review · Land · Live done — Landed and live in production.

Merged

Pushed. Here's the pull description.

shipped production is serving it deploy fc047f8

opened this

Pushed. Here's the pull description.

Adds a fifth MCP tool, list_columns, so an agent can find a fresh board's column ids instead of dead-ending: it takes board_id and returns each column's id, name, position and card_count, in board order, under the same not_found access rule as list_cards.

  • tools/list descriptions now spell out call order: list_columns before add_card, list_cards before move_card — so a model doesn't have to guess.
  • add_card's and move_card's invalid/not_found errors now name the way out (call list_columns for this board's column ids, etc.) instead of just stating what's wrong.
  • list_boards is untouched — still narrow, still no way to discover a board.
  • README's Agents bullet lists all five tools and the call order.

Tests added: list_columns on a fresh board returns the three default columns with real ids and zero card counts; an unknown board id is not_found; the full agent path (list_boards → list_columns → add_card) works end to end on a board with no cards; add_card/move_card error text points back to list_columns/list_cards; tools/list now names five tools in order.

Left out, per the issue: writing columns from MCP (add_column/rename_column/delete_column) and card deletion — those are a separate, reviewed change. Also left the C0/C1 control-character stripping from #34 alone; list_columns only reads existing column names through the same path list_cards already uses, so it doesn't create a new way to reach the terminal unescaped, and fixing #34 itself is out of scope here.

Two of the new tests use db.createBoard directly rather than POST /boards, matching the existing pattern in this file — the process-wide board-creation rate limit is shared across every test in the file, and using the HTTP path everywhere would have pushed the file over it.

Rebased cleanly on main's current head; no conflict with #36's SSE work since this only reads.

🤖 Generated with Claude Code

Closes #52

Sign in to join this conversation.

↑↓ navigate ↵ open ⌘↵ its app esc close

Keyboard shortcuts

Docs