io. github. tldraw/ tldraw
by tldraw · remote · no sign-in to list tools · v0.1.0 · published by GitHub user tldraw
Draw and visually collaborate with your agents on tldraw's canvas.
6 tools: 4 change things and 2 only read.
Scanned Oct 21, 2026
- Deletes or cancels0Claude Code: deny
- Can't be undone0Claude Code: ask
- Changes things4Claude Code: ask: see these tools
- Only reads2Claude Code: allow: see these tools
1 check matched something in the tool definitions. No finding is not a safety guarantee. How the checks work.
claude mcp add --transport http tldraw https://tldraw-mcp-app.tldraw.workers.dev/mcpFindings
Matches of fixed checks, with the text they matched.
- Warnsearch
The server marks "search" read-only (readOnlyHint: true), and its own name, description or input give the class "write".
What this check looks forMatched text
annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}; The name "search" says "search": a word for reading.
Tools
Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.
6 tools
Changes things 4Claude Code: ask
_exec_callbackApp-only: widget calls this to resolve a pending exec request.No findings
Why it is in this group
- The name "_exec_callback" says "exec": a word for a change.
Description, as the server wrote it App-only: widget calls this to resolve a pending exec request.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
- openWorldHint: false
execExecute JavaScript code on a tldraw canvas.No findings
Why it is in this group
- The name "exec" says "exec": a word for a change.
- The input takes a statement or command to run (input.code), which can change anything it can reach.
Description, as the server wrote it Execute JavaScript code on a tldraw canvas. The code runs in the widget with access to the live `editor` instance, helper functions, and normal js. Use the `search` tool first to discover available Editor methods and shape types. Each canvas has a unique `canvasId`. Omit `canvasId` to create a new blank canvas. To edit an existing canvas, pass the `canvasId` that was returned by a previous exec call. Shapes and text grow depending on the amount of text they have. Use clever scripting to ensure there are no unintended overlaps. Examples: - Create a rectangle: editor.createShape({ _type: 'rectangle', shapeId: 'box1', x: 200, y: 120, w: 320, h: 180, text: 'Hello' }) - Connect shapes with an arrow: editor.createShape({ _type: 'arrow', shapeId: 'a1', fromId: 'box1', toId: 'box2', x1: 0, y1: 0, x2: 100, y2: 0 }) - Select and zoom: editor.select('box1'); editor.zoomToSelection() - Read shapes: return editor.getCurrentPageShapes() - Distribute evenly: editor.distributeShapes(editor.getSelectedShapeIds(), 'horizontal') - Box around shapes: boxShapes(['box1', 'box2'], { text: 'Group label', color: 'blue' }) - Stack shapes dynamically: editor.createShape({ _type: 'rectangle', shapeId: 'a', x: 0, y: 0, w: 300, h: 200, text: 'First box\nwith wrapping text' }); const bounds = editor.getShapePageBounds('a'); editor.createShape({ _type: 'rectangle', shapeId: 'b', x: 0, y: bounds.maxY + 20, w: 300, h: 200, text: 'Below first' })
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
- openWorldHint: false
save_checkpointApp-only: save shapes to a checkpoint (from user edits).No findings
Why it is in this group
- The name "save_checkpoint" says "save": a word for a change.
Description, as the server wrote it App-only: save shapes to a checkpoint (from user edits). shapesJson and assetsJson must be JSON array strings.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
- openWorldHint: false
searchSearch the tldraw Editor API spec by writing JavaScript that receives a `spec` object and returns a result.1 finding
Why it is in this group
- The name "search" says "search": a word for reading.
- The input takes a statement or command to run (input.code), which can change anything it can reach.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
Findings
- Warn
The server marks "search" read-only (readOnlyHint: true), and its own name, description or input give the class "write".
What this check looks forMatched text
annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}; The name "search" says "search": a word for reading.
Description, as the server wrote it Search the tldraw Editor API spec by writing JavaScript that receives a `spec` object and returns a result. The spec contains: spec.members (all Editor methods/properties with name, kind, signature, description, category), spec.categories (category names), spec.types.shapes (focused shape type definitions with props), spec.types.shapeTypes (list of all shape type strings), spec.helpers (exec helper functions with descriptions, params, examples). Examples: - Find shape methods: return spec.members.filter(m => m.category === "shapes").map(m => ({ name: m.name, signature: m.signature })) - Get arrow shape props: return spec.types.shapes.find(s => s.shapeType === "arrow") - List all categories: return spec.categories - Find a helper: return spec.helpers.find(h => h.name === "createArrowBetweenShapes")
Annotations the server declares
- readOnlyHint: true
- idempotentHint: true
- openWorldHint: false
- destructiveHint: false
Only reads 2Claude Code: allow
_get_canvas_stateApp-only: get the latest checkpoint for a canvas by its canvasId.No findings
Why it is in this group
- The name "_get_canvas_state" says "get": a word for reading.
Description, as the server wrote it App-only: get the latest checkpoint for a canvas by its canvasId.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
read_checkpointApp-only: read shapes from a checkpoint by ID.No findings
Why it is in this group
- The name "read_checkpoint" says "read": a word for reading.
Description, as the server wrote it App-only: read shapes from a checkpoint by ID.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.
Install
Pinned to version 0.1.0. Values in angle brackets are yours to fill in.
claude mcp add --transport http tldraw https://tldraw-mcp-app.tldraw.workers.dev/mcpRun in a terminal.
Claude Code permissions
Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.
{
"permissions": {
"allow": [
"mcp__tldraw___get_canvas_state",
"mcp__tldraw__read_checkpoint"
],
"ask": [
"mcp__tldraw__search",
"mcp__tldraw__exec",
"mcp__tldraw___exec_callback",
"mcp__tldraw__save_checkpoint"
],
"deny": []
}
}Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. It assumes the server is installed as tldraw. Review it before you use it.
