Skip to main content
Glama

Draw a saved canvas with its figures

well_render_canvas
Read-only

Draw one of the workspace's saved canvases WITH its figures, from the readings you already have.

This tool measures nothing. Every figure on the board is one you measured through that block's own skill and validated through that block's own render tool; this checks that each reading is that tool's output for that block and that its figure can be drawn, and returns the board with each "figure" block carrying that reading as its params. The block draws its counter, its chart, and any partial-read disclosure from that one reading. It stores nothing either, so the board is resolved fresh every time it is opened and no figure on it can go stale.

WORKFLOW — run it in this order, and do not shorten it:

  1. well_show_canvas({ canvas_view_id }) → the board's version, and its blocks, each with the feed it reads and the window it asks for.

  2. For EVERY block that names a feed, run that feed's own skill over that block's window, and call its render tool (well_render_cash_position, well_render_burn, well_render_mrr, well_render_runway, well_render_cost_structure, well_render_cash_forecast, well_render_cash_flow_bridge).

  3. well_render_canvas({ canvas_view_id, version, blocks }) → the version well_show_canvas returned, and one entry per feed block carrying the structuredContent that tool returned, forwarded WHOLE.

Forward each reading as it came back, and send nothing beside it. Do not rebuild it, do not round it, and do not compute a figure to put in it. A reading that is not its block's own render tool output, or that covers a different window than its block asks for, is refused. A partial reading draws, and the block states that it is partial. A reading whose figure still cannot be drawn (a runway with no measured span, an amount that is not a number) does not refuse the board: the block draws as one that cannot be drawn, every other block draws, and the result lists it under not_drawn. That is a data state on Well's side, never one the reader can fix: say which block did not draw and that nothing is asked of them, and do not ask them to correct rows or rerun anything.

Every feed block on the canvas needs an entry. A board drawn with one block missing is refused rather than drawn short, because a board missing a figure reads as a board whose figure is zero. Blocks that name no feed — a note — carry their own words already and take no entry. If the canvas changed since you read it, the draw is refused: read it again and measure what it holds now.

Do NOT use this to answer a question about one figure: that is the figure's own render tool, and a board is not an answer to it. Do not use it to save or rearrange a board, which is well_upsert_canvas.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
blocksYesOne entry per block on the canvas that names a feed. A note takes none.
versionYesThe canvas version well_show_canvas returned. The readings were measured against that version's blocks.
workspace_idNoTarget workspace. Omit when the token authorizes one workspace. Required when it authorizes several: this read reports one workspace's own figures and will not choose which.
canvas_view_idYesThe canvas to draw. Read it first with well_show_canvas.
conversation_idNoThe conversation id returned by the previous Well result, in its meta under well/conversation_id, in its structuredContent, or in its JSON text block. Pass it back on every call in the same conversation, including a call a card makes, so the chosen workspace and the earlier answers still apply. It decides the conversation on its own: nothing the host states about the session replaces it. Omit it only on the first call of a conversation.
workspace_scopeNoRestrict this call to the family: the token's primary workspace plus the company workspaces under it that you are a member of. Unrelated authorized workspaces drop out of the read; row reads merge across the family, while a per-workspace figure still reports exactly one workspace.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
nameNo
errorNo
tilesNo
successYes
versionNo
can_editNo
not_drawnNo
author_nameNo
layout_modeNo
grid_columnsNo
canvas_view_idNo
tiles_resolvedNo
conversation_idNoThe conversation this result belongs to. Pass it back as the conversation_id argument on every later Well call in the same conversation.
newly_connectedNoTools that connected to this workspace since the last result and that no session was told about yet, oldest first. Present only when at least one tool is new. The connected-line rule says when to tell an entry; when it does, one line per entry, in the person's language: "<name> is connected.". Never fold several entries into one sentence. Each entry comes back once, on one result only: never repeat its line later.
origin_template_idNo
resolved_workspaceNoThe workspace that answered, when the caller named none and the token authorizes several.
conversation_id_noteNoPresent only when the server opened a fresh lane, stating that no choice recorded earlier was read.
conversation_id_sourceNoWhere the conversation id came from: the host's own request meta, the caller's argument, or a fresh lane the server opened.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed3 schema fields changed
    • addedOutput schema / properties / author_name
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • addedOutput schema / properties / can_edit
      Added value: +{
      +  "type": "boolean"
      +}
    • changedOutput schema / properties / newly_connected / description
      Previous value: -"Tools that connected to this workspace since the last result and that no session was told about yet, oldest first. Present only when at least one tool is new. Start the reply with one line per entry, in the person's language: \"<name> is connected.\". Never fold several entries into one sentence. Each entry comes back once, on one result only: never repeat its line later."New value: +"Tools that connected to this workspace since the last result and that no session was told about yet, oldest first. Present only when at least one tool is new. The connected-line rule says when to tell an entry; when it does, one line per entry, in the person's language: \"<name> is connected.\". Never fold several entries into one sentence. Each entry comes back once, on one result only: never repeat its line later."
  2. Changed1 schema field changed
    • addedInput schema / properties / workspace_scope
      Added value: +{
      +  "description": "Restrict this call to the family: the token's primary workspace plus the company workspaces under it that you are a member of. Unrelated authorized workspaces drop out of the read; row reads merge across the family, while a per-workspace figure still reports exactly one workspace.",
      +  "enum": [
      +    "family"
      +  ],
      +  "type": "string"
      +}
  3. Changed1 schema field changed
    • addedOutput schema / properties / newly_connected
      Added value: +{
      +  "description": "Tools that connected to this workspace since the last result and that no session was told about yet, oldest first. Present only when at least one tool is new. Start the reply with one line per entry, in the person's language: \"<name> is connected.\". Never fold several entries into one sentence. Each entry comes back once, on one result only: never repeat its line later.",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "name": {
      +        "type": "string"
      +      },
      +      "service_id": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "name",
      +      "service_id"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
  4. Changed1 schema field changed
    • addedOutput schema / properties / not_drawn
      Added value: +{
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "reason": {
      +        "type": "string"
      +      },
      +      "source": {
      +        "type": "string"
      +      },
      +      "tile_id": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "tile_id",
      +      "source",
      +      "reason"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
  5. Added

TDQS

Score is being calculated.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources