place_widget
Display markdown, tables, charts, metrics, status lists, or live architecture maps on the mcp-screen browser canvas so terminal agents can show visual output and return a widget ID.
Instructions
Show something to the human on their mcp-screen canvas (a browser tab next to the terminal). Returns the widget id. Widget kinds and their data:
markdown {markdown}
text {text} (monospace log/output)
table {columns: string[], rows: cell[][]} (sortable; row clicks become the widget selection)
chart {type: "bar"|"line", labels: string[], values: number[], unit?, linkTo?: tableId} (bar clicks become the selection and filter the linked table)
metric {value, label?, delta?}
kv {items: {key: value}}
status-list {items: [{label, status: "ok"|"fail"|"pending"|"unknown", detail?}]}
livemap {root?, nodes: [{id, label, globs: string[], layer?, description?}], edges: [{from, to, label?}]} (architecture diagram; file edits matching a node's globs light it up live)
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| h | No | Height in grid rows, 1-4. | |
| w | No | Width in grid columns, 1-4. | |
| id | No | Optional stable id, e.g. "ci-failures". | |
| data | Yes | Payload matching the kind (see description). | |
| kind | Yes | ||
| title | Yes | ||
| source | No | Optional live source, re-run server-side every intervalMs with no LLM. {type:"command", argv:[...], cwd?, parse?:"json"|"text"} (no shell) | {type:"url", url, parse?} | {type:"mcp", tool, arguments?} (wrap mode only). NOTHING runs until the human clicks Approve on the canvas; approved sources go on a persistent allow-list. Output must match the widget data shape (or be text for markdown/text/metric). | |
| intervalMs | No | Refresh interval for a live source, min 2000, default 30000. |