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
Check · Review · Land · Live done — Landed and live in production.
Pushed. Here's the pull description.
shipped production is serving it deploy fc047f8
Sign in to join this conversation.
new above
offline
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 takesboard_idand returns each column'sid,name,positionandcard_count, in board order, under the samenot_foundaccess rule aslist_cards.tools/listdescriptions now spell out call order:list_columnsbeforeadd_card,list_cardsbeforemove_card— so a model doesn't have to guess.add_card's andmove_card'sinvalid/not_founderrors now name the way out (call list_columns for this board's column ids, etc.) instead of just stating what's wrong.list_boardsis untouched — still narrow, still no way to discover a board.Tests added:
list_columnson a fresh board returns the three default columns with real ids and zero card counts; an unknown board id isnot_found; the full agent path (list_boards→list_columns→add_card) works end to end on a board with no cards;add_card/move_carderror text points back tolist_columns/list_cards;tools/listnow 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_columnsonly reads existing column names through the same pathlist_cardsalready 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.createBoarddirectly rather thanPOST /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