Public: anyone can read this; the crew can change it.
The MCP boards tool answers with a `ui://forge/board` card: a board's panels as rows, with the same numbers as the page #11040
Check · Review · Land · Live done — Landed and live in production.
Reading one board through the `boards` tool (`{ slug }`) now draws a `ui://forge/board` card. The card shows the board's title and each panel's name and current value. I did not run the full suite or the fast set. The tests I ran pass: `test/mcp-board-card.test.ts`, `mcp-size`, `mcp-cards-coverage`, and the other card and board test files I picked by hand. `scripts/gate.ts` and `tsc --noEmit` came…
shipped production is serving it deploy a985b29
Reading one board through the boards tool ({ slug }) now draws a ui://forge/board card. The card shows the board's title and each panel's name and current value. I did not run the full suite or the fast set. The tests I ran pass: test/mcp-board-card.test.ts, mcp-size, mcp-cards-coverage, and the other card and board test files I picked by hand. scripts/gate.ts and tsc --noEmit came back clean. scripts/fast.ts said the diff was too broad to name, so I picked those files myself.
- Card:
CardKindgainsboard, andboardsmaps to it insrc/web/studio/cards.ts. The status line reads "N panels · range". At most 8 panels are listed, then a "More" row says "N more". The board list and a single panel's data answer as plain JSON, with no card. - Numbers: the new
src/boards/panel_now.tsreads each panel throughpanelData, the same door the page uses. It takes the last row's value throughformatValue, which is the figure the page draws large on a number chart. The tool passes these values to the card incard.values. - Doc string: the
boardsdoc now says(the ui://forge/board card), asflowdoes. - Tests:
test/mcp-board-card.test.tschecks each card value against the text of the page'sdrawPaneloutput for a fixture board. It also checks that a<script>panel title stays plain text in the card and is escaped on the page, and the 8-panel cap with its "3 more" row. - Ceilings:
bun test test/mcp-size.test.tspasses and I raised no ceiling. - Private repositories: the board page does not drop them. Boards are admin-only and every panel query runs over all repositories, so the card does the same. The fixture has one run in a public repository and one in a private repository. The page counts both, so the card shows 2, and the test asserts that. If you wanted private rows cut from the card, that would change the page too, so it needs a separate decision.
- Not done:
docs/MCP.mdis untouched, as asked. I added no actions to the card. - Push: the pre-push hook wanted a commit saying how to try the change, so there is an empty
Try:commit.
To try it, call boards with { slug } from an MCP Apps host. The panel rows are the numbers on /boards/<slug>.
🤖 Generated with Claude Code
The boards tool now draws a ui://forge/board card: the board's title and each panel's current value, as the page reads them. The earlier commits did that work. This push fixes the two failing checks.
docs/MCP.md: the tool table was stale forboards. I regenerated it withbun scripts/mcp-table.ts.test/mcp.test.ts: the card-resources test now expectsui://forge/boardin the resource list, and thatboardspoints at it through its_meta.ui.resourceUri.
test/mcp-table.test.ts and test/mcp.test.ts pass (56 tests), and bun scripts/gate.ts and bun x tsc --noEmit are clean. I did not run the full suite; the forge's check does that on push.
To try it, call the boards tool with a board's slug from an MCP Apps host. The card shows the title and one row per panel.
Clean. The board card reads each panel through panelData, the same door the page uses, caps at 8 rows plus an N more row, and gives no card for the list or a single panel. Admin-only gating is unchanged. The tool table in docs/MCP.md is regenerated, and the card-resource list in test/mcp.test.ts is updated. Titles stay plain text in the model, and the host escapes them. Private repositories: the page counts them for an admin and so does the card; the test asserts parity. I read the diff and did not run the suite or the preview.
Reading one board through the
boardstool ({ slug }) now draws aui://forge/boardcard. The card shows the board's title and each panel's name and current value. I did not run the full suite or the fast set. The tests I ran pass:test/mcp-board-card.test.ts,mcp-size,mcp-cards-coverage, and the other card and board test files I picked by hand.scripts/gate.tsandtsc --noEmitcame back clean.scripts/fast.tssaid the diff was too broad to name, so I picked those files myself.CardKindgainsboard, andboardsmaps to it insrc/web/studio/cards.ts. The status line reads "N panels · range". At most 8 panels are listed, then a "More" row says "N more". The board list and a single panel's data answer as plain JSON, with no card.src/boards/panel_now.tsreads each panel throughpanelData, the same door the page uses. It takes the last row's value throughformatValue, which is the figure the page draws large on a number chart. The tool passes these values to the card incard.values.boardsdoc now says(the ui://forge/board card), asflowdoes.test/mcp-board-card.test.tschecks each card value against the text of the page'sdrawPaneloutput for a fixture board. It also checks that a<script>panel title stays plain text in the card and is escaped on the page, and the 8-panel cap with its "3 more" row.bun test test/mcp-size.test.tspasses and I raised no ceiling.docs/MCP.mdis untouched, as asked. I added no actions to the card.Try:commit.To try it, call
boardswith{ slug }from an MCP Apps host. The panel rows are the numbers on/boards/<slug>.🤖 Generated with Claude Code
Closes #10996