Skip to main content
Glama
CanvasKeep

canvaskeep-mcp

Official

CanvasKeep MCP Server

An MCP (Model Context Protocol) server that lets AI tools like Claude Code and Codex generate Excalidraw diagrams and save them directly into your CanvasKeep workspace.

npm license

Setup

1. Get an API key

  1. Log in to CanvasKeep

  2. Click your profile menu (top right) and select API Keys

  3. Generate a new key and copy it immediately (you won't see it again)

2. Install and register

Claude Code:

claude mcp add canvaskeep \
  -e CANVASKEEP_API_KEY=ck_your_key_here \
  -- npx canvaskeep-mcp

Codex / other MCP clients:

{
  "mcpServers": {
    "canvaskeep": {
      "command": "npx",
      "args": ["canvaskeep-mcp"],
      "env": {
        "CANVASKEEP_API_KEY": "ck_your_key_here"
      }
    }
  }
}

3. Environment variables

Variable

Required

Default

Description

CANVASKEEP_API_KEY

Yes

-

Your API key from the CanvasKeep dashboard

CANVASKEEP_MASTER_KEY

No

-

Needed to read or edit encrypted diagrams. Copy it from canvaskeep.com/dashboard/encryption (Key for the MCP server)

CANVASKEEP_API_URL

No

https://canvaskeep.com

API base URL (override for local dev)

Related MCP server: Excalidraw MCP Server

Available tools

Tool

Description

list_workspaces

List all your workspaces

create_workspace

Create a new workspace

list_folders

List folders in a workspace

create_folder

Create a new folder, optionally nested

list_diagrams

List diagrams in a workspace

create_diagram

Create a diagram, optionally inside a folder

update_diagram

Rename a diagram

delete_diagram

Permanently delete a diagram

get_diagram_summary

Get diagram metadata and element count

get_diagram_scene

Read the full Excalidraw scene of a diagram

save_diagram_scene

Write a full Excalidraw scene back to a diagram

generate_diagram

Generate a diagram from nodes and edges with auto-layout

Encryption

Diagrams you encrypt in CanvasKeep stay encrypted when an AI tool works with them. When get_diagram_scene or save_diagram_scene touches an encrypted diagram, this server decrypts and re-encrypts it locally (AES-GCM, see src/encryption.ts) using CANVASKEEP_MASTER_KEY. The master key never leaves your machine.

generate_diagram sends the nodes and edges you give it to CanvasKeep, which lays them out on the server, so diagrams generated this way are stored unencrypted.

Example usage

Ask Claude Code something like:

"Draw an architecture diagram of a web app with a React frontend, Node API, PostgreSQL database, and Redis cache"

Claude will use the MCP tools to create a diagram in your CanvasKeep workspace with properly laid-out boxes and labeled arrows.

Development

git clone https://github.com/CanvasKeep/canvaskeep-mcp.git
cd canvaskeep-mcp
npm install
npm run build
CANVASKEEP_API_KEY=ck_... CANVASKEEP_API_URL=http://localhost:3000 node dist/index.js

To run your local build from Claude Code:

claude mcp add canvaskeep \
  -e CANVASKEEP_API_KEY=ck_your_key_here \
  -- node /path/to/canvaskeep-mcp/dist/index.js

License

MIT

Available Tools

12 tools
create_diagramA

Create a new empty diagram in a workspace, optionally inside a folder. Returns the new diagram's id. Use generate_diagram afterward to populate it with content. Use list_folders first to find the folder_id if you want to place it in a specific folder.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYesA short, descriptive title for the diagram (e.g. 'Auth Flow', 'System Architecture')
folder_idNoOptional folder UUID to place the diagram in. Use list_folders to find folder ids. Omit to create at workspace root.
workspace_idYesThe workspace UUID to create the diagram in

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It usefully discloses that the created diagram is empty and that the response is the new diagram's id, but says nothing about permissions/auth requirements, error conditions, or naming-collision behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the core action and return value, followed by the two follow-up hints. Every sentence earns its place with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple three-parameter creation tool with no annotations and no output schema, the description covers the action, the optional folder, the returned id, and the next-step tool. Only permission/prerequisite context is absent, which is a minor gap at this complexity level.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all three parameters are already documented in the schema, including the folder_id lookup hint and title examples. The description only restates that folder placement is optional and where to get folder_id, adding no new syntax or constraint detail. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource (create a new empty diagram) with scope (in a workspace, optionally in a folder) and explicitly separates itself from generate_diagram, which populates content. An agent can distinguish it from create_folder, update_diagram, and generate_diagram without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit sequencing and alternatives: call generate_diagram afterward to populate, and list_folders first to obtain a folder_id. It lacks any when-not-to-use guidance (e.g. 'do not use to import existing diagrams'), so it stops just short of the top score.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_folderA

Create a new folder in a workspace. Returns the new folder's id and name. Optionally nest it inside an existing folder.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesName for the new folder
workspace_idYesThe workspace UUID to create the folder in
parent_folder_idNoOptional parent folder UUID to nest this folder inside

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It usefully discloses that the tool returns the new folder's id and name and that nesting is optional, but it omits permissions, side effects, error behavior, and uniqueness constraints. Some value is added, but major gaps remain.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the core action, followed by return value and optional behavior. Every sentence earns its place with zero waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a low-complexity create tool with no output schema, the description covers the essentials: what is created, where, the return values, and the optional nesting. Missing details like permission requirements are minor given the tool's simplicity and the full schema coverage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all three parameters. The description reinforces the optional parent-folder nesting ('Optionally nest it inside an existing folder'), but adds no syntax, format, or constraints beyond what the schema provides. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Create a new folder in a workspace') with a clear scoping phrase. The resource 'folder' distinguishes it from sibling tools like create_workspace and create_diagram without requiring explicit sibling references.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit when-to-use guidance, no conditions, and no alternatives named (e.g., list_folders or create_workspace). The purpose implies usage, but the description offers no help in selecting this tool over others or knowing prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_workspaceB

Create a new workspace. Returns the new workspace's id and name.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesName for the new workspace

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden. It discloses the return values ('id and name'), but omits key mutation traits such as required permissions, duplicate-name handling, idempotency, or side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short, front-loaded sentences with no wasted words. Purpose is stated first, followed by return information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter creation tool, the description covers purpose and return values. However, it lacks usage guidance and behavioral context (e.g., permissions, uniqueness constraints), which matters because there are no annotations and no output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents the single parameter. The description adds no further parameter semantics, making the baseline score of 3 appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Create a new workspace'), which clearly distinguishes it from list_workspaces. However, it does not explicitly differentiate itself from other creation siblings like create_folder or create_diagram.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides no guidance on when to use this tool versus alternatives, prerequisites, or exclusions. The purpose implies usage, but no explicit context is given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_diagramA

Permanently delete a diagram and its content. This cannot be undone.

ParametersJSON Schema
NameRequiredDescriptionDefault
diagram_idYesThe diagram UUID to delete

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden, and it discharges the most important part: the operation is permanent, irreversibly destroys the diagram and its content. It omits secondary traits such as required permissions, behavior when the diagram_id does not exist, or whether deletion cascades to shares/links.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, zero waste, with the destructive consequence front-loaded in the first sentence and the irreversibility warning second. Nothing could be trimmed without losing signal.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-required-parameter destructive tool with no output schema, the definition covers the essentials an agent must know before calling it. It falls just short of complete by not addressing failure modes (unknown or already-deleted diagram_id) or authorization requirements.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% for the single parameter ('The diagram UUID to delete'), so the schema already carries the semantics. The description adds nothing for the parameter beyond the baseline; per the rubric this is the standard 3 when the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (delete) and resource (diagram) plus the scope of destruction ('and its content'). It is immediately distinguishable from siblings like update_diagram, create_diagram, or get_diagram_scene without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No when-to-use, when-not-to-use, or alternative is named. It never says to prefer update_diagram when content should be cleared without removing the diagram, nor does it state prerequisites such as ownership or permissions. Usage is only inferable from the tool name.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generate_diagramA

Generate a visual diagram from a structured graph of nodes and edges, and save it to an existing CanvasKeep diagram.

You provide the logical structure (what components exist and how they connect), and CanvasKeep handles all visual layout automatically - do NOT try to compute x/y positions.

NODES: Create one node for every distinct component, actor, system, service, or data store mentioned in the user's request. Give each a short, clear label (under 30 chars). Choose the right type for visual distinction.

EDGES: Create one edge for every meaningful interaction, data flow, API call, or dependency between nodes. Label edges with the nature of the interaction (e.g. 'REST API', 'SQL query', 'WebSocket', 'publishes'). Every important relationship should be an edge.

MODE: Use 'replace' (default) to create a fresh diagram. Use 'append' to add new elements alongside existing content in the diagram.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNo'replace' clears existing content and draws only the new graph. 'append' adds the new graph alongside any existing diagram content.replace
edgesYesConnections between nodes representing interactions, data flows, API calls, or dependencies. Each becomes a labeled arrow.
nodesYesEvery distinct component, actor, system, or data store to show on the diagram. Each becomes a labeled box.
directionNoLayout direction. 'vertical' (default): top-to-bottom flow, best for sequential processes. 'horizontal': left-to-right. 'auto': picks based on max fan-out from any single node.vertical
diagram_idYesThe diagram UUID to write the generated content into. Create one first with create_diagram if needed.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does well: it discloses that layout is automatic (do NOT compute x/y), that 'replace' clears existing content while 'append' preserves it (a destructive-behavior disclosure), and that the target must already exist. It stops short of describing failure modes or what the call returns.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose, then cleanly sectioned into NODES / EDGES / MODE blocks that map to the parameters. It is somewhat long, and lines like 'Every important relationship should be an edge' echo the preceding sentence, but no section is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with no annotations and no output schema, the description supplies the crucial missing behavioral context (auto-layout, destructive replace semantics, prerequisite that the diagram exists). It does not say what happens on invalid node/edge references or what the agent gets back on success.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already 100%, so baseline would be 3, but the description adds genuine semantic guidance beyond the schema: how many nodes/edges to create and on what basis (one per distinct component, one per data flow/API call/dependency), plus edge-labeling intent. It largely restates the mode and diagram_id meaning already given in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence names a specific verb (generate) and resource (visual diagram) and states the source (structured graph of nodes/edges) and destination (existing CanvasKeep diagram). It clearly distinguishes itself from create_diagram by requiring an existing diagram_id and pointing to create_diagram for setup.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives concrete usage instructions: supply logical structure only, let CanvasKeep handle layout, one node per component, one edge per meaningful interaction, and explains replace vs append. It references create_diagram as a prerequisite for obtaining the diagram_id, but never states when NOT to use this tool versus siblings like save_diagram_scene or update_diagram.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_diagram_sceneA

Read the raw Excalidraw scene of a diagram: the full elements array (with ids, x/y, width/height, styles, text, arrow bindings) and appState.

Use this before save_diagram_scene to make precise edits: read the scene, modify the elements you need, then write the complete array back.

Embedded image data (files) is omitted by default because it can be very large; set include_files to true only if you need it.

ParametersJSON Schema
NameRequiredDescriptionDefault
diagram_idYesThe diagram UUID to read
include_filesNoInclude embedded image data (base64). Defaults to false; only file ids are listed.

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does disclose meaningful behavior: embedded image data is omitted by default because it can be very large, and elements include arrow bindings and appState. It does not mention permissions or error behavior, but the payload-shaping behavior is well communicated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight paragraphs: purpose first, then the workflow pairing, then the one caveat about files. No filler sentences and the most important routing information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description must describe the return shape, and it does: the full elements array and appState, with the notable omission of file blobs by default. Nothing an agent needs to call this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds real value by explaining why include_files defaults to false (embedded base64 data can be very large) and by detailing what the returned elements contain. This goes beyond restating the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb and resource ('Read the raw Excalidraw scene of a diagram') and enumerates exactly what is returned (elements array with ids, x/y, width/height, styles, text, arrow bindings, plus appState). This clearly separates it from siblings like get_diagram_summary or list_diagrams.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states the exact workflow: use this before save_diagram_scene, modify the elements, then write the complete array back. That names the alternative and the condition that selects it, so an agent knows precisely when to pick this tool over its siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_diagram_summaryA

Get a summary of an existing diagram: its title, workspace, element count, and when it was last updated. Does NOT return the raw scene data.

ParametersJSON Schema
NameRequiredDescriptionDefault
diagram_idYesThe diagram UUID to look up

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full disclosure burden. It does useful work by defining the payload boundary (metadata only, no scene data), which signals a cheap read operation, but it says nothing about permissions, behavior when the diagram_id does not exist, or error semantics. Adequate but incomplete for a zero-annotation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, zero filler, with the returned-field list front-loaded and the exclusion clause placed last where it is most useful. Every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and no annotations, the description compensates well by enumerating the returned fields and their boundary. It is nearly complete for a simple read-only lookup, though it omits not-found/permission behavior an agent might want before calling.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There is a single parameter, diagram_id, and schema description coverage is 100% ('The diagram UUID to look up'), so the schema already does the heavy lifting. The description adds no format or lookup semantics beyond that, making the baseline 3 correct.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get a summary of an existing diagram') and enumerates exactly what the summary contains: title, workspace, element count, last-updated time. It also explicitly disambiguates from the sibling get_diagram_scene by stating it does NOT return raw scene data, so an agent can pick between the two without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The negative clause 'Does NOT return the raw scene data' implicitly routes the agent away from this tool when full scene contents are needed, effectively naming the alternative by contrast. There is no explicit 'use this when' statement or mention of prerequisites, so it stops short of a full 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_diagramsA

List all diagrams in a workspace. Returns each diagram's id, title, and last updated timestamp.

ParametersJSON Schema
NameRequiredDescriptionDefault
workspace_idYesThe workspace UUID to list diagrams from

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It helpfully discloses scope (workspace-wide) and the returned fields (id, title, last updated timestamp), signaling a safe read, but says nothing about pagination, result caps, ordering, or failure behavior for an invalid workspace_id.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences with zero waste: the action and scope come first, then the return contents. Nothing is repeated or padded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description usefully enumerates the returned fields, which is the main gap it needed to close for a simple one-parameter list tool. It omits pagination and empty-result behavior, so it is not exhaustive.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single workspace_id parameter is 100% documented in the schema, including its UUID format, so the description needs to add little. It only reiterates the workspace scoping and contributes no extra syntax or constraint detail, matching the baseline for full schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List all diagrams') plus scope ('in a workspace'), which cleanly separates it from write siblings like create_diagram or delete_diagram. It does not name any sibling explicitly, so it falls short of full differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied by the verb and the name; there is no statement of when to prefer this over get_diagram_summary, get_diagram_scene, or list_folders, nor any prerequisite or exclusion guidance. Adequate but leaves alternatives to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_foldersA

List all folders in a workspace. Returns each folder's id, name, and parent_folder_id. Use folder ids when creating diagrams inside a specific folder.

ParametersJSON Schema
NameRequiredDescriptionDefault
workspace_idYesThe workspace UUID to list folders from

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden. It usefully discloses the return shape (id, name, parent_folder_id), which compensates for the missing output schema, but says nothing about pagination, ordering, empty results, or required permissions for a read-only listing.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, each earning its place: purpose, return shape, and downstream usage. No filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter read tool with no output schema, the description covers purpose, return fields, and usage adequately. Only minor gaps remain around result ordering or size limits.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and there is a single documented workspace_id parameter, so the schema already does the work. The description adds no format or constraint detail beyond it, making the baseline 3 appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List all folders in a workspace') and goes further by naming the exact fields returned. An agent can distinguish it from create_folder and list_diagrams without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The final sentence gives downstream guidance ('Use folder ids when creating diagrams inside a specific folder'), which implies the why but not an explicit when-to-use-vs-alternatives rule. No exclusion conditions or prerequisites are stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_workspacesA

List all workspaces in your CanvasKeep account. Returns each workspace's id and name. Use this first to find the workspace_id needed by other tools.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It signals a read-only enumeration and describes the returned fields (id, name), but says nothing about pagination, result limits, or ordering for accounts with many workspaces.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences with no filler, ordered as purpose, return value, then usage cue. Every sentence earns its place and the most important information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and no annotations, the description usefully fills the gap by naming the returned fields and explaining why the tool matters in the workflow. Only pagination/limits remain unspecified, which is a minor omission for a simple list tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, which is the baseline-4 case; there is nothing for the description to clarify beyond what the empty schema already shows. The mention of workspace_id correctly refers to output, not an input.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource with scope: "List all workspaces in your CanvasKeep account." The purpose is unambiguous and an agent can immediately tell it apart from create_workspace by the 'list' verb, but the description never explicitly contrasts itself with any sibling, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"Use this first to find the workspace_id needed by other tools" gives clear sequencing guidance and names the reason to call it. There are no explicit when-not-to-use conditions or named alternatives, but for a prerequisite lookup tool the context is effectively complete.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

save_diagram_sceneA

Overwrite a diagram's scene with a full Excalidraw elements array. Use this for manual layout and precise edits (moving, restyling, relabeling, adding or removing specific elements).

IMPORTANT: this REPLACES the entire scene. Always call get_diagram_scene first, modify that array, and send back EVERY element you want to keep. Any element missing from the array is deleted. To remove an element you may also set "isDeleted": true on it.

When changing an element, bump its "version" and set a new random "versionNonce" so open editors pick up the change. Text inside a shape is a separate text element with "containerId" set to the shape id; arrows reference shapes via startBinding/endBinding and shapes list them in boundElements.

Existing embedded images (files) and appState are kept unless you pass new ones. If the diagram is open in a browser tab, unsaved edits there may overwrite this save.

ParametersJSON Schema
NameRequiredDescriptionDefault
filesNoOptional embedded files map. Omit to keep the current files.
appStateNoOptional appState (e.g. viewBackgroundColor). Omit to keep the current one.
elementsYesThe complete Excalidraw elements array for the diagram (not a partial patch).
diagram_idYesThe diagram UUID to write

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does so well: it flags destructive overwrite semantics, states that any omitted element is deleted, documents the isDeleted escape hatch, explains the version/versionNonce bump needed for open editors, describes container/binding relationships, and warns that unsaved browser-tab edits may overwrite the save. That is exactly the mutation-risk and side-effect context an agent needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core replace-semantics are front-loaded and the IMPORTANT marker flags the destructive behavior early. The paragraph is dense and a bit long, but each sentence — versioning, container/binding structure, files/appState retention, concurrency caveat — carries actionable information rather than filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive 4-parameter mutation tool with no annotations and no output schema, the description covers destruction, preservation, and concurrency risk thoroughly. The only gap is that it never says what the call returns, which matters slightly since no output schema exists.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds genuine meaning beyond it: elements must be the complete array rather than a partial patch, files/appState are preserved when omitted, and it explains the internal structure (containerId, startBinding/endBinding, boundElements) that the flat schema does not convey.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource — overwriting a diagram's scene with a full Excalidraw elements array — and scopes it to manual layout/precise edits, which cleanly separates it from the read-oriented sibling get_diagram_scene. An agent can distinguish it from generate_diagram without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit use context ('manual layout and precise edits: moving, restyling, relabeling, adding or removing specific elements') and a required workflow prerequisite ('Always call get_diagram_scene first, modify that array, and send back EVERY element'). It does not name when to prefer generate_diagram instead, so the alternative-routing is incomplete for a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_diagramB

Update a diagram's title (rename it).

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYesThe new title for the diagram
diagram_idYesThe diagram UUID to update

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It discloses only that the operation is a rename; it says nothing about required permissions, whether the change is reversible, whether the title must be unique, or what happens on conflict. For a mutation tool with zero annotation coverage this is a real gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single short sentence with the resource and scope front-loaded and zero filler. It is efficient, though it is so terse that it verges on under-specification rather than optimal structure.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is very simple: two required string parameters, 100% schema coverage, no output schema needed. The description is complete enough for an agent to invoke it correctly, with the only shortfall being behavioral context a rename operation would ideally carry.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% (both diagram_id and title are documented in the schema, including the 1-200 length bounds), so the baseline is 3. The description adds no syntax or format detail beyond what the schema already states.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (update/rename) and resource (diagram's title), and the parenthetical '(rename it)' sharply narrows the scope to title-only, which distinguishes it from siblings like save_diagram_scene or create_diagram. It does not name any sibling explicitly, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description says nothing about when to choose this tool over save_diagram_scene or create_diagram, nor any prerequisites or conditions of use. It is implied from the name, but no guidance is written.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 12 tool updatesv0.6.1
    • First observedcreate_diagram
    • First observedcreate_folder
    • First observedcreate_workspace
    • First observeddelete_diagram
    • First observedgenerate_diagram
    • First observedget_diagram_scene
    • First observedget_diagram_summary
    • First observedlist_diagrams
    • First observedlist_folders
    • First observedlist_workspaces
    • First observedsave_diagram_scene
    • First observedupdate_diagram

TDQS

A3.8/5.0

Scored across 12 tools

Disambiguation4/5

Most tools have clearly distinct purposes (list/create/update/delete per resource, summary vs raw scene reads). The only mild overlap is between generate_diagram and save_diagram_scene, since both write diagram content, but their descriptions clearly separate auto-layout from manual element editing.

Naming Consistency5/5

Every tool follows a predictable snake_case verb_noun pattern (list_folders, create_diagram, update_diagram, get_diagram_scene, save_diagram_scene, generate_diagram). No mixed conventions or vague verbs.

Tool Count5/5

12 tools is well-scoped for a workspace/folder/diagram management server, with reads and writes balanced across the three resources. Each tool earns its place without redundancy.

Completeness3/5

Diagrams have strong lifecycle coverage (create, list, update, delete, get scene/summary, save, generate), but folders and workspaces can only be created and listed — no delete, rename, update, or move operations exist. These asymmetric gaps will cause agent dead ends when cleaning up or reorganizing workspaces/folders.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI agents to programmatically control a live Excalidraw canvas with element-level CRUD operations and real-time synchronization. It supports iterative diagramming through scene descriptions, screenshots, and advanced layout tools for collaborative AI-human workflows.
    1,303 npm
    2
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Provides tools for creating, deleting, and querying nodes and edges in Excalidraw diagrams, enabling diagram editing via LLM interfaces.
    1,682 npm
    5
    MIT