← WebMCP Directory

Tool tree

inkling.aniruddhachaudhari95.chatgpt.site

Productivity & BusinessTools verified
Website
A shared notebook canvas where an agent measures, proposes, and verifies beside you.
Explore capabilities
    get_sceneAnswer

    Returns every element on the active canvas with stable IDs and integer canvas-space geometry, including freehand ink points and ID-connected arrows. This is the single source of truth. Call after every write and after the human may have edited.

    View tool JSON
    {
      "name": "get_scene",
      "kind": "answer",
      "impl": "imperative",
      "description": "Returns every element on the active canvas with stable IDs and integer canvas-space geometry, including freehand ink points and ID-connected arrows. This is the single source of truth. Call after every write and after the human may have edited.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      }
    }
    get_canvasesAnswer

    Returns all canvases, their stable IDs, element counts, and the active canvas ID. Use activate_canvas before reading or editing another canvas.

    View tool JSON
    {
      "name": "get_canvases",
      "kind": "answer",
      "impl": "imperative",
      "description": "Returns all canvases, their stable IDs, element counts, and the active canvas ID. Use activate_canvas before reading or editing another canvas.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      }
    }
    activate_canvasAction

    Switches the visible active canvas by stable canvas ID without changing its content. Call get_scene after switching.

    View tool JSON
    {
      "name": "activate_canvas",
      "kind": "act",
      "impl": "imperative",
      "description": "Switches the visible active canvas by stable canvas ID without changing its content. Call get_scene after switching.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "canvasId": {
            "type": "string",
            "minLength": 1
          }
        },
        "required": [
          "canvasId"
        ]
      }
    }
    create_canvasAction

    Creates and activates a new empty canvas. This does not delete or overwrite existing canvases. Call get_scene after creation.

    View tool JSON
    {
      "name": "create_canvas",
      "kind": "act",
      "impl": "imperative",
      "description": "Creates and activates a new empty canvas. This does not delete or overwrite existing canvases. Call get_scene after creation.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 60
          }
        }
      }
    }
    get_selectionAnswer

    Returns the IDs selected by the human and their combined canvas-space bounding box.

    View tool JSON
    {
      "name": "get_selection",
      "kind": "answer",
      "impl": "imperative",
      "description": "Returns the IDs selected by the human and their combined canvas-space bounding box.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      }
    }
    get_viewportAnswer

    Returns the canvas-space region currently visible to the human, including pan offset and zoom.

    View tool JSON
    {
      "name": "get_viewport",
      "kind": "answer",
      "impl": "imperative",
      "description": "Returns the canvas-space region currently visible to the human, including pan offset and zoom.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      }
    }
    detect_overlapsAnswer

    Returns every intersecting pair of diagram shapes and the overlap rectangle and area in canvas pixels. Freehand ink and arrows are intentionally excluded.

    View tool JSON
    {
      "name": "detect_overlaps",
      "kind": "answer",
      "impl": "imperative",
      "description": "Returns every intersecting pair of diagram shapes and the overlap rectangle and area in canvas pixels. Freehand ink and arrows are intentionally excluded.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      }
    }
    get_edge_crossingsAnswer

    Returns pairs of ID-connected arrows that visually cross and each canvas-space intersection point.

    View tool JSON
    {
      "name": "get_edge_crossings",
      "kind": "answer",
      "impl": "imperative",
      "description": "Returns pairs of ID-connected arrows that visually cross and each canvas-space intersection point.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      }
    }
    check_alignmentAnswer

    Reports shape edges and centers that align or nearly align within tolerancePx, with suggested snap coordinates.

    View tool JSON
    {
      "name": "check_alignment",
      "kind": "answer",
      "impl": "imperative",
      "description": "Reports shape edges and centers that align or nearly align within tolerancePx, with suggested snap coordinates.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "tolerancePx": {
            "type": "number",
            "minimum": 0,
            "maximum": 100,
            "default": 8
          }
        }
      }
    }
    get_text_overflowAnswer

    Measures labels using the actual rendered browser font and returns labels clipped by their shape bounds.

    View tool JSON
    {
      "name": "get_text_overflow",
      "kind": "answer",
      "impl": "imperative",
      "description": "Measures labels using the actual rendered browser font and returns labels clipped by their shape bounds.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      }
    }
    measure_gapsAnswer

    Returns spacing between adjacent shapes along one canvas axis. Omit ids to measure all shapes.

    View tool JSON
    {
      "name": "measure_gaps",
      "kind": "answer",
      "impl": "imperative",
      "description": "Returns spacing between adjacent shapes along one canvas axis. Omit ids to measure all shapes.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "ids": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "uniqueItems": true
          },
          "axis": {
            "type": "string",
            "enum": [
              "x",
              "y"
            ]
          }
        },
        "required": [
          "axis"
        ]
      }
    }
    get_boundsAnswer

    Returns the bounding box containing all shapes and ink, and flags drawable elements outside the visible canvas region.

    View tool JSON
    {
      "name": "get_bounds",
      "kind": "answer",
      "impl": "imperative",
      "description": "Returns the bounding box containing all shapes and ink, and flags drawable elements outside the visible canvas region.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      }
    }
    wait_for_changeAction

    Blocks until the human next edits the canvas, then returns what they changed and the resulting scene. Your own edits never wake this. Omit sinceRevision to watch from now on; afterwards pass back the revision from the previous result so nothing you missed while reacting is dropped. If it returns timedOut the human was simply idle - call it again to keep watching. Use this to collaborate live: wait, read what they did, make a complementary change, then wait again.

    View tool JSON
    {
      "name": "wait_for_change",
      "kind": "act",
      "impl": "imperative",
      "description": "Blocks until the human next edits the canvas, then returns what they changed and the resulting scene. Your own edits never wake this. Omit sinceRevision to watch from now on; afterwards pass back the revision from the previous result so nothing you missed while reacting is dropped. If it returns timedOut the human was simply idle - call it again to keep watching. Use this to collaborate live: wait, read what they did, make a complementary change, then wait again.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "sinceRevision": {
            "type": "number",
            "minimum": 0,
            "description": "Revision from the previous result. Omit on the first call to watch from now on."
          },
          "timeoutSeconds": {
            "type": "number",
            "minimum": 5,
            "maximum": 120,
            "default": 30
          }
        }
      }
    }
    check_export_readyAnswer

    Runs every layout check at once (overlaps, crossing arrows, clipped labels, stray shapes far from the diagram, empty labels) and returns a single ready flag plus the specific problems. Call this before telling the human the diagram is done. If ready is false, fix the listed issues - usually by calling auto_layout - and check again.

    View tool JSON
    {
      "name": "check_export_ready",
      "kind": "answer",
      "impl": "imperative",
      "description": "Runs every layout check at once (overlaps, crossing arrows, clipped labels, stray shapes far from the diagram, empty labels) and returns a single ready flag plus the specific problems. Call this before telling the human the diagram is done. If ready is false, fix the listed issues - usually by calling auto_layout - and check again.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      }
    }
    list_icon_categoriesAnswer

    Returns the icon library categories with a one-line description and count for each. Call this first whenever a diagram would read better with real service, product, or subject icons than with plain labelled boxes - AWS architecture, application stacks, business processes, or personal planning. Then call search_icons to find slugs within a category.

    View tool JSON
    {
      "name": "list_icon_categories",
      "kind": "answer",
      "impl": "imperative",
      "description": "Returns the icon library categories with a one-line description and count for each. Call this first whenever a diagram would read better with real service, product, or subject icons than with plain labelled boxes - AWS architecture, application stacks, business processes, or personal planning. Then call search_icons to find slugs within a category.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      }
    }
    search_iconsAnswer

    Returns icons matching a query, ranked, with the stable slugs that add_icons and the add_icon operation require. Omit category to search the whole library when you already know the product name; pass one to browse. If nothing matches, the result says so and suggests the nearest names - fall back to a labelled rectangle rather than guessing a slug. Icons marked provisional are the right service with placeholder art.

    View tool JSON
    {
      "name": "search_icons",
      "kind": "answer",
      "impl": "imperative",
      "description": "Returns icons matching a query, ranked, with the stable slugs that add_icons and the add_icon operation require. Omit category to search the whole library when you already know the product name; pass one to browse. If nothing matches, the result says so and suggests the nearest names - fall back to a labelled rectangle rather than guessing a slug. Icons marked provisional are the right service with placeholder art.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string",
            "description": "Product, service, or subject - \"lambda\", \"postgres\", \"shipping\", \"coffee\"."
          },
          "category": {
            "type": "string",
            "description": "Optional category id from list_icon_categories."
          },
          "limit": {
            "type": "number",
            "minimum": 1,
            "maximum": 50,
            "default": 20
          }
        },
        "required": [
          "query"
        ]
      }
    }
    add_iconsAction

    Places one or more library icons on the active canvas at canvas-space coordinates, revealing them progressively so the human can follow the construction, and returns their new element IDs. Slugs must come from search_icons. Icons behave like any other shape: connect them with add_arrow and tidy them with auto_layout. They are placed uncaptioned - the logo identifies the service. If a caption is genuinely needed, add a separate text element beside the icon. Every slug is validated before anything is placed, so a wrong slug changes nothing.

    View tool JSON
    {
      "name": "add_icons",
      "kind": "act",
      "impl": "imperative",
      "description": "Places one or more library icons on the active canvas at canvas-space coordinates, revealing them progressively so the human can follow the construction, and returns their new element IDs. Slugs must come from search_icons. Icons behave like any other shape: connect them with add_arrow and tidy them with auto_layout. They are placed uncaptioned - the logo identifies the service. If a caption is genuinely needed, add a separate text element beside the icon. Every slug is validated before anything is placed, so a wrong slug changes nothing.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "icons": {
            "type": "array",
            "minItems": 1,
            "maxItems": 40,
            "items": {
              "type": "object",
              "properties": {
                "slug": {
                  "type": "string",
                  "minLength": 1
                },
                "x": {
                  "type": "number"
                },
                "y": {
                  "type": "number"
                },
                "size": {
                  "type": "number",
                  "minimum": 24,
                  "maximum": 256,
                  "default": 64
                }
              },
              "required": [
                "slug",
                "x",
                "y"
              ]
            }
          },
          "reason": {
            "type": "string",
            "minLength": 1,
            "maxLength": 500
          }
        },
        "required": [
          "icons",
          "reason"
        ]
      }
    }
    upload_imageAction

    Uploads image bytes you have (generated, fetched, or otherwise produced) and places the result on the active canvas - unlike apply_ops add_image, which only accepts an image already hosted at an http(s) URL. Pass a data URI built from raw bytes, e.g. "data:image/png;base64,iVBORw0KG...". Runs through the exact same server-side checks as a human file upload: an 8 MB size cap, only png/jpeg/webp/gif/svg accepted, and any SVG is stripped of scripting before it is stored. Omit width/height to size it from the image's own aspect ratio.

    View tool JSON
    {
      "name": "upload_image",
      "kind": "act",
      "impl": "imperative",
      "description": "Uploads image bytes you have (generated, fetched, or otherwise produced) and places the result on the active canvas - unlike apply_ops add_image, which only accepts an image already hosted at an http(s) URL. Pass a data URI built from raw bytes, e.g. \"data:image/png;base64,iVBORw0KG...\". Runs through the exact same server-side checks as a human file upload: an 8 MB size cap, only png/jpeg/webp/gif/svg accepted, and any SVG is stripped of scripting before it is stored. Omit width/height to size it from the image's own aspect ratio.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "dataUrl": {
            "type": "string",
            "minLength": 1,
            "description": "A base64 data URI - \"data:image/<png|jpeg|webp|gif|svg+xml>;base64,<...>\". Not a regular http(s) URL."
          },
          "fileName": {
            "type": "string",
            "maxLength": 200
          },
          "x": {
            "type": "number"
          },
          "y": {
            "type": "number"
          },
          "width": {
            "type": "number",
            "minimum": 20
          },
          "height": {
            "type": "number",
            "minimum": 20
          }
        },
        "required": [
          "dataUrl",
          "x",
          "y"
        ]
      }
    }
    apply_opsAction

    Applies typed add_shape, add_arrow, add_pen, add_image, move, resize, rotate, set_label, set_style, delete, duplicate, align, distribute, or group_layout operations. The batch is validated atomically, then shown operation by operation: shapes are placed before later connector steps draw along their path, with progress visible to the human. Stable element IDs must come from get_scene. The complete sequence is one undoable change. Match the canvas to what it is actually for: a system diagram, architecture, or process reads best as clean shapes and arrows, kept tidy with auto_layout. A casual, personal, or just-for-fun canvas (notes, planning, a journal page) can be looser in STYLE - a rotated icon, a doodled pen flourish, an occasional off-grid nudge - but never loose in LAYOUT: related items still sit near each other in reading order (top to bottom or left to right, like an actual notebook page), gaps between groups stay roughly even, and nothing is left an orphan far from everything else. Looseness is a decoration on top of a sane layout, not a replacement for one. Same tools either way, just decide which register fits before building.

    View tool JSON
    {
      "name": "apply_ops",
      "kind": "act",
      "impl": "imperative",
      "description": "Applies typed add_shape, add_arrow, add_pen, add_image, move, resize, rotate, set_label, set_style, delete, duplicate, align, distribute, or group_layout operations. The batch is validated atomically, then shown operation by operation: shapes are placed before later connector steps draw along their path, with progress visible to the human. Stable element IDs must come from get_scene. The complete sequence is one undoable change. Match the canvas to what it is actually for: a system diagram, architecture, or process reads best as clean shapes and arrows, kept tidy with auto_layout. A casual, personal, or just-for-fun canvas (notes, planning, a journal page) can be looser in STYLE - a rotated icon, a doodled pen flourish, an occasional off-grid nudge - but never loose in LAYOUT: related items still sit near each other in reading order (top to bottom or left to right, like an actual notebook page), gaps between groups stay roughly even, and nothing is left an orphan far from everything else. Looseness is a decoration on top of a sane layout, not a replacement for one. Same tools either way, just decide which register fits before building.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "ops": {
            "type": "array",
            "minItems": 1,
            "items": {
              "oneOf": [
                {
                  "type": "object",
                  "properties": {
                    "type": {
                      "const": "add_shape"
                    },
                    "shapeType": {
                      "type": "string",
                      "enum": [
                        "rect",
                        "ellipse",
                        "diamond",
                        "text"
                      ]
                    },
                    "x": {
                      "type": "number"
                    },
                    "y": {
                      "type": "number"
                    },
                    "width": {
                      "type": "number",
                      "minimum": 1
                    },
                    "height": {
                      "type": "number",
                      "minimum": 1
                    },
                    "label": {
                      "type": "string",
                      "description": "Only for shapeType \"text\". Rectangles, ellipses and diamonds hold no text - add a separate text element beside or inside them."
                    },
                    "style": {
                      "type": "object",
                      "properties": {
                        "stroke": {
                          "type": "string"
                        },
                        "fill": {
                          "type": "string"
                        },
                        "strokeWidth": {
                          "type": "number",
                          "minimum": 1,
                          "maximum": 12
                        }
                      }
                    }
                  },
                  "required": [
                    "type",
                    "shapeType",
                    "x",
                    "y",
                    "width",
                    "height"
                  ]
                },
                {
                  "type": "object",
                  "properties": {
                    "type": {
                      "const": "add_icon"
                    },
                    "slug": {
                      "type": "string",
                      "minLength": 1,
                      "description": "Slug from search_icons. Never invent one."
                    },
                    "x": {
                      "type": "number"
                    },
                    "y": {
                      "type": "number"
                    },
                    "size": {
                      "type": "number",
                      "minimum": 24,
                      "maximum": 256,
                      "default": 64
                    }
                  },
                  "required": [
                    "type",
                    "slug",
                    "x",
                    "y"
                  ]
                },
                {
                  "type": "object",
                  "properties": {
                    "type": {
                      "const": "add_arrow"
                    },
                    "fromId": {
                      "type": "string",
                      "minLength": 1
                    },
                    "toId": {
                      "type": "string",
                      "minLength": 1
                    },
                    "label": {
                      "type": "string"
                    },
                    "arrowhead": {
                      "type": "boolean",
                      "default": true,
                      "description": "Set false for a plain connecting line with no arrowhead."
                    }
                  },
                  "required": [
                    "type",
                    "fromId",
                    "toId"
                  ]
                },
                {
                  "type": "object",
                  "properties": {
                    "type": {
                      "const": "add_pen"
                    },
                    "points": {
                      "type": "array",
                      "minItems": 2,
                      "items": {
                        "type": "object",
                        "properties": {
                          "x": {
                            "type": "number"
                          },
                          "y": {
                            "type": "number"
                          }
                        },
                        "required": [
                          "x",
                          "y"
                        ]
                      },
                      "description": "Canvas-space points for one freehand ink stroke. For a technical diagram, use this narrowly - circling or underlining something. For a casual or personal canvas (notes, journals, planning something fun), it is fine to be looser: doodle a quick underline flourish, a little arrow, a simple face, a scribbled star next to something - several short add_pen strokes read as a sketch, not just an annotation. Still stays inside this app's hand-drawn look, not a photorealistic illustration."
                    },
                    "style": {
                      "type": "object",
                      "properties": {
                        "stroke": {
                          "type": "string"
                        },
                        "strokeWidth": {
                          "type": "number",
                          "minimum": 1,
                          "maximum": 12
                        }
                      }
                    }
                  },
                  "required": [
                    "type",
                    "points"
                  ]
                },
                {
                  "type": "object",
                  "properties": {
                    "type": {
                      "const": "add_image"
                    },
                    "url": {
                      "type": "string",
                      "minLength": 1,
                      "description": "A direct image URL (png/jpg/webp/gif/svg). Rendered read-only via <image href> - scripting is disabled by the browser regardless of source."
                    },
                    "x": {
                      "type": "number"
                    },
                    "y": {
                      "type": "number"
                    },
                    "width": {
                      "type": "number",
                      "minimum": 1
                    },
                    "height": {
                      "type": "number",
                      "minimum": 1
                    }
                  },
                  "required": [
                    "type",
                    "url",
                    "x",
                    "y",
                    "width",
                    "height"
                  ]
                },
                {
                  "type": "object",
                  "properties": {
                    "type": {
                      "const": "move"
                    },
                    "id": {
                      "type": "string",
                      "minLength": 1
                    },
                    "x": {
                      "type": "number"
                    },
                    "y": {
                      "type": "number"
                    }
                  },
                  "required": [
                    "type",
                    "id",
                    "x",
                    "y"
                  ]
                },
                {
                  "type": "object",
                  "properties": {
                    "type": {
                      "const": "resize"
                    },
                    "id": {
                      "type": "string",
                      "minLength": 1
                    },
                    "width": {
                      "type": "number",
                      "minimum": 1
                    },
                    "height": {
                      "type": "number",
                      "minimum": 1
                    }
                  },
                  "required": [
                    "type",
                    "id",
                    "width",
                    "height"
                  ]
                },
                {
                  "type": "object",
                  "properties": {
                    "type": {
                      "const": "rotate"
                    },
                    "id": {
                      "type": "string",
                      "minLength": 1
                    },
                    "degrees": {
                      "type": "number",
                      "description": "Absolute rotation in degrees clockwise around the element center, normalised to 0-360."
                    }
                  },
                  "required": [
                    "type",
                    "id",
                    "degrees"
                  ]
                },
                {
                  "type": "object",
                  "properties": {
                    "type": {
                      "const": "set_label"
                    },
                    "id": {
                      "type": "string",
                      "minLength": 1,
                      "description": "A text element. Shapes and icons hold no text of their own."
                    },
                    "text": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "type",
                    "id",
                    "text"
                  ]
                },
                {
                  "type": "object",
                  "properties": {
                    "type": {
                      "const": "set_style"
                    },
                    "id": {
                      "type": "string",
                      "minLength": 1
                    },
                    "style": {
                      "type": "object",
                      "properties": {
                        "stroke": {
                          "type": "string"
                        },
                        "fill": {
                          "type": "string"
                        },
                        "strokeWidth": {
                          "type": "number",
                          "minimum": 1,
                          "maximum": 12
                        }
                      },
                      "minProperties": 1
                    }
                  },
                  "required": [
                    "type",
                    "id",
                    "style"
                  ]
                },
                {
                  "type": "object",
                  "properties": {
                    "type": {
                      "const": "delete"
                    },
                    "id": {
                      "type": "string",
                      "minLength": 1
                    }
                  },
                  "required": [
                    "type",
                    "id"
                  ]
                },
                {
                  "type": "object",
                  "properties": {
                    "type": {
                      "const": "duplicate"
                    },
                    "ids": {
                      "type": "array",
                      "items": {
                        "type": "string",
                        "minLength": 1
                      },
                      "minItems": 1,
                      "uniqueItems": true
                    },
                    "dx": {
                      "type": "number",
                      "default": 26
                    },
                    "dy": {
                      "type": "number",
                      "default": 26
                    }
                  },
                  "required": [
                    "type",
                    "ids"
                  ]
                },
                {
                  "type": "object",
                  "properties": {
                    "type": {
                      "const": "align"
                    },
                    "ids": {
                      "type": "array",
                      "items": {
                        "type": "string",
                        "minLength": 1
                      },
                      "minItems": 1,
                      "uniqueItems": true
                    },
                    "edge": {
                      "type": "string",
                      "enum": [
                        "left",
                        "right",
                        "top",
                        "bottom",
                        "centerX",
                        "centerY"
                      ]
                    }
                  },
                  "required": [
                    "type",
                    "ids",
                    "edge"
                  ]
                },
                {
                  "type": "object",
                  "properties": {
                    "type": {
                      "const": "distribute"
                    },
                    "ids": {
                      "type": "array",
                      "items": {
                        "type": "string",
                        "minLength": 1
                      },
                      "minItems": 1,
                      "uniqueItems": true
                    },
                    "axis": {
                      "type": "string",
                      "enum": [
                        "x",
                        "y"
                      ]
                    }
                  },
                  "required": [
                    "type",
                    "ids",
                    "axis"
                  ]
                },
                {
                  "type": "object",
                  "properties": {
                    "type": {
                      "const": "group_layout"
                    },
                    "ids": {
                      "type": "array",
                      "items": {
                        "type": "string",
                        "minLength": 1
                      },
                      "minItems": 1,
                      "uniqueItems": true
                    },
                    "direction": {
                      "type": "string",
                      "enum": [
                        "TB",
                        "LR"
                      ]
                    }
                  },
                  "required": [
                    "type",
                    "ids",
                    "direction"
                  ]
                }
              ]
            }
          },
          "reason": {
            "type": "string",
            "minLength": 1,
            "maxLength": 500
          }
        },
        "required": [
          "ops",
          "reason"
        ]
      }
    }
    auto_layoutAction

    Arranges shapes into a clean layered diagram using the arrows as the flow: connected shapes are pulled into ordered rows, both axes are repositioned, layers are centered, and gaps are made uniform. Omit ids to tidy the whole active scene. ALWAYS call this after creating a multi-shape diagram from scratch, before telling the human it is finished - shapes placed by coordinate alone end up scattered and export badly.

    View tool JSON
    {
      "name": "auto_layout",
      "kind": "act",
      "impl": "imperative",
      "description": "Arranges shapes into a clean layered diagram using the arrows as the flow: connected shapes are pulled into ordered rows, both axes are repositioned, layers are centered, and gaps are made uniform. Omit ids to tidy the whole active scene. ALWAYS call this after creating a multi-shape diagram from scratch, before telling the human it is finished - shapes placed by coordinate alone end up scattered and export badly.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "ids": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "uniqueItems": true
          },
          "direction": {
            "type": "string",
            "enum": [
              "TB",
              "LR"
            ],
            "default": "TB"
          }
        }
      }
    }
    undoAction

    Reverts the last committed human or agent change on the active canvas and returns the current scene.

    View tool JSON
    {
      "name": "undo",
      "kind": "act",
      "impl": "imperative",
      "description": "Reverts the last committed human or agent change on the active canvas and returns the current scene.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      }
    }
    redoAction

    Re-applies the last change undone by undo, on the active canvas, and returns the current scene.

    View tool JSON
    {
      "name": "redo",
      "kind": "act",
      "impl": "imperative",
      "description": "Re-applies the last change undone by undo, on the active canvas, and returns the current scene.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      }
    }
    get_historyAnswer

    Returns the recent log of agent-applied changes on the active canvas (change ID, reason, operation count, time), newest first. Pass a changeId to revert_change to jump straight back to the scene immediately before that change.

    View tool JSON
    {
      "name": "get_history",
      "kind": "answer",
      "impl": "imperative",
      "description": "Returns the recent log of agent-applied changes on the active canvas (change ID, reason, operation count, time), newest first. Pass a changeId to revert_change to jump straight back to the scene immediately before that change.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      }
    }
    revert_changeAction

    Restores the canvas to its exact state immediately before the given changeId (from get_history or an earlier tool result) without requiring any later change to be undone first. This is a new undoable step, not a history rewrite - undo can still step back through it afterwards.

    View tool JSON
    {
      "name": "revert_change",
      "kind": "act",
      "impl": "imperative",
      "description": "Restores the canvas to its exact state immediately before the given changeId (from get_history or an earlier tool result) without requiring any later change to be undone first. This is a new undoable step, not a history rewrite - undo can still step back through it afterwards.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "changeId": {
            "type": "string",
            "minLength": 1
          }
        },
        "required": [
          "changeId"
        ]
      }
    }
    set_selectionAction

    Selects the given element IDs on the active canvas, exactly as if the human had clicked them, so a later reference ("these three") is visible to the human as a highlight. Pass an empty array to clear the selection. Never changes canvas content.

    View tool JSON
    {
      "name": "set_selection",
      "kind": "act",
      "impl": "imperative",
      "description": "Selects the given element IDs on the active canvas, exactly as if the human had clicked them, so a later reference (\"these three\") is visible to the human as a highlight. Pass an empty array to clear the selection. Never changes canvas content.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "ids": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "uniqueItems": true
          }
        },
        "required": [
          "ids"
        ]
      }
    }
    focus_viewportAction

    Pans and zooms the human's view to fit the given element IDs, or the whole scene if omitted, so whatever the agent just built or is discussing is actually on screen. Purely a camera move - never changes canvas content.

    View tool JSON
    {
      "name": "focus_viewport",
      "kind": "act",
      "impl": "imperative",
      "description": "Pans and zooms the human's view to fit the given element IDs, or the whole scene if omitted, so whatever the agent just built or is discussing is actually on screen. Purely a camera move - never changes canvas content.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "ids": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "uniqueItems": true
          },
          "padding": {
            "type": "number",
            "minimum": 0,
            "maximum": 400,
            "default": 90
          },
          "zoom": {
            "type": "number",
            "minimum": 0.2,
            "maximum": 3,
            "description": "Fixed zoom level. Omit to auto-fit the target bounds."
          }
        }
      }
    }
    fit_labelAction

    Resizes a text element's box to exactly fit its rendered label with no clipping, fixing what get_text_overflow reports instead of guessing new width/height. No-op if it already fits.

    View tool JSON
    {
      "name": "fit_label",
      "kind": "act",
      "impl": "imperative",
      "description": "Resizes a text element's box to exactly fit its rendered label with no clipping, fixing what get_text_overflow reports instead of guessing new width/height. No-op if it already fits.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "minLength": 1
          }
        },
        "required": [
          "id"
        ]
      }
    }
    rename_canvasAction

    Renames a canvas by its stable ID. Does not activate or otherwise change it.

    View tool JSON
    {
      "name": "rename_canvas",
      "kind": "act",
      "impl": "imperative",
      "description": "Renames a canvas by its stable ID. Does not activate or otherwise change it.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "canvasId": {
            "type": "string",
            "minLength": 1
          },
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 60
          }
        },
        "required": [
          "canvasId",
          "name"
        ]
      }
    }
    delete_canvasSensitive Action

    Permanently deletes a canvas by its stable ID along with its saved elements. Cannot delete the only remaining canvas. If the deleted canvas was active, switches to another one automatically - call get_scene after.

    View tool JSON
    {
      "name": "delete_canvas",
      "kind": "transact",
      "impl": "imperative",
      "description": "Permanently deletes a canvas by its stable ID along with its saved elements. Cannot delete the only remaining canvas. If the deleted canvas was active, switches to another one automatically - call get_scene after.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "canvasId": {
            "type": "string",
            "minLength": 1
          }
        },
        "required": [
          "canvasId"
        ]
      }
    }
    import_diagramAction

    Parses a mermaid flowchart (node shapes [rect] {diamond} (ellipse), --> / --- edges, optional |edge labels|) and builds it on the active canvas as real shapes, captions, and arrows, automatically laid out with the same engine auto_layout uses. Far more reliable than placing many shapes by hand-picked coordinate for anything resembling a flow, process, or org chart. Up to 40 nodes and 80 edges per call.

    View tool JSON
    {
      "name": "import_diagram",
      "kind": "act",
      "impl": "imperative",
      "description": "Parses a mermaid flowchart (node shapes [rect] {diamond} (ellipse), --> / --- edges, optional |edge labels|) and builds it on the active canvas as real shapes, captions, and arrows, automatically laid out with the same engine auto_layout uses. Far more reliable than placing many shapes by hand-picked coordinate for anything resembling a flow, process, or org chart. Up to 40 nodes and 80 edges per call.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "mermaid": {
            "type": "string",
            "minLength": 1,
            "maxLength": 8000
          },
          "reason": {
            "type": "string",
            "minLength": 1,
            "maxLength": 500
          }
        },
        "required": [
          "mermaid",
          "reason"
        ]
      }
    }
    get_commentsAnswer

    Returns notes the human pinned to specific areas of the active canvas - each with its text, the element IDs it was left on, and its canvas-space bounds. This is how the human points at a spot and asks for something there instead of describing it in chat. Check this, act on anything relevant, then call resolve_comment so it disappears once handled.

    View tool JSON
    {
      "name": "get_comments",
      "kind": "answer",
      "impl": "imperative",
      "description": "Returns notes the human pinned to specific areas of the active canvas - each with its text, the element IDs it was left on, and its canvas-space bounds. This is how the human points at a spot and asks for something there instead of describing it in chat. Check this, act on anything relevant, then call resolve_comment so it disappears once handled.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      }
    }
    resolve_commentAction

    Removes a comment by ID once you have acted on it, or decided no action is needed - it disappears from the canvas for the human. Call get_comments first for valid IDs.

    View tool JSON
    {
      "name": "resolve_comment",
      "kind": "act",
      "impl": "imperative",
      "description": "Removes a comment by ID once you have acted on it, or decided no action is needed - it disappears from the canvas for the human. Call get_comments first for valid IDs.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "commentId": {
            "type": "string",
            "minLength": 1
          }
        },
        "required": [
          "commentId"
        ]
      }
    }