Inspect a Canvas Read-Only
The first thing to do with a new agent connection, and the first thing to do in any session before a write. Every call here is a read. Nothing is created, nothing is charged.
Scopes: canvas:read, asset:read. Cost: none.
Call sequence
canvas_list → canvas_get → canvas_validate → get_canvas_image or open_canvasOr on the CLI:
canvas list → canvas get → connection list → canvas render → asset listSteps
Find the canvas
MCP: call canvas_list.
CLI:
gavana canvas list --limit 25 --output humanJust the handles:
gavana canvas list --limit 25 --jq '.canvases[].handle' -rCheck before continuing. You need exactly one handle. If two canvases plausibly match the user’s description, ask which — do not pick. --limit here is capped at 25; continue with --cursor set to page.nextCursor if you need more.
Read the graph
MCP: canvas_get with the exact handle.
CLI:
gavana canvas get canvas:OWNER_UID:CANVAS_ID --prettyCheck before continuing. Note four things:
gavana canvas get canvas:OWNER_UID:CANVAS_ID --jq '.canvas.revision' -r- The
revision— you will need it for any later write. - Node count and node types (
text,sticky,image,video). - Which text nodes carry
metadata.isSection: true— those are Sections, the canvas’s spatial structure. - The connections and their modes.
Audit the structure
MCP: canvas_validate with only the canvas id audits the current graph without proposing anything.
The result has a summary with errors, warnings, info, passed, and reviewRequired, plus a findings array. Each finding carries a code, a severity, exact node and connection handles, and a guideUri pointing at the guide topic that explains it.
Common codes and what they mean:
| Code | Meaning |
|---|---|
node_overlap | Two ordinary nodes overlap by more than 8 units in both directions |
fake_section_header | A wide, short text node imitating a heading instead of being a Section |
unconnected_generated_output | A generated image or video with no incoming relationship |
orphan_media_placeholder | An empty media node with no relationship to a prompt, source, List, or stage |
broken_connection | A connection pointing at a missing node |
unclear_connection | A self-loop, a Section used as a workflow endpoint, or a wrong frame mode |
duplicate_connection | Two identical directed edges with the same mode |
broken_generated_lineage | A lineage reference in metadata pointing at a node that no longer exists |
malformed_section | A node marked as a Section that is not a text node of at least 200 by 160 |
Check before continuing. summary.passed means no structural error. summary.reviewRequired is true whenever errors, warnings, or truncated findings still need a human or agent look. Findings are advisory — they are review items, not a licence to start fixing the user’s canvas.
Validation never mutates the canvas and never consumes an idempotency key.
The CLI has no dedicated validate command. Use MCP canvas_validate, or the API with validateOnly: true. On a canvas you own you can reach it through the raw passthrough:
gavana api POST /canvases/CANVAS_ID/operations \
--json '{"validateOnly":true,"operations":[{"type":"node.move","nodeId":"node:NODE_ID","position":{"x":0,"y":0}}]}'Look at it
MCP: get_canvas_image returns a preview; open_canvas returns a verified review link for a human.
CLI:
gavana canvas render canvas:OWNER_UID:CANVAS_ID --file ./board.svgReturns mediaType, the resolved file path, and bytes. Omit --file (or pass --file -) to get the SVG inline instead.
Check before continuing. Preview images are for review. They are not durable records — the node: and asset: handles are.
List the connections and assets
gavana connection list canvas:OWNER_UID:CANVAS_ID --jq '.connections[]' --output jsonl
gavana asset list --canvas canvas:OWNER_UID:CANVAS_ID --limit 50connection list also returns the canvas handle and revision, so it doubles as a cheap revision check.
Report
Report using the exact returned handles, not titles or reconstructed ids.
What you end up with
- The canvas handle and its current
revision - Node and connection handles you can safely use in a later write
- A structural assessment from
canvas_validate - A review link or a rendered SVG for a human
- Nothing changed, nothing charged
Prompt for an agent
Connect to Gavana in read-only mode. List my canvases, inspect the one most relevant
to [goal], and summarise its nodes, connections, current revision, and the safest
next step. Use the exact handles Gavana returns. Do not make changes and do not
start generation.The expected trace is canvas_list then canvas_get, then optionally canvas_validate, get_canvas_image, or open_canvas. If you see a write tool in the trace, the agent went off contract.
Do this with a read-only connection
You do not need a full-scope credential for any of this:
- Hosted MCP: stay on the read-only tools
- CLI:
gavana auth login --read-only - Local MCP: a token with only
canvas:readandasset:read
Read-only is not a lesser version of inspection — it is the same reads with the write tools removed.
Continuing from here
If the review is all you needed, you are done. To create durable work, reconnect with a fuller endpoint or token and say explicitly what may happen next.