📄️ list_projects
List the DEON projects the caller can access. Returns each project id, name, and last-updated time. Use a project id with get_project or the canvas tools.
📄️ get_project
Read a project kinds, parentId (direct children of one container), bbox (items intersecting a canvas rectangle) and textContains (case-insensitive) combine with AND; offset/limit page through the result (default 200 items), which reports total and hasMore. By default each item has id, kind, position (relative to its container), size (plus estimatedSize, the box the clients draw, for a label that grows with its text) and plain text cut to 200 characters (textTruncated marks a cut). fields picks others: style (fillColor, backgroundColor, strokeColor, strokeThickness, textColor, fontSize, fontFamily, horizontalTextAlignment, verticalTextAlignment, shapeType), a shape's cornerRadius (round-corner rectangles, world units) and adjustmentValues, connector lineType/start/end, zIndex (stacking order in the container, 0 = back-most), autoSize, parentId, angle, fileId, fullText (no cut), html (stored markup), or all. Item ids are stable, so after a write re-fetch only what changed, not the whole board. Ids feed updateitemproperty, styleitem, arrangeitem, deleteitem and connectitems.
📄️ update_project
Change project-level settings #F2F2F2, #E6E6E6, #B4B4B4, #808080, #404040, #000000 (greys, light to black), #E6FCFC, #E6F1FC, #EFE6F2, #FAE3ED, #FCF9DC, #E4F5E6 (pastel cyan, blue, purple, pink, yellow, green). Any other hex color works too, e.g. "#FFFFFF" for white. Colors are hex strings only - "#RRGGBB" (e.g. "#3B82F6"), or "#AARRGGBB" for alpha (alpha first). rgb()/rgba(), hsl() and named colors are rejected. get_project returns the current name and backgroundColor.
📄️ find_item
Resolve a canvas item id to the project that contains it — use this when you have an item id (e.g. one pasted by the user) but no project id, before calling updateitemproperty, styleitem, deleteitem, or connectitems. Returns the owning project plus the item with every getproject field (style, zIndex, autoSize, connector ends, ...). Pass projectId to check that one project; otherwise the caller's projects are searched, most recently updated first.
📄️ create_item
Create a text item "height" wraps at size.width and grows down - use it for running text of unknown length; "width" is one line that grows right at a fixed size.height; "both" is one line that grows freely (size is ignored); "none" is a fixed size.width x size.height box that clips text that does not fit - the user only sees a red overflow handle when they select the label. A sticky never auto-sizes. Without autoSize a label follows size [{itemId, code, message}] for text cut off by its box (TEXTHEIGHTTOOSMALL), text running into other text (TEXTOVERLAP), text that cannot be read on what is behind it (LOWCONTRAST), text running past the shape it starts on (OUTSIDEPARENTSHAPE) and text a new shape hides (TEXTCOVERED). The write happened; fix what they name before reporting the work as done.
📄️ create_items
Create many items and the connectors between them in one call. Preferred way to build a diagram or a board section. For a single item the single tools remain. Each entry has a kind - label, sticky, shape, connector or image - and the fields of the matching single tool (createitem, createshape, connectitems, uploadimage; a connector's line type is lineType). Name entries with ref and attach connectors with source/target {"ref" "..."} - no round trip for ids. Items are created in entry order, connectors after all of them. The whole batch is checked first and created as one change [{itemId, code, message}] for text cut off by its box (TEXTHEIGHTTOOSMALL), text running into other text (TEXTOVERLAP), text that cannot be read on what is behind it (LOWCONTRAST), text running past the shape it starts on (OUTSIDEPARENTSHAPE) and text a new shape hides (TEXTCOVERED). The write happened; fix what they name before reporting the work as done.
📄️ create_shape
Place a shape on a project canvas. shape comes from six groups every corner of a RoundedRectangle, the top two of TwoSameSideRoundCornerRectangle, top left and bottom right of TwoDiagonalRoundCornerRectangle, the round corner of OneRoundCornerRectangle and OneSnipOneRoundCornerRectangle; other shapes reject it. It is capped at half the shorter side. A later size change scales the corners with the shape - send cornerRadius again after resizing to keep them. Colors are hex strings only - "#RRGGBB" (e.g. "#3B82F6"), or "#AARRGGBB" for alpha (alpha first). rgb()/rgba(), hsl() and named colors are rejected. New items are drawn on top of existing ones; to put one behind the rest (e.g. a backdrop) call arrangeitem with position "back". Returns the new item id. To recolor it later use styleitem. The result may carry warnings: [{itemId, code, message}] for text cut off by its box (TEXTHEIGHTTOOSMALL), text running into other text (TEXTOVERLAP), text that cannot be read on what is behind it (LOWCONTRAST), text running past the shape it starts on (OUTSIDEPARENTSHAPE) and text a new shape hides (TEXTCOVERED). The write happened; fix what they name before reporting the work as done.
📄️ connect_items
Draw a connector (line/arrow) between two existing items. Defaults to a straight line with an arrow at the end. Connector or arrow shape? connectitems draws a thin line/arrow attached to two items that follows them when they move - use it for relationships and flow edges. A block arrow shape (createshape, e.g. RightArrow) is a standalone filled area, not attached to anything - use it between process steps, as a direction cue, callout or header, and style it like any shape (fillColor, strokeColor, a text label on top). Colors are hex strings only - "#RRGGBB" (e.g. "#3B82F6"), or "#AARRGGBB" for alpha (alpha first). rgb()/rgba(), hsl() and named colors are rejected. Returns the new connector id.
📄️ style_item
Change an item's appearance with friendly hex colors; the fields are mapped to the right property for the item type. By type - label/sticky fillColor, strokeColor, strokeThickness; connector [{itemId, code, message}] for text cut off by its box (TEXTHEIGHTTOOSMALL), text running into other text (TEXTOVERLAP), text that cannot be read on what is behind it (LOWCONTRAST), text running past the shape it starts on (OUTSIDEPARENTSHAPE) and text a new shape hides (TEXTCOVERED). The write happened; fix what they name before reporting the work as done.
📄️ update_item_property
Set one property of an item to a value, using the friendly REST property names from getdatamodel (e.g. "text", "fontSize", "fillColor", "strokeColor", "angle", or "position"={x,y} / "size"={width,height}). Keys inside position/size are case-insensitive. Setting "size" on a label or sticky also pins its auto-size flags, so the new width is the width its text wraps at; pass height 0 to keep the height growing with the text. To change only how a label grows, set "autoSize" ("none" | "width" | "height" | "both") or "isAutoSizeWidth" / "isAutoSizeHeight" (true/false) "height" wraps at size.width and grows down - use it for running text of unknown length; "width" is one line that grows right at a fixed size.height; "both" is one line that grows freely (size is ignored); "none" is a fixed size.width x size.height box that clips text that does not fit - the user only sees a red overflow handle when they select the label. A sticky never auto-sizes. Setting backgroundColor or fillColor to null (or "#00000000") removes the fill. "cornerRadius" of a round-corner shape is in world units and is converted at the shape's current size - set it after "size", not before. "text" of a label or sticky ` for each line, / with (not nested), , /, /, , and with font-weight, font-styleunderline, color and background-color (#RRGGBB). The whole text has one fontSize and fontFamily - span font-size, headings and other tags are rejected. The stored form getproject returns as html (...) is accepted too. Colors are hex strings only - "#RRGGBB" (e.g. "#3B82F6"), or "#AARRGGBB" for alpha (alpha first). rgb()/rgba(), hsl() and named colors are rejected. The item type is resolved automatically; for items other than labels and stickies, passing itemType skips the lookup. The result may carry warnings: [{itemId, code, message}]` for text cut off by its box (TEXTHEIGHTTOOSMALL), text running into other text (TEXTOVERLAP), text that cannot be read on what is behind it (LOWCONTRAST), text running past the shape it starts on (OUTSIDEPARENTSHAPE) and text a new shape hides (TEXT_COVERED). The write happened; fix what they name before reporting the work as done.
📄️ delete_item
Remove an item from a project by its id.
📄️ arrange_item
Change an item's stacking order (z-order) within its container. Items are drawn in order, so a new item covers everything created before it. position: "front" (above all siblings), "back" (behind all siblings - e.g. a backdrop shape), "forward" / "backward" (one step). getproject returns each item's zIndex with fields ["zIndex"] (0 = back-most within its container). To recolor the whole canvas use updateproject instead of a backdrop.
📄️ upload_image
Add an image to a project canvas from either base64 bytes (imageBase64, raw or a data JPEG, PNG, GIF, WebP, read from the bytes; at most 25 MB. Returns the new image item id.
📄️ get_image_data
Download the bytes of an image and return them as an image. Identify it by itemId (an image item on the canvas - its file id is resolved for you) or by a raw fileId. Set thumbnail=true for the smaller preview (type2) instead of the original (type1).
📄️ render_view
Render part of a board as an image, exactly as the DEON web client draws it, so you can check what you built. Pass itemIds (the items you just created or changed; the image frames their combined bounds), or a world bbox, or neither for the whole board. The result is the image plus JSON create items, render them, fix what looks wrong, render the fixed item alone.
📄️ retrieve_knowledge
Semantic search over a project's indexed knowledge. Returns an answer (when post-processing is enabled) and source citations with relevance scores. Use to ground responses in the actual content of a DEON project. Requires the project to have been analysed by you, under your currently selected tenant — knowledge is scoped to (user, tenant, project), not to the project alone. When there are no citations the result carries an indexed flag saying whether that means 'not analysed' or 'analysed, but no match for this query'.
📄️ knowledge_status
Whether a project's knowledge has been indexed and is retrievable by you — the precondition for retrieveknowledge. Knowledge is scoped to (user, tenant, project): a project analysed by a colleague, or analysed while a different tenant was selected, is not retrievable for you even though the project itself is readable. Call this when retrieveknowledge returns nothing, to tell 'not analysed' apart from 'no match'.
📄️ get_data_model
Return a reference for DEON canvas items: item types, the coordinate system, per-type fields and value shapes, and the shape catalogue - every shape name by group, what the non-obvious ones look like and which way each arrow points. Call this when unsure how to create or update an item, or which shape to pick. Includes the server build; if tools described here are missing from your tool list, the client's tool cache is stale - ask the user to restart the client.