bertus37987.github.io
A shared infinite whiteboard for people and browser agents.
First seen 2026-11-05 · Last seen 2026-11-05 · Source: webmcp.com
Answer 1 · Act 7 · Transact 0 · Score: Not yet scored
Tool inspector
apply_whiteboard_changes
Create or edit movable canvas objects during the currently claimed human turn: rich text, notes, callouts, agent-only tables, artboards, highlights, filled shapes, flowchart shapes, routed connectors, icons, smoothed free-hand paths, temporary red agent comments, groups, auto layout, explanation steps and guided-explanation navigation. Requires that turn leaseToken. The whole batch is validated first: an id collision or a missing target applies nothing. The answer returns lintIssues for what you just drew: fix overflowing text, overlaps, unlabelled controls and low contrast in the same turn. Changes stay a proposal until the human accepts them.
Page: /smooth-whiteboard-webmcp/
Input schema
| Property | Type | Required | Description |
|---|---|---|---|
leaseToken |
string | yes | The leaseToken returned when this human turn was claimed. Required: writes without it are rejected. |
baseRevision |
number | no | Content revision returned by inspect_whiteboard; rejected when the canvas changed meanwhile. |
operations |
array | yes | — |
Raw JSON schema
{
"type": "object",
"required": [
"operations",
"leaseToken"
],
"properties": {
"leaseToken": {
"type": "string",
"description": "The leaseToken returned when this human turn was claimed. Required: writes without it are rejected."
},
"baseRevision": {
"type": "number",
"description": "Content revision returned by inspect_whiteboard; rejected when the canvas changed meanwhile."
},
"operations": {
"type": "array",
"minItems": 1,
"maxItems": 160,
"items": {
"type": "object",
"required": [
"type"
],
"description": "One canvas operation. Creation operations need x/y (plus width/height or points); mutation operations need the id or ids of objects that already exist on the board. To draw something real, send create_path with SVG path data in \"d\" plus the x/y/width/height box to fit it into — curves and arcs are supported and the result is ordinary editable geometry. Draw a symbol you need more than once with define_symbol { name, d } and then stamp it with create_icon { name }, rather than repeating the same path. Use create_icon for a stock symbol, create_annotation for a brace, speech bubble, arc or measured span, create_callout for a labelled box, auto_layout and fit_to_content instead of hand-computed coordinates, and present_step to move the human through a guided explanation. Nothing may straddle existing work, and nothing in one batch may straddle anything else in it: ask inspect_whiteboard with \"needed\" for a free origin before placing a block, and when something is in the way either place elsewhere or move it aside with translate in this same call — never draw a second copy of it.",
"properties": {
"type": {
"type": "string",
"enum": [
"create_text",
"create_note",
"create_table",
"create_frame",
"create_highlight",
"highlight_text",
"create_shape",
"create_arrow",
"create_stroke",
"create_polygon",
"create_path",
"create_annotation",
"create_callout",
"create_icon",
"define_symbol",
"create_agent_marker",
"translate",
"resize",
"update_text",
"update_points",
"update_style",
"set_locked",
"reorder",
"connect",
"align",
"distribute",
"auto_layout",
"fit_to_content",
"duplicate",
"group",
"ungroup",
"set_parent",
"update_artboard",
"set_explanation_sequence",
"present_step",
"delete"
]
},
"id": {
"type": "string",
"description": "Target id for update_text/update_points/resize/update_artboard, otherwise the id of the object to create."
},
"ids": {
"type": "array",
"items": {
"type": "string"
},
"description": "Existing element or group ids to mutate."
},
"groupId": {
"type": "string"
},
"parentId": {
"type": "string"
},
"anchorId": {
"type": "string",
"description": "create_callout: the element the callout points at with a leader line."
},
"name": {
"type": "string",
"description": "create_icon: which symbol to stamp. Built in are check, close, plus, minus, menu, search, user, heart, arrow, star, bulb, question, warning, clock, server, database, cloud, browser, mobile, lock, key, file, folder, gear, mail, link, chart, shield, globe, terminal; anything you defined yourself is listed as \"symbols\" by inspect_whiteboard. define_symbol: the name to save your drawing under."
},
"semanticRole": {
"type": "string"
},
"locked": {
"type": "boolean"
},
"x": {
"type": "number"
},
"y": {
"type": "number"
},
"width": {
"type": "number"
},
"height": {
"type": "number"
},
"dx": {
"type": "number"
},
"dy": {
"type": "number"
},
"text": {
"type": "string"
},
"title": {
"type": "string"
},
"fontSize": {
"type": "number"
},
"fontFamily": {
"type": "string",
"enum": [
"sans",
"serif",
"mono",
"handwriting"
]
},
"fontWeight": {
"type": "number",
"enum": [
400,
500,
600,
700
]
},
"fontStyle": {
"type": "string",
"enum": [
"normal",
"italic"
]
},
"textDecoration": {
"type": "string",
"enum": [
"none",
"underline",
"line-through"
]
},
"textAlign": {
"type": "string",
"enum": [
"left",
"center",
"right"
]
},
"blockStyle": {
"type": "string",
"enum": [
"body",
"heading-1",
"heading-2",
"heading-3",
"bullet",
"numbered",
"check",
"quote",
"code",
"math"
]
},
"rows": {
"type": "number"
},
"columns": {
"type": "number",
"description": "create_table column count, or the grid width for auto_layout."
},
"headers": {
"type": "array",
"items": {
"type": "string"
}
},
"cells": {
"type": "array",
"items": {
"type": "string"
}
},
"kind": {
"type": "string",
"enum": [
"rectangle",
"ellipse",
"diamond",
"triangle",
"brace",
"bubble",
"arc",
"dimension"
],
"description": "create_shape takes rectangle, ellipse, diamond or triangle; diamond and triangle become editable polygons. create_annotation takes brace (a curly brace calling out a span), bubble (a speech bubble with a tail), arc (a bow over a span) or dimension (a measured line with end ticks); each fills its x/y/width/height box, points the way \"direction\" says, and labels itself with \"text\"."
},
"filled": {
"type": "boolean"
},
"closed": {
"type": "boolean"
},
"size": {
"type": "number"
},
"color": {
"type": "string",
"description": "Hex colour. Ink by default; use designSystem.palette.accents when the colour distinguishes branches, categories, series or a status."
},
"backgroundColor": {
"type": "string"
},
"strokeWidth": {
"type": "number"
},
"fillColor": {
"type": "string"
},
"fillOpacity": {
"type": "number"
},
"radius": {
"type": "number"
},
"opacity": {
"type": "number"
},
"padding": {
"type": "number"
},
"highlightColor": {
"type": "string"
},
"renderStyle": {
"type": "string",
"enum": [
"clean",
"sketch"
],
"description": "Overrides the automatic choice, which follows the human's Appearance setting (settings.cleanStyle) and is always clean on artboards. Set it only when one element should deliberately differ from the rest of the board."
},
"artboardPreset": {
"type": "string",
"enum": [
"desktop",
"tablet",
"mobile",
"custom"
]
},
"preset": {
"type": "string",
"enum": [
"desktop",
"tablet",
"mobile",
"custom"
]
},
"clipContent": {
"type": "boolean"
},
"lineStyle": {
"type": "string",
"enum": [
"solid",
"dashed",
"dotted"
]
},
"arrowHeads": {
"type": "string",
"enum": [
"end",
"start",
"both"
]
},
"direction": {
"type": "string",
"enum": [
"front",
"back",
"row",
"column",
"grid",
"left",
"right",
"up",
"down"
],
"description": "reorder takes front/back; auto_layout takes row/column/grid; create_annotation takes left/right/up/down for the side the brace tip, bubble tail or arc points to."
},
"route": {
"type": "string",
"enum": [
"straight",
"orthogonal",
"curved"
],
"description": "Connector path for connect and update_style. Use orthogonal for flowcharts and curved for mindmaps so edges do not cross their own nodes."
},
"d": {
"type": "string",
"description": "SVG path data (M L H V C S Q T A Z, absolute or relative). create_path scales it into the x/y/width/height box and keeps its aspect ratio, centring what is left over — so a square drawing in a wide box becomes a centred square, not a stretched one. Author the path in the proportions you want it to end up in. This is the way to draw something that is not a rectangle. define_symbol saves it as a reusable symbol, scaled to a unit box. create_icon can take it directly for a one-off symbol that needs no name."
},
"smooth": {
"type": "boolean",
"description": "create_path: smooth the points into a drawn-looking curve (default true). Ignored when d is given."
},
"bow": {
"type": "number",
"description": "create_path with exactly two points: bend the line into an arc or brace by this many world units."
},
"mode": {
"type": "string",
"enum": [
"container",
"text"
],
"description": "fit_to_content: resize the container around its text, or re-measure the text itself."
},
"align": {
"type": "string",
"enum": [
"start",
"center",
"end"
],
"description": "auto_layout: cross-axis alignment inside a row."
},
"sequenceId": {
"type": "string",
"description": "present_step: which explanation sequence to show; defaults to the first one."
},
"index": {
"type": "number",
"description": "present_step: zero-based step to put on the human screen."
},
"fromId": {
"type": "string"
},
"toId": {
"type": "string"
},
"label": {
"type": "string"
},
"alignment": {
"type": "string",
"enum": [
"left",
"center-x",
"right",
"top",
"center-y",
"bottom"
]
},
"axis": {
"type": "string",
"enum": [
"horizontal",
"vertical"
]
},
"gap": {
"type": "number"
},
"from": {
"type": "object",
"required": [
"x",
"y"
],
"properties": {
"x": {
"type": "number"
},
"y": {
"type": "number"
}
}
},
"to": {
"type": "object",
"required": [
"x",
"y"
],
"properties": {
"x": {
"type": "number"
},
"y": {
"type": "number"
}
}
},
"points": {
"type": "array",
"items": {
"type": "object",
"required": [
"x",
"y"
],
"properties": {
"x": {
"type": "number"
},
"y": {
"type": "number"
},
"pressure": {
"type": "number"
},
"time": {
"type": "number"
}
}
}
},
"sequence": {
"type": "object",
"required": [
"id",
"title",
"steps"
],
"properties": {
"id": {
"type": "string"
},
"title": {
"type": "string"
},
"steps": {
"type": "array",
"maxItems": 60,
"items": {
"type": "object",
"required": [
"id",
"title",
"focusElementIds",
"revealElementIds"
],
"properties": {
"id": {
"type": "string"
},
"title": {
"type": "string"
},
"body": {
"type": "string"
},
"focusElementIds": {
"type": "array",
"items": {
"type": "string"
}
},
"revealElementIds": {
"type": "array",
"items": {
"type": "string"
}
}
}
}
}
}
}
}
}
}
}
}
Similar websites
econsor.de
German digital agency building portals, e-commerce sites and online marketing, combining strategy, design and AI to grow clients' visibility and customer base.
inkframe-eta.vercel.app
Browser-native Elah video editor for 9:16 and 16:9 exports
agentdesk-demo.vercel.app
Meridian Ops
eworker.ca
E-Worker is business infrastructure powered by AI, with focused apps and connected business work.