io.datadef/mcp
REMOTE · DATADEF.IO
Generate, edit, and export data-architecture diagrams from your AI. Column lineage, PNG in chat.
Available components
Last scanned (2 hours ago)
Scores higher than 99% of remote servers
Reachable. Last reached 5 Nov 2026.
Category Data and Analytics
How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →
Endpoint Security94
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- Authorisation is enforced on tool calls, advertised via RFC 9728 protected-resource metadata. Discovery is public, which costs nothing: no tool can be invoked without a token. View diagnostics → Pass
- HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
- The HSTS (Strict-Transport-Security) header is present. View diagnostics → Pass
- DNSSEC check failed: this domain isn't protected by DNSSEC. See how to fix → View diagnostics → Fail
- The authorisation server offers only Dynamic Client Registration (RFC 7591), which MCP 2026-07-28 deprecated in favour of Client ID Metadata Documents. View diagnostics → Partial
Transport & Reachability100
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
Schema Quality & AI Usability79
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 9730 tokens (~249/item across 39 items; 39 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management100
- No destabilizing schema changes in the last 30 days.Pass
Tool Coverage94
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 82% of tool parameters carry a description.Partial
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- All 2 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
- An AI judge read all 40 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities60
- Spec-recency check failed: implements MCP spec 2025-06-18; the latest is 2026-07-28. See how to fix → Fail
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 29 Sept 26 0
- The server rewrote its instructions, which are the text every model session reads security
- New tool “canvas_batch”, which the server declares destructive security
- New tool “canvas_remove_lineage”, which the server declares destructive security
- Tool “canvas_add_flow_arrow” rewrote its description, which is the text the model reads security
- Tool “canvas_add_lineage” rewrote its description, which is the text the model reads security
- Tool “canvas_add_nodes” rewrote its description, which is the text the model reads security
- Tool “canvas_add_region” rewrote its description, which is the text the model reads security
- Tool “canvas_add_shape” rewrote its description, which is the text the model reads security
- Tool “canvas_add_standalone_node” rewrote its description, which is the text the model reads security
- Tool “canvas_add_text” rewrote its description, which is the text the model reads security
- Tool “canvas_align_nodes” rewrote its description, which is the text the model reads security
- Tool “canvas_collapse_nodes” rewrote its description, which is the text the model reads security
- Tool “canvas_connect_nodes” rewrote its description, which is the text the model reads security
- Tool “canvas_describe_canvas” rewrote its description, which is the text the model reads security
- Tool “canvas_disconnect_nodes” rewrote its description, which is the text the model reads security
- Tool “canvas_group_nodes” rewrote its description, which is the text the model reads security
- Tool “canvas_inspect_nodes” rewrote its description, which is the text the model reads security
- Tool “canvas_layout_canvas” rewrote its description, which is the text the model reads security
- Tool “canvas_measure_canvas” rewrote its description, which is the text the model reads security
- Tool “canvas_move_nodes” rewrote its description, which is the text the model reads security
- Tool “canvas_move_to_group” rewrote its description, which is the text the model reads security
- Tool “canvas_remove_nodes” rewrote its description, which is the text the model reads security
- Tool “canvas_replace_node” rewrote its description, which is the text the model reads security
- Tool “canvas_resize_nodes” rewrote its description, which is the text the model reads security
- Tool “canvas_search_icons” rewrote its description, which is the text the model reads security
- Tool “canvas_set_columns” rewrote its description, which is the text the model reads security
- Tool “canvas_suggest_simplifications” rewrote its description, which is the text the model reads security
- Tool “canvas_update_edges” rewrote its description, which is the text the model reads security
- Tool “canvas_update_nodes” rewrote its description, which is the text the model reads security
- Tool “canvas_validate_canvas” rewrote its description, which is the text the model reads security
- Tool “create_blank_diagram” rewrote its description, which is the text the model reads security
- Tool “create_diagram” rewrote its description, which is the text the model reads security
- Tool “edit_diagram” rewrote its description, which is the text the model reads security
- Tool “export_diagram” rewrote its description, which is the text the model reads security
- Tool “get_design_guide” rewrote its description, which is the text the model reads security
- Tool “get_diagram” rewrote its description, which is the text the model reads security
- Tool “list_diagrams” rewrote its description, which is the text the model reads security
- Tool “canvas_add_flow_arrow” no longer declares itself destructive security
- Tool “canvas_add_lineage” no longer declares itself destructive security
- Tool “canvas_add_nodes” no longer declares itself destructive security
- Tool “canvas_add_region” no longer declares itself destructive security
- Tool “canvas_add_shape” no longer declares itself destructive security
- Tool “canvas_add_standalone_node” no longer declares itself destructive security
- Tool “canvas_add_text” no longer declares itself destructive security
- Tool “canvas_connect_nodes” no longer declares itself destructive security
- Tool “canvas_group_nodes” no longer declares itself destructive security
- Schema quality: 135 → 249 ▼ functional
- Server version: 1.0.0 → 1.1.0 functional
- New tool “canvas_view” functional
- “canvas_group_nodes” added an optional parameter “color” cosmetic
- “canvas_layout_canvas” added an optional parameter “direction” cosmetic
- “canvas_layout_canvas” added an optional parameter “fit” cosmetic
- “canvas_layout_canvas” added an optional parameter “mode” cosmetic
- “canvas_layout_canvas” added an optional parameter “spacing” cosmetic
- “canvas_layout_canvas” added an optional parameter “zone” cosmetic
- “canvas_remove_nodes” added an optional parameter “keepChildren” cosmetic
- “canvas_search_icons” added an optional parameter “queries” cosmetic
- “canvas_set_columns” added an optional parameter “mode” cosmetic
- “canvas_validate_canvas” added an optional parameter “scope” cosmetic
- “canvas_add_flow_arrow” reworded the description of “diagram_id” cosmetic
- “canvas_add_lineage” reworded the description of “diagram_id” cosmetic
- “canvas_add_nodes” reworded the description of “diagram_id” cosmetic
- “canvas_add_region” reworded the description of “diagram_id” cosmetic
- “canvas_add_shape” reworded the description of “diagram_id” cosmetic
- “canvas_add_standalone_node” reworded the description of “diagram_id” cosmetic
- “canvas_add_text” reworded the description of “diagram_id” cosmetic
- “canvas_align_nodes” reworded the description of “diagram_id” cosmetic
- “canvas_collapse_nodes” reworded the description of “diagram_id” cosmetic
- “canvas_connect_nodes” reworded the description of “diagram_id” cosmetic
- “canvas_describe_canvas” reworded the description of “diagram_id” cosmetic
- “canvas_disconnect_nodes” reworded the description of “diagram_id” cosmetic
- “canvas_group_nodes” reworded the description of “diagram_id” cosmetic
- “canvas_group_nodes” reworded the description of “family” cosmetic
- “canvas_group_nodes” reworded the description of “nodes” cosmetic
- “canvas_group_nodes” reworded the description of “parentGroup” cosmetic
- “canvas_inspect_nodes” reworded the description of “diagram_id” cosmetic
- “canvas_layout_canvas” reworded the description of “diagram_id” cosmetic
- “canvas_layout_canvas” reworded the description of “full” cosmetic
- “canvas_measure_canvas” reworded the description of “diagram_id” cosmetic
- “canvas_move_nodes” reworded the description of “diagram_id” cosmetic
- “canvas_move_to_group” reworded the description of “diagram_id” cosmetic
- “canvas_move_to_group” reworded the description of “group” cosmetic
- “canvas_move_to_group” reworded the description of “nodes” cosmetic
- “canvas_remove_nodes” reworded the description of “diagram_id” cosmetic
- “canvas_remove_nodes” reworded the description of “nodes” cosmetic
- “canvas_replace_node” reworded the description of “diagram_id” cosmetic
- “canvas_replace_node” reworded the description of “keepColumns” cosmetic
- “canvas_resize_nodes” reworded the description of “diagram_id” cosmetic
- “canvas_search_icons” reworded the description of “diagram_id” cosmetic
- “canvas_search_icons” reworded the description of “limit” cosmetic
- “canvas_search_icons” reworded the description of “query” cosmetic
- “canvas_set_columns” reworded the description of “diagram_id” cosmetic
- “canvas_suggest_simplifications” reworded the description of “diagram_id” cosmetic
- “canvas_update_edges” reworded the description of “diagram_id” cosmetic
- “canvas_update_nodes” reworded the description of “diagram_id” cosmetic
- “canvas_validate_canvas” reworded the description of “diagram_id” cosmetic
- “edit_diagram” reworded the description of “diagram_id” cosmetic
- “edit_diagram” reworded the description of “include_image” cosmetic
- “canvas_search_icons” made “diagram_id” optional cosmetic
- “canvas_search_icons” made “query” optional cosmetic
- Tool “canvas_add_flow_arrow” changed its title: add flow arrow → Add a flow arrow cosmetic
- Tool “canvas_add_lineage” changed its title: add lineage → Record column lineage cosmetic
- Tool “canvas_add_nodes” changed its title: add nodes → Add nodes cosmetic
- Tool “canvas_add_region” changed its title: add region → Add a region cosmetic
- Tool “canvas_add_shape” changed its title: add shape → Add a shape cosmetic
- Tool “canvas_add_standalone_node” changed its title: add standalone node → Add one node at a fixed spot cosmetic
- Tool “canvas_add_text” changed its title: add text → Add a note cosmetic
- Tool “canvas_align_nodes” changed its title: align nodes → Align nodes by hand cosmetic
- Tool “canvas_collapse_nodes” changed its title: collapse nodes → Collapse nodes into one cosmetic
- Tool “canvas_connect_nodes” changed its title: connect nodes → Connect nodes cosmetic
- Tool “canvas_describe_canvas” changed its title: describe canvas → List every node (flat) cosmetic
- Tool “canvas_disconnect_nodes” changed its title: disconnect nodes → Remove edges cosmetic
- Tool “canvas_group_nodes” changed its title: group nodes → Create a zone cosmetic
- Tool “canvas_inspect_nodes” changed its title: inspect nodes → Inspect nodes in full cosmetic
- Tool “canvas_layout_canvas” changed its title: layout canvas → Lay out the diagram cosmetic
- Tool “canvas_measure_canvas” changed its title: measure canvas → Measure exact geometry cosmetic
- Tool “canvas_move_nodes” changed its title: move nodes → Move nodes by hand cosmetic
- Tool “canvas_move_to_group” changed its title: move to group → Move nodes into a zone cosmetic
- Tool “canvas_remove_nodes” changed its title: remove nodes → Remove nodes cosmetic
- Tool “canvas_replace_node” changed its title: replace node → Replace a node in place cosmetic
- Tool “canvas_resize_nodes” changed its title: resize nodes → Resize nodes by hand cosmetic
- Tool “canvas_search_icons” changed its title: search icons → Find vendor icon ids cosmetic
- Tool “canvas_set_columns” changed its title: set columns → Change a table's columns cosmetic
- Tool “canvas_suggest_simplifications” changed its title: suggest simplifications → Suggest simplifications cosmetic
- Tool “canvas_update_edges” changed its title: update edges → Update edges cosmetic
- Tool “canvas_update_nodes” changed its title: update nodes → Update nodes, zones and notes cosmetic
- Tool “canvas_validate_canvas” changed its title: validate canvas → Validate the diagram cosmetic
- Tool “edit_diagram” changed its title: Edit an existing diagram → Edit a diagram with Datadef's agent cosmetic
- Tool “get_diagram” changed its title: Read a diagram → Read a diagram, with a picture cosmetic
- 28 Sept 26 0
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 25 Sept 26 0
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 24 Sept 26 0
- Tool “create_diagram” rewrote its description, which is the text the model reads security
- 15 Sept 26 0
- Stability: 0.97 → pass security
- 26 Aug 26 0
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 22 Aug 26 0
- Tool “canvas_add_nodes” rewrote its description, which is the text the model reads security
- Tool “canvas_describe_canvas” rewrote its description, which is the text the model reads security
- Tool “canvas_group_nodes” rewrote its description, which is the text the model reads security
- Tool “create_blank_diagram” rewrote its description, which is the text the model reads security
- Tool “create_diagram” rewrote its description, which is the text the model reads security
- Tool “edit_diagram” rewrote its description, which is the text the model reads security
- Tool “export_diagram” rewrote its description, which is the text the model reads security
- Tool “get_design_guide” rewrote its description, which is the text the model reads security
- “create_diagram” reworded the description of “detailed” cosmetic
- “create_diagram” reworded the description of “scope” cosmetic
- 17 Aug 26 0
- Stability: unverified → 0.03 ▲ functional
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 5 Nov 2026 · Probed https://datadef.io/mcp
TLS valid
Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .
| Subject | Issuer | Valid from | Valid until | Key | Signature | Serial |
|---|---|---|---|---|---|---|
| CN=datadef.io | CN=WE1,O=Google Trust Services,C=US | 19 Oct 2026 | 17 Jan 2027 | ECDSA 256 | ECDSA-SHA256 | c7474f2081df91e00e4f6dc79d570b8e |
| SANs: datadef.io, *.datadef.io | ||||||
| CN=WE1,O=Google Trust Services,C=US (CA) | CN=GTS Root R4,O=Google Trust Services LLC,C=US | 13 Dec 2023 | 20 Feb 2029 | ECDSA 256 | ECDSA-SHA384 | 7ff31977972c224a76155d13b6d685e3 |
| CN=GTS Root R4,O=Google Trust Services LLC,C=US (CA) | CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE | 15 Nov 2023 | 28 Jan 2028 | ECDSA 384 | SHA256-RSA | 7fe530bf331343bedd821610493d8a1b |
Background: What to check on a remote MCP endpoint →
DNSSEC insecure
Validation of datadef.io. — Not signed
| Zone | DS | Keys | Algorithms | Outcome |
|---|---|---|---|---|
| . | trust_anchor | 20326, 38696 | 8, 8 | Verified |
| io. | present | 38690 | 8 | Verified |
| datadef.io. | absent | Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation |
Authentication Enforced and verified
The endpoint asked for a token and published valid RFC 9728 metadata describing how to get one.
| Result | Enforced and verified |
|---|---|
| Enforced | On tool calls |
| HTTP status | 200 |
WWW-Authenticate challenge Bearer error="invalid_token", error_description="No authorization provided", resource_metadata="https://datadef.io/.well-known/oauth-protected-resource"
Bearer error="invalid_token", error_description="No authorization provided", resource_metadata="https://datadef.io/.well-known/oauth-protected-resource" | Header | Value |
|---|---|
| strict-transport-security | max-age=63072000; includeSubDomains |
| x-content-type-options | nosniff |
| referrer-policy | strict-origin-when-cross-origin |
| permissions-policy | camera=(), microphone=(), geolocation=(), browsing-topics=() |
Protected resource metadata
| Document | https://datadef.io/.well-known/oauth-protected-resource |
|---|---|
| Retrieved | Yes |
| Resource | https://datadef.io/mcp |
| Authorisation server | https://datadef.io |
Background: How OAuth 2.1 works in the 2026 MCP spec →
Transports 2 probes
| Transport | URL | Outcome | Status | Location |
|---|---|---|---|---|
| streamable-http | https://datadef.io/mcp | Verified | 200 | |
| http (plaintext) | http://datadef.io/mcp | HTTPS enforced | 301 | https://datadef.io/mcp |
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
canvas_add_flow_arrow Add a flow arrow ~220
When: Use after the final layout, where one arrow should stand for a bundle of identical flows (zone to zone). Draw one large labelled arrow SHAPE between two areas of the diagram — "ingest", "serve", "publish". It is a drawing, not a connection: it links nothing and moves with nothing. To connect nodes use canvas_connect_nodes; never replace existing edges with this. Position it in the gap between the two areas using canvas_measure_canvas. Batch: `arrows` (up to 12) takes a list; put every item in one call rather than one call per item. Operates on one Datadef diagram, named by diagram_id. Returns compact JSON: the ids it created, changed or removed, the diagram revision, a one-line summary and the next step. A viewer-role account is refused. Next: canvas_view to check the result.
| Name | Type | Req | Description |
|---|---|---|---|
| arrows | array | yes | – |
| diagram_id | string | yes | Diagram id, from list_diagrams, create_diagram or create_blank_diagram. |
No output schema declared.
No examples provided.
canvas_add_lineage Record column lineage ~187
When: Use to record which source columns produce which target columns. No line is drawn. Record column-level lineage: which source column produces which target column, and how. This is what makes the diagram queryable for impact analysis, so add it for every real transformation. canvas_remove_lineage undoes it. Batch: `links` (up to 100) takes a list; put every item in one call rather than one call per item. Operates on one Datadef diagram, named by diagram_id. Returns compact JSON: the ids it created, changed or removed, the diagram revision, a one-line summary and the next step. A viewer-role account is refused. Next: canvas_validate_canvas before you finish.
| Name | Type | Req | Description |
|---|---|---|---|
| diagram_id | string | yes | Diagram id, from list_diagrams, create_diagram or create_blank_diagram. |
| links | array | yes | – |
No output schema declared.
No examples provided.
canvas_add_nodes Add nodes ~230
When: Use to add components (tables, pipelines, sources, consumers, service icons), each placed in its zone with `group`. Add one or more nodes to the canvas. Batch every node you want in a single call. Positions are assigned by canvas_layout_canvas afterwards — never set them yourself. Batch: `nodes` (up to 40) takes a list; put every item in one call rather than one call per item. Operates on one Datadef diagram, named by diagram_id. Returns compact JSON: the ids it created, changed or removed, the diagram revision, a one-line summary and the next step. A viewer-role account is refused. If you have not already, call get_design_guide first: it carries Datadef's size, edge and zone standard, and diagrams built without it read poorly. Next: canvas_connect_nodes for the real flows, then canvas_layout_canvas once when the structure is complete.
| Name | Type | Req | Description |
|---|---|---|---|
| diagram_id | string | yes | Diagram id, from list_diagrams, create_diagram or create_blank_diagram. |
| nodes | array | yes | – |
No output schema declared.
No examples provided.
canvas_add_region Add a region ~241
When: Use after the final layout to mark nodes that belong together without moving them into a zone. Regions do not move with layout. Draw a labelled translucent area behind existing nodes to show they belong together, without reparenting them. Use this when the grouping is a reading aid rather than real containment, when areas would need to overlap, or when a node belongs to two ideas at once — canvas_group_nodes cannot express any of those because it moves nodes into the zone. Call canvas_measure_canvas first and size the region to enclose the nodes with roughly 24px of margin. Batch: `regions` (up to 12) takes a list; put every item in one call rather than one call per item. Operates on one Datadef diagram, named by diagram_id. Returns compact JSON: the ids it created, changed or removed, the diagram revision, a one-line summary and the next step. A viewer-role account is refused. Next: canvas_view to check the result.
| Name | Type | Req | Description |
|---|---|---|---|
| diagram_id | string | yes | Diagram id, from list_diagrams, create_diagram or create_blank_diagram. |
| regions | array | yes | – |
No output schema declared.
No examples provided.
canvas_add_shape Add a shape ~198
When: Use rarely: a pointer or highlight the user asked for. Never as a backdrop; zones are the containers. Place a rectangle, circle, arrow, or line as a visual annotation — a divider, a highlight. Shapes are drawings: they connect nothing (use canvas_connect_nodes for arrows between nodes) and they are not zones (use canvas_group_nodes). Batch: `shapes` (up to 20) takes a list; put every item in one call rather than one call per item. Operates on one Datadef diagram, named by diagram_id. Returns compact JSON: the ids it created, changed or removed, the diagram revision, a one-line summary and the next step. A viewer-role account is refused. Next: canvas_view to check the result.
| Name | Type | Req | Description |
|---|---|---|---|
| diagram_id | string | yes | Diagram id, from list_diagrams, create_diagram or create_blank_diagram. |
| shapes | array | yes | – |
No output schema declared.
No examples provided.
canvas_add_standalone_node Add one node at a fixed spot ~243
When: Use only when the user wants a node at a specific position, outside the automatic layout. Otherwise use canvas_add_nodes. Add a single data node at an exact position, without connecting it to anything. Use when the user wants something placed somewhere specific, or when you will wire it up yourself afterwards. For building out a connected diagram, canvas_add_nodes is better — it batches and lets layout position everything. Operates on one Datadef diagram, named by diagram_id. Returns compact JSON: the ids it created, changed or removed, the diagram revision, a one-line summary and the next step. A viewer-role account is refused. Next: canvas_view to check the result.
| Name | Type | Req | Description |
|---|---|---|---|
| description | string | – | – |
| diagram_id | string | yes | Diagram id, from list_diagrams, create_diagram or create_blank_diagram. |
| icon | string | – | Icon id from search_icons. |
| label | string | yes | – |
| technology | string | – | – |
| type | string | yes | – |
| x | number | – | Absolute x. Omit to place clear of the existing diagram. |
| y | number | – | Absolute y. |
No output schema declared.
No examples provided.
canvas_add_text Add a note ~259
When: Use for a note that tells the diagram's reader a decision, constraint or gotcha. Pass `anchor` (the node or zone it explains) and it is placed beside it, no coordinates needed. To edit a note's text use canvas_update_nodes. Add a text note: a caption, a callout, a note explaining a decision. Give `anchor` (the node or zone it explains) and the note is placed beside it, clear of other content, without coordinates. Use x/y only for a note that belongs to no particular element. Notes are annotations: they take no edges. To change an existing note's text use canvas_update_nodes. Batch: `texts` (up to 20) takes a list; put every item in one call rather than one call per item. Operates on one Datadef diagram, named by diagram_id. Returns compact JSON: the ids it created, changed or removed, the diagram revision, a one-line summary and the next step. A viewer-role account is refused. Next: canvas_view to check the result.
| Name | Type | Req | Description |
|---|---|---|---|
| diagram_id | string | yes | Diagram id, from list_diagrams, create_diagram or create_blank_diagram. |
| texts | array | yes | – |
No output schema declared.
No examples provided.
canvas_align_nodes Align nodes by hand ~198
When: Use only when the user asked for alignment that layout does not give. Align nodes to a shared edge or centre line, or space them evenly. Cleaner and far more reliable than computing coordinates by hand. Batch: `nodes` (up to 40) takes a list; put every item in one call rather than one call per item. Operates on one Datadef diagram, named by diagram_id. Returns compact JSON: the ids it created, changed or removed, the diagram revision, a one-line summary and the next step. A viewer-role account is refused. Next: canvas_view to check.
| Name | Type | Req | Description |
|---|---|---|---|
| diagram_id | string | yes | Diagram id, from list_diagrams, create_diagram or create_blank_diagram. |
| mode | string | yes | left/right/top/bottom align edges; center-* align centre lines; distribute-* space evenly between the outermost two. |
| nodes | array | yes | Node ids or labels. |
No output schema declared.
No examples provided.
canvas_batch Apply several canvas changes at once ~274
When: use whenever you would otherwise make several canvas_* write calls in a row, above all with tools that take one item per call: create every zone (group_nodes), convert many nodes (replace_node), set several tables' columns (set_columns). Eighteen zone creations or thirty-five replacements become one call and one save. Each operation is {"tool": "<canvas tool, with or without the canvas_ prefix>", "args": {<that tool's arguments, without diagram_id>}}. Operations run in order on the same diagram, so a later one can use what an earlier one created by its exact label (create a zone in operation 1, add nodes with that zone as their group in operation 2). All or nothing: if one operation fails, nothing is saved and the result names the failing operation. Write tools only; read with canvas_view. Returns compact JSON: one line per operation, the ids created, changed or removed, and the new revision. Next: canvas_layout_canvas once if the structure changed (or end the batch with a layout_canvas operation), then canvas_view.
| Name | Type | Req | Description |
|---|---|---|---|
| diagram_id | string | yes | Diagram id, from list_diagrams, create_diagram or create_blank_diagram. |
| operations | array | yes | Applied in order, all or nothing. Up to 50. |
No output schema declared.
No examples provided.
canvas_collapse_nodes Collapse nodes into one ~268
When: Use to merge several similar nodes into one while keeping their connections, usually after canvas_suggest_simplifications. Merge several nodes into one summary node, keeping every connection. Use when a set of near-identical objects adds length without adding meaning — eight staging models that all behave the same become "stg_* (8)". Do not use when the individual objects are what the reader came for. Batch: `nodes` (up to 40) takes a list; put every item in one call rather than one call per item. Operates on one Datadef diagram, named by diagram_id. Returns compact JSON: the ids it created, changed or removed, the diagram revision, a one-line summary and the next step. A viewer-role account is refused. Next: canvas_layout_canvas once, then canvas_view.
| Name | Type | Req | Description |
|---|---|---|---|
| description | string | – | What the merged node stands for. Defaults to listing what was collapsed. |
| diagram_id | string | yes | Diagram id, from list_diagrams, create_diagram or create_blank_diagram. |
| label | string | – | Label for the merged node. Omit to generate one such as "stg_* (8)". |
| nodes | array | yes | Node ids or labels to merge. They should be genuinely similar. |
No output schema declared.
No examples provided.
canvas_connect_nodes Connect nodes ~220
When: Use to draw the flows that genuinely move data between two nodes. Never connect a zone: connect a node inside it. Draw edges (arrows) between nodes to show how data flows. Label an edge only when the reader could not guess what it does ("CDC", "hourly batch"); obvious flows and dimensional joins read better unlabelled. Edges always render with an arrowhead at the target; bidirectional adds one at the source. Batch: `edges` (up to 60) takes a list; put every item in one call rather than one call per item. Operates on one Datadef diagram, named by diagram_id. Returns compact JSON: the ids it created, changed or removed, the diagram revision, a one-line summary and the next step. A viewer-role account is refused. Next: canvas_layout_canvas once, when the structure is complete.
| Name | Type | Req | Description |
|---|---|---|---|
| diagram_id | string | yes | Diagram id, from list_diagrams, create_diagram or create_blank_diagram. |
| edges | array | yes | – |
No output schema declared.
No examples provided.
canvas_describe_canvas List every node (flat) ~221
When: Use when you want a flat list of every node, edge and zone. canvas_view shows the same ids as a zone tree with positions and defects, and is usually the better first read. Get an overview of the current canvas: zones as a nested tree in reading order, every node with its id, type, icon and family, all connections with labels, and every note in full. Call this first, before any edit, so you work from real node ids instead of guesses. Operates on one Datadef diagram, named by diagram_id. If you have not already, call get_design_guide first: it carries Datadef's size, edge and zone standard, and diagrams built without it read poorly. Next: canvas_inspect_nodes for a node's full fields, or the write tool you need.
| Name | Type | Req | Description |
|---|---|---|---|
| diagram_id | string | yes | Diagram id, from list_diagrams, create_diagram or create_blank_diagram. |
| includeColumns | boolean | – | Include a short column list for each table node. Default false. |
No output schema declared.
No examples provided.
canvas_disconnect_nodes Remove edges ~154
When: Use to delete specific edges between two nodes. Remove edges, given as source and target, or as an edge id / "Source -> Target" string in `edge`. Batch: `edges` takes a list; put every item in one call rather than one call per item. Operates on one Datadef diagram, named by diagram_id. Returns compact JSON: the ids it created, changed or removed, the diagram revision, a one-line summary and the next step. A viewer-role account is refused. Next: canvas_view to check the result.
| Name | Type | Req | Description |
|---|---|---|---|
| diagram_id | string | yes | Diagram id, from list_diagrams, create_diagram or create_blank_diagram. |
| edges | array | yes | – |
No output schema declared.
No examples provided.
canvas_group_nodes Create a zone ~419
When: Use to create a zone (a layer, domain, stage or boundary), nested with `parentGroup`, optionally moving existing nodes into it: the zone is drawn around them where they are, inside the zone they already share. Create a labelled zone (e.g. "Bronze Layer", "Ingestion") and optionally move nodes into it. The zone is drawn around the nodes where they already are, so nothing moves on screen; it nests inside their shared zone unless parentGroup says otherwise. Zones are what turn a tangle of boxes into a readable architecture — use them for layers, domains, or environments. Batch: One zone per call. Create all zones in a single canvas_batch call, outermost first, instead of one call per zone. Operates on one Datadef diagram, named by diagram_id. Returns compact JSON: the ids it created, changed or removed, the diagram revision, a one-line summary and the next step. A viewer-role account is refused. If you have not already, call get_design_guide first: it carries Datadef's size, edge and zone standard, and diagrams built without it read poorly. Next: canvas_add_nodes with `group` set to the zone.
| Name | Type | Req | Description |
|---|---|---|---|
| color | string | – | A colour instead of a family, e.g. "green". |
| description | string | – | – |
| diagram_id | string | yes | Diagram id, from list_diagrams, create_diagram or create_blank_diagram. |
| family | string | – | Accent hue encoding the zone role. Zones with different roles get different families. |
| label | string | yes | Zone name, e.g. "Silver Layer". |
| nodes | array | – | Node or zone ids or labels to place inside. |
| parentGroup | string | – | Existing zone to nest this one inside, e.g. "Databricks Workspace". Default: the zone the nodes already share, if any. |
| style | string | – | layer = horizontal band (default), cluster = box, swimlane = vertical lane. |
No output schema declared.
No examples provided.
canvas_inspect_nodes Inspect nodes in full ~172
When: Use before changing a node's fields or columns, to see everything it carries: columns, metadata, owners, neighbours. Get full detail for specific nodes: all columns with types and keys, metadata, schedule, formula, owners. Use before modifying a node so you preserve fields you are not changing. Batch: `nodes` (up to 10) takes a list; put every item in one call rather than one call per item. Operates on one Datadef diagram, named by diagram_id. Next: canvas_update_nodes, canvas_set_columns or canvas_replace_node.
| Name | Type | Req | Description |
|---|---|---|---|
| diagram_id | string | yes | Diagram id, from list_diagrams, create_diagram or create_blank_diagram. |
| nodes | array | yes | Node ids or exact labels. Up to 10 at a time. |
No output schema declared.
No examples provided.
canvas_layout_canvas Lay out the diagram ~551
When: Use once, after the structure (zones, nodes, edges) is complete, not after each change. With no arguments it only places what was added or changed; nothing else moves. Set mode "full", direction (LR/TB/RL), spacing (compact/normal/airy), fit (page-portrait/page-landscape/slide-16:9/square) or zone only when the user asked for a different layout. Position what you added or moved, or re-arrange the diagram. Default (no arguments): places new and moved nodes next to what they connect to, in the reading direction, and grows their zone if needed; nothing else moves. Call it once after structural edits. Re-arranging (mode "full", or any of direction / spacing / fit / zone) redraws the layout the way a generated diagram is drawn, so only do it when the user asks for a different layout: "make it vertical" → direction TB; "more breathing room" / "less cramped" → spacing airy; "fit a Word doc / paper / A4" → fit page-portrait; "for a slide" → fit slide-16:9; "tidy this zone" → zone. Notes and flow arrows follow what they annotate. Operates on one Datadef diagram, named by diagram_id. Returns compact JSON: the ids it created, changed or removed, the diagram revision, a one-line summary and the next step. A viewer-role account is refused. Next: canvas_view to check the result, then notes and flow arrows, then canvas_validate_canvas.
| Name | Type | Req | Description |
|---|---|---|---|
| diagram_id | string | yes | Diagram id, from list_diagrams, create_diagram or create_blank_diagram. |
| direction | string | – | Reading direction for a re-arrange: LR left-to-right, TB top-to-bottom, RL right-to-left. Default: the direction the diagram reads in now. |
| fit | string | – | Shape the diagram for a format: page-portrait = A4 / Word / paper; slide-16:9 = presentation. |
| full | boolean | – | Same as mode "full". Prefer `mode`. |
| mode | string | – | "place" (default) positions only new or moved nodes and moves nothing else. "full" re-arranges everything (or just `zone`) — only when the user asked for a different layout. |
| spacing | string | – | Gaps between things for a re-arrange. "airy" when the user wants more whitespace, "compact" to save space. |
| zone | string | – | Re-arrange only this zone (id or label); it keeps its place and neighbours make room. |
No output schema declared.
No examples provided.
canvas_measure_canvas Measure exact geometry ~186
When: Use only for a precise manual placement the user asked for: exact x/y/width/height per node. To check a layout, canvas_view is faster and already reports overlaps. Get exact geometry: every node's position and size in canvas units, the overall canvas bounds, and any nodes that overlap each other. Call this before moving, resizing, or placing anything precisely — positions are meaningless without it. Batch: `nodes` takes a list; put every item in one call rather than one call per item. Operates on one Datadef diagram, named by diagram_id. Next: canvas_move_nodes, canvas_resize_nodes or canvas_align_nodes.
| Name | Type | Req | Description |
|---|---|---|---|
| diagram_id | string | yes | Diagram id, from list_diagrams, create_diagram or create_blank_diagram. |
| nodes | array | – | Limit to specific node ids or labels. Omit to measure everything. |
No output schema declared.
No examples provided.
canvas_move_nodes Move nodes by hand ~225
When: Use only when the user asked for a specific placement. Moving a zone moves its children; never move the children as well. Set node positions precisely. Use absolute x/y to place something exactly, or dx/dy to nudge it. Coordinates are absolute canvas units (same space canvas_measure_canvas reports). Moving a group moves its children with it — do not also move those children in the same call. Call canvas_measure_canvas first. Batch: `moves` (up to 60) takes a list; put every item in one call rather than one call per item. Operates on one Datadef diagram, named by diagram_id. Returns compact JSON: the ids it created, changed or removed, the diagram revision, a one-line summary and the next step. A viewer-role account is refused. Next: canvas_view to check. Do not run canvas_layout_canvas afterwards: it would undo the placement.
| Name | Type | Req | Description |
|---|---|---|---|
| diagram_id | string | yes | Diagram id, from list_diagrams, create_diagram or create_blank_diagram. |
| moves | array | yes | – |
No output schema declared.
No examples provided.
canvas_move_to_group Move nodes into a zone ~252
When: Use to move existing nodes or zones into another zone (they are placed inside it and the zone grows to fit), or out of every zone with group null. A zone cannot move into its own sub-zone. Move existing nodes or zones into an existing zone, or out of every zone (group: null). They keep their place on screen when they already sit inside the zone; otherwise they are placed inside it and the zone grows to fit. A zone cannot move into its own sub-zone. Batch: `nodes` takes a list; put every item in one call rather than one call per item. Operates on one Datadef diagram, named by diagram_id. Returns compact JSON: the ids it created, changed or removed, the diagram revision, a one-line summary and the next step. A viewer-role account is refused. Next: canvas_view to check the result.
| Name | Type | Req | Description |
|---|---|---|---|
| diagram_id | string | yes | Diagram id, from list_diagrams, create_diagram or create_blank_diagram. |
| group | string|null | yes | Target zone id or label. Pass null to take the nodes out of their zones. |
| nodes | array | yes | Node or zone ids or labels to move. |
No output schema declared.
No examples provided.
canvas_remove_lineage Remove column lineage ~198
When: Use to delete lineage rows between two nodes (one column pair, or all rows between them). Lineage pointing at deleted nodes or columns is cleaned automatically. Delete lineage rows between two nodes: one column pair, or every row between the two nodes when no column is given. Lineage pointing at deleted nodes or columns is cleaned automatically and never needs this. Batch: `links` (up to 100) takes a list; put every item in one call rather than one call per item. Operates on one Datadef diagram, named by diagram_id. Returns compact JSON: the ids it created, changed or removed, the diagram revision, a one-line summary and the next step. A viewer-role account is refused. Next: canvas_view to check the result.
| Name | Type | Req | Description |
|---|---|---|---|
| diagram_id | string | yes | Diagram id, from list_diagrams, create_diagram or create_blank_diagram. |
| links | array | yes | – |
No output schema declared.
No examples provided.
canvas_remove_nodes Remove nodes ~270
When: Use to delete nodes and their edges. Removing a zone keeps its contents (they move up to the parent, same place on screen): that is how to ungroup. Pass keepChildren:false only to delete the zone with everything inside it. Delete nodes, notes or zones, with every edge and lineage row touching them. Removing a zone keeps its contents by default: they move up to the zone's parent and stay where they are on screen (this is how to ungroup a zone). Pass keepChildren:false only when the user wants the zone AND everything inside it deleted. Batch: `nodes` takes a list; put every item in one call rather than one call per item. Operates on one Datadef diagram, named by diagram_id. Returns compact JSON: the ids it created, changed or removed, the diagram revision, a one-line summary and the next step. A viewer-role account is refused. Next: canvas_view to check the result.
| Name | Type | Req | Description |
|---|---|---|---|
| diagram_id | string | yes | Diagram id, from list_diagrams, create_diagram or create_blank_diagram. |
| keepChildren | boolean | – | For zones: true (default) moves the contents up to the parent; false deletes everything inside too. |
| nodes | array | yes | Node or zone ids or exact labels. |
No output schema declared.
No examples provided.
canvas_replace_node Replace a node in place ~330
When: Use when one component changes identity or type (Redshift becomes Snowflake, a card becomes a service icon). The node keeps its id, connections, lineage, zone, position and fields. Turn a node into a different component in place — Redshift becomes Snowflake, a batch job becomes streaming. It keeps its id, every connection and lineage row, its zone, position, owners, schedule, colours and columns; only what you pass changes (a new label with no icon picks the new product's icon). canvas_update_nodes does the same for many nodes at once. Batch: One node per call. To convert many nodes, use canvas_update_nodes with `type` (and `label`, `icon`) for each, in one call. Operates on one Datadef diagram, named by diagram_id. Returns compact JSON: the ids it created, changed or removed, the diagram revision, a one-line summary and the next step. A viewer-role account is refused. Next: canvas_view to check the result.
| Name | Type | Req | Description |
|---|---|---|---|
| description | string | – | – |
| diagram_id | string | yes | Diagram id, from list_diagrams, create_diagram or create_blank_diagram. |
| icon | string | – | Icon id from search_icons. |
| keepColumns | boolean | – | Keep the existing columns (table to table). Default true; false clears them. |
| label | string | yes | New label. |
| node | string | yes | Node id or exact label to replace. |
| technology | string | – | – |
| type | string | – | New type. Omit to keep the current type. |
No output schema declared.
No examples provided.
canvas_resize_nodes Resize nodes by hand ~173
When: Use only when the user asked for a specific size. Set the width and height of nodes. Mostly for shapes, text boxes, and group zones — data nodes size themselves from their content, and resizing one can clip what it displays. Batch: `resizes` (up to 40) takes a list; put every item in one call rather than one call per item. Operates on one Datadef diagram, named by diagram_id. Returns compact JSON: the ids it created, changed or removed, the diagram revision, a one-line summary and the next step. A viewer-role account is refused. Next: canvas_view to check.
| Name | Type | Req | Description |
|---|---|---|---|
| diagram_id | string | yes | Diagram id, from list_diagrams, create_diagram or create_blank_diagram. |
| resizes | array | yes | – |
No output schema declared.
No examples provided.
canvas_search_icons Find vendor icon ids ~283
When: Use before adding nodes that should show a vendor logo (Snowflake, Kafka, Power BI) and you are unsure of the icon id. Find icon ids in Datadef's library (2000+ cloud and data-tool logos) by product name, e.g. "Amazon Aurora PostgreSQL", "k8s", "Azure Event Hubs". Pass `queries` to look up many names in one call (best id per name); pass `query` for the top matches of one name. Scores: 90+ sure, 75+ good. A name with no match has no icon; leave the icon field out rather than guessing. Batch: Pass `queries` with every vendor at once (up to 40, best id per name) instead of one call per vendor. Next: canvas_add_nodes (or canvas_update_nodes) with icon set to a returned id; omit icon when nothing matched.
| Name | Type | Req | Description |
|---|---|---|---|
| diagram_id | string | – | Not needed for icon search; accepted for compatibility. |
| limit | integer | – | Matches per name. Default 5 for `query`, 1 for `queries`. |
| queries | array | – | Several names at once, e.g. ["Snowflake", "Fivetran", "Power BI"]. Returns the best icon for each. |
| query | string | – | One product or tool name. |
No output schema declared.
No examples provided.
canvas_set_columns Change a table's columns ~306
When: Use `mode: "merge"` to add or update (renameTo) a few columns, `mode: "remove"` to drop some, or the default replace for the full list. Columns that stay keep their ids and lineage. Change a table's columns. mode "merge" adds new columns and updates (or renames, with renameTo) the ones you name, leaving the rest alone — use it to add one column. mode "remove" deletes the named columns only. mode "replace" (default) makes the list exactly what you pass. Columns are matched by name, so a column that stays keeps its id, its lineage and the edges anchored to it; lineage and anchors of removed columns are cleaned up. Mark primary and foreign keys. Batch: One table per call. For several tables, send one set_columns operation per table in a single canvas_batch call. Operates on one Datadef diagram, named by diagram_id. Returns compact JSON: the ids it created, changed or removed, the diagram revision, a one-line summary and the next step. A viewer-role account is refused. Next: canvas_add_lineage for column-level mappings, if there are any.
| Name | Type | Req | Description |
|---|---|---|---|
| columns | array | yes | – |
| diagram_id | string | yes | Diagram id, from list_diagrams, create_diagram or create_blank_diagram. |
| mode | string | – | Default "replace". |
| node | string | yes | Table node id or exact label. |
No output schema declared.
No examples provided.
canvas_suggest_simplifications Suggest simplifications ~163
When: Use when the diagram feels dense or the user asks to simplify. It changes nothing; it reports what could collapse. Report where this canvas could be collapsed — groups of similar nodes that could become one summary node — without changing anything. Use it to decide whether the diagram is denser than it needs to be. Density is not automatically a problem: keep the detail when the detail is the point. Operates on one Datadef diagram, named by diagram_id. Next: canvas_collapse_nodes to apply a suggestion the user wants.
| Name | Type | Req | Description |
|---|---|---|---|
| diagram_id | string | yes | Diagram id, from list_diagrams, create_diagram or create_blank_diagram. |
| minGroupSize | integer | – | Smallest group worth reporting. Default 3. |
No output schema declared.
No examples provided.
canvas_update_edges Update edges ~265
When: Use to relabel, retype, restyle (dashed, colour), reverse, put arrowheads on both ends, or re-point an existing edge, instead of disconnecting and reconnecting it. Change existing connections in place: relabel, retype, restyle (solid/dashed/dotted, colour), reverse the direction, put arrowheads on both ends, or re-point one end to another node. Identify each edge by source and target, or by `edge` (an id or "Source -> Target"). Change only the edges the user asked about: a request and its response are two edges on purpose, never merge them into one two-headed edge to tidy the drawing. Batch: `updates` (up to 60) takes a list; put every item in one call rather than one call per item. Operates on one Datadef diagram, named by diagram_id. Returns compact JSON: the ids it created, changed or removed, the diagram revision, a one-line summary and the next step. A viewer-role account is refused. Next: canvas_view to check the result.
| Name | Type | Req | Description |
|---|---|---|---|
| diagram_id | string | yes | Diagram id, from list_diagrams, create_diagram or create_blank_diagram. |
| updates | array | yes | – |
No output schema declared.
No examples provided.
canvas_update_nodes Update nodes, zones and notes ~309
When: Use for any in-place change: rename a node or zone (it keeps its size and contents), edit a note's text, recolour (`color: "green"`, `fill`, `family`), change a zone's style, swap an icon, or change a data node's type; fields you do not pass stay as they are. Many nodes in one call. Change existing nodes, zones or notes in place: rename (a zone keeps its size and contents), edit a note's text, recolour ("color": "green" or "#16a34a"; "fill" for the background; "family" for a layer hue), change a zone's style, swap an icon, change a data node's type. Only the fields you pass change; id, position, size, edges and everything else are kept. Batch many nodes in one call. For columns use canvas_set_columns. Batch: `updates` (up to 60) takes a list; put every item in one call rather than one call per item. Operates on one Datadef diagram, named by diagram_id. Returns compact JSON: the ids it created, changed or removed, the diagram revision, a one-line summary and the next step. A viewer-role account is refused. Next: canvas_view to check the result.
| Name | Type | Req | Description |
|---|---|---|---|
| diagram_id | string | yes | Diagram id, from list_diagrams, create_diagram or create_blank_diagram. |
| updates | array | yes | – |
No output schema declared.
No examples provided.
canvas_validate_canvas Validate the diagram ~183
When: Use before you finish: broken references and icons, nodes outside their zone, overlapping zones or nodes. Loops are reported as information only. Check your work: broken references, broken icons, nodes sticking out of their zone, overlapping zones or nodes, unconnected or unfed nodes. By default it reports only issues in what you changed in this session (scope "changed"); scope "all" checks the whole canvas. Fix errors; judge warnings; info needs no action. Operates on one Datadef diagram, named by diagram_id. Next: Fix errors. Warnings are observations; ignore the ones that do not apply.
| Name | Type | Req | Description |
|---|---|---|---|
| diagram_id | string | yes | Diagram id, from list_diagrams, create_diagram or create_blank_diagram. |
| scope | string | – | "changed" (default when you have changed something) or "all". |
No output schema declared.
No examples provided.
canvas_view View the diagram (fast) ~338
When: use to see a diagram before you edit it and after each round of changes; this is how you check your work. It answers in milliseconds from the saved diagram, where export_diagram starts a browser for 6-10 s. Returns a text map: the zones as a tree, each with its place on a coarse grid (r1 = top row, c1 = left column) and its nodes (label, type, icon, #id), then the edges, then the checks a render would reveal: overlapping nodes, overlapping sibling zones, nodes sticking out of their zone, nodes not laid out yet, empty zones, and the validator's error and warning counts. Every #id works as a node reference in the canvas_* tools. It also says when an edit_diagram run or a generation is still in progress on the diagram, and gives a preview image link that renders only if opened. For a large diagram, pass zone to look at one zone. include_image also renders a PNG (slow: only when you need to see styling). Next: fix what the checks report with the targeted canvas_* tool, then canvas_view again.
| Name | Type | Req | Description |
|---|---|---|---|
| diagram_id | string | yes | Diagram id, from list_diagrams, create_diagram or create_blank_diagram. |
| include_columns | boolean | – | List column names under each table. Default false. |
| include_edges | boolean | – | List the edges. Default true. |
| include_image | boolean | – | Also render a PNG, 6-10 s. Default false. |
| zone | string | – | Zone id or exact label: show only that zone and what it contains. |
No output schema declared.
No examples provided.
create_blank_diagram Create an empty diagram to build yourself ~180
When: use when you will build the diagram yourself with the canvas_* tools, because you want control over the result or already know the architecture from the conversation. Use create_diagram instead when Datadef's model should design the whole thing from a prompt. Creates an empty diagram and returns its diagram_id. No AI generation runs: you draw it. Call get_design_guide first: it is the standard Datadef's own generator follows, and building without it produces the diagrams this tool exists to avoid. Next: canvas_search_icons (all vendors in one call), then one canvas_batch with every zone (group_nodes) and node (add_nodes), canvas_connect_nodes, canvas_layout_canvas once, canvas_view.
| Name | Type | Req | Description |
|---|---|---|---|
| description | string | – | Optional short description. |
| name | string | – | Diagram name. Defaults to "Untitled diagram". |
No output schema declared.
No examples provided.
create_diagram Create a data architecture diagram ~732
When: use when Datadef's own model should design a whole new diagram from a description or a pasted schema. To build it yourself step by step, use create_blank_diagram; to change an existing diagram, canvas_view and the canvas_* tools, or edit_diagram. Generates a professional data architecture diagram from a description and saves it to the user's Datadef account. Use it for any data-shaped diagram: medallion and lakehouse architectures, ETL/ELT pipelines, streaming topologies, data mesh, star and snowflake schemas, ER diagrams, lineage maps, cloud architectures, and data platform designs. EXISTING SCHEMAS: if the conversation or the repository has the schema itself (SQL DDL, a MySQL or pg_dump export, migrations, schema.prisma), pass the file contents as the prompt, unedited. Datadef parses it instead of asking a model: every table, column, type, primary key and foreign key comes out exactly as written, in seconds. Warehouse DDL with no declared foreign keys (fact_sales.customer_key → dim_customer.customer_key) gets its links from key names, drawn dashed. Add a sentence only if you want something other than a picture of that schema; "turn these tables into a star schema" or "design the pipeline that loads them" goes to the model instead. Write a specific prompt. Name the actual technologies (Snowflake, dbt, Airflow, Kafka, Fivetran), the layers or zones you want, and the tables that matter, the diagram is only as detailed as the description. Zone names you give are treated as a specification, not a suggestion. SCOPE: if the user's request is open-ended ("diagram our platform", "show me something"), ask them how much detail they want before calling this, or say which scope you chose. Default to scope "overview". A dense 40-node diagram is impressive and usually not what someone wanted from a one-line request; they can always ask you to expand it. TIMING: this waits up to ~35 seconds; fast generations come back finished, with a preview image and a markdown line…
| Name | Type | Req | Description |
|---|---|---|---|
| detailed | boolean | – | Use a higher-tier model. Slower and roughly 10x the cost, only when the user explicitly asks for maximum quality. Independent of `scope`. |
| name | string | – | Title for the diagram. Defaults to an AI-chosen title. |
| prompt | string | yes | What to diagram. Include technologies, data sources, transformations, layers, and destinations. |
| scope | string | – | overview (default): ~12-20 nodes, the shape of the system, right for almost every open-ended request. detailed: every object itemised, denser and harder to read. Ask the user rather than assuming the… |
No output schema declared.
No examples provided.
edit_diagram Edit a diagram with Datadef's agent ~317
When: use for a large change you can describe in words better than you can make it tool by tool: "reorganise this into bronze, silver and gold", "rebuild the consumption side from this spec", "add owners and schedules everywhere". For a precise change (rename, add a node, rewire an edge), the canvas_* tools are faster and exact. Datadef's own editing agent carries out the instruction: add nodes, rewire connections, add columns, reorganise into layers, fill in owners and schedules. Be specific about what to change and where: "Add a Kafka topic between the API and the bronze table, labelled 'events'" works; "make it better" does not. Timing: an edit takes 30-120 s. This waits about 35 s; a finished edit comes back with its summary, the ids it changed and a PNG. A slower one answers "in progress" and keeps running on the server: do NOT call edit_diagram again. Sending the same instruction again joins the running edit (or returns the result of the one that finished less than a minute ago); a different instruction is refused until it finishes. canvas_view and get_diagram report when it has finished. Next: canvas_view to check the result.
| Name | Type | Req | Description |
|---|---|---|---|
| diagram_id | string | yes | Diagram id to modify. |
| include_image | boolean | – | Return a PNG of the updated diagram when the edit finishes in time. Default true. |
| instruction | string | yes | What to change, in plain language. |
No output schema declared.
No examples provided.
export_diagram Export a diagram as an image ~190
When: use to give the user an image of a diagram, or a link to download, attach or embed one. Not to check your own edits: a render starts a browser (6-10 s), while canvas_view answers in milliseconds and reports overlaps. Renders a diagram to PNG or JPEG. Returns the image inline AND a short-lived signed download URL. Use the inline image to show the diagram; use the URL when the user wants to save it, attach it, or share a link: it serves the file directly and needs no API key. Next: nothing; show the image or the link to the user.
| Name | Type | Req | Description |
|---|---|---|---|
| diagram_id | string | yes | Canvas id to export. |
| format | string | – | Default png. |
| height | integer | – | Viewport height in pixels. Default 1000. |
| width | integer | – | Viewport width in pixels. Default 1600. |
No output schema declared.
No examples provided.
get_design_guide Datadef design guide ~124
When: read once before your first canvas_* call, to build or to edit. Datadef's standard for a readable diagram (size, edge discipline, nested zones, notes) and the tool workflow: which canvas_* tool to use when, batching, laying out once, checking with canvas_view. It is the same standard Datadef's own generator follows, so a diagram you build by hand comes out indistinguishable from a generated one. Works without a subscription. Next: create_blank_diagram to build, or canvas_view to edit an existing diagram.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
get_diagram Read a diagram, with a picture ~180
When: use to show the user a diagram (it attaches a rendered PNG and a markdown image line, 6-10 s), or to poll a diagram that create_diagram or edit_diagram is still working on. To check your own edits, canvas_view is faster and reports overlaps. Returns every node with its type and columns, every connection and the zones, plus whether a generation or edit_diagram run is still in progress. Next: canvas_view and the canvas_* tools to edit.
| Name | Type | Req | Description |
|---|---|---|---|
| diagram_id | string | yes | Canvas id, from list_diagrams, create_diagram, or create_blank_diagram. |
| include_columns | boolean | – | Include table column lists. Default true. |
| include_image | boolean | – | Attach a PNG preview and a markdown image link to show the user. Default true; pass false for structure-only reads. |
No output schema declared.
No examples provided.
list_diagrams List the user's diagrams ~69
When: use to find the id of an existing diagram before viewing, editing or exporting it. Lists the diagrams in the user's Datadef account, most recently updated first. Next: canvas_view with the diagram_id to see it.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Max results. Default 25. |
No output schema declared.
No examples provided.
repo_refresh Sync a diagram from its repository ~95
Re-sync a repo-linked diagram from the current state of its repository. If the tracked branch or tag has not moved since the last sync, nothing changes. If it has, the diagram is REGENERATED from the repository, which replaces manual canvas edits. Only the owner of the repository connection can use this.
| Name | Type | Req | Description |
|---|---|---|---|
| project_id | string | yes | Project id of the repo-linked diagram. A diagram_id from list_diagrams works too. |
No output schema declared.
No examples provided.
repo_status Repository sync status ~90
For a diagram that was created from a connected git repository: which repo and branch or tag it tracks, when it last synced, the commit it reflects, and whether daily sync is on. Use repo_refresh to sync it now. Only the owner of the repository connection can use this.
| Name | Type | Req | Description |
|---|---|---|---|
| project_id | string | yes | Project id of the repo-linked diagram. A diagram_id from list_diagrams works too. |
No output schema declared.
No examples provided.
How do I install the io.datadef/mcp server?
io.datadef/mcp is a hosted endpoint at https://datadef.io/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
remote · datadef.io
claude mcp add --transport http io-datadef-mcp 'https://datadef.io/mcp'
What is the io.datadef/mcp server?
io.datadef/mcp is listed in the public MCP registry as io.datadef/mcp. Generate, edit, and export data-architecture diagrams from your AI. Column lineage, PNG in chat. This page covers its hosted endpoint (https://datadef.io/mcp).
Is the io.datadef/mcp server safe to use?
io.datadef/mcp scores 92 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the io.datadef/mcp server expose?
io.datadef/mcp exposes 39 tools: get_design_guide, canvas_describe_canvas, canvas_inspect_nodes, canvas_search_icons, canvas_measure_canvas, and 34 more. Their descriptions and schemas cost roughly 9,513 tokens of context every time the server is loaded.
Does the io.datadef/mcp server require authentication?
Yes. io.datadef/mcp asked us for credentials when we connected, so you will need to authorise it in your MCP client before it can do anything.
Is the io.datadef/mcp server still maintained?
io.datadef/mcp is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.