excalidraw-mcp-server
[ tools: 11 ][ checks: 11 ][ latency: 5ms ]
69/100(D)
npx -y excalidraw-mcp
check breakdown
✓Tools exposed — Server exposed 11 tools.
• create_element
• update_element
• delete_element
• query_elements
• get_resource
• group_elements
• ungroup_elements
• align_elements
• distribute_elements
• lock_elements
• unlock_elements
✓Input schemas valid — All tools have a valid JSON-Schema input definition.
!Input schema quality — 51 schema-quality issue(s) across 11 tool(s).
create_element.type: parameter has no description
create_element.x: parameter has no description
create_element.y: parameter has no description
create_element.width: parameter has no description
create_element.height: parameter has no description
create_element.backgroundColor: parameter has no description
create_element.strokeColor: parameter has no description
create_element.strokeWidth: parameter has no description
create_element.roughness: parameter has no description
create_element.opacity: parameter has no description
create_element.text: parameter has no description
create_element.fontSize: parameter has no description
create_element.fontFamily: parameter has no description
create_element: inputSchema.additionalProperties is not set to false (extra args pass through silently)
update_element.id: parameter has no description
update_element.type: parameter has no description
update_element.x: parameter has no description
update_element.y: parameter has no description
update_element.width: parameter has no description
update_element.height: parameter has no description
update_element.backgroundColor: parameter has no description
update_element.strokeColor: parameter has no description
update_element.strokeWidth: parameter has no description
update_element.roughness: parameter has no description
update_element.opacity: parameter has no description
update_element.text: parameter has no description
update_element.fontSize: parameter has no description
update_element.fontFamily: parameter has no description
update_element: inputSchema.additionalProperties is not set to false (extra args pass through silently)
delete_element.id: parameter has no description
delete_element: inputSchema.additionalProperties is not set to false (extra args pass through silently)
query_elements: no "required" array (which params are mandatory?)
query_elements.type: parameter has no description
query_elements.filter: parameter has no description
query_elements: inputSchema.additionalProperties is not set to false (extra args pass through silently)
get_resource.resource: parameter has no description
get_resource: inputSchema.additionalProperties is not set to false (extra args pass through silently)
group_elements.elementIds: parameter has no description
group_elements: inputSchema.additionalProperties is not set to false (extra args pass through silently)
ungroup_elements.groupId: parameter has no description
ungroup_elements: inputSchema.additionalProperties is not set to false (extra args pass through silently)
align_elements.elementIds: parameter has no description
align_elements.alignment: parameter has no description
align_elements: inputSchema.additionalProperties is not set to false (extra args pass through silently)
distribute_elements.elementIds: parameter has no description
distribute_elements.direction: parameter has no description
distribute_elements: inputSchema.additionalProperties is not set to false (extra args pass through silently)
lock_elements.elementIds: parameter has no description
lock_elements: inputSchema.additionalProperties is not set to false (extra args pass through silently)
unlock_elements.elementIds: parameter has no description
unlock_elements: inputSchema.additionalProperties is not set to false (extra args pass through silently)
→ Declare `required` for every schema that has properties, so agents know which params are mandatory.
→ Give every property a `description` and a concrete `type` (avoid bare `{}` placeholders).
→ Set `additionalProperties: false` on the top-level inputSchema so models can't silently pass extra, unvalidated arguments.
!Output schemas — No tools declare an outputSchema.
→ Optional: declare outputSchema for tools with structured results so agents can validate/parse output reliably.
✓Duplicate tool names — All tool names are unique.
✓Tool naming — All tool names use spec-legal characters.
!Descriptions — 49 description issue(s) found.
create_element: description adds nothing beyond the tool name ("Create a new Excalidraw element")
create_element.type: parameter has no description
create_element.x: parameter has no description
create_element.y: parameter has no description
create_element.width: parameter has no description
create_element.height: parameter has no description
create_element.backgroundColor: parameter has no description
create_element.strokeColor: parameter has no description
create_element.strokeWidth: parameter has no description
create_element.roughness: parameter has no description
create_element.opacity: parameter has no description
create_element.text: parameter has no description
create_element.fontSize: parameter has no description
create_element.fontFamily: parameter has no description
update_element: description adds nothing beyond the tool name ("Update an existing Excalidraw element")
update_element.id: parameter has no description
update_element.type: parameter has no description
update_element.x: parameter has no description
update_element.y: parameter has no description
update_element.width: parameter has no description
update_element.height: parameter has no description
update_element.backgroundColor: parameter has no description
update_element.strokeColor: parameter has no description
update_element.strokeWidth: parameter has no description
update_element.roughness: parameter has no description
update_element.opacity: parameter has no description
update_element.text: parameter has no description
update_element.fontSize: parameter has no description
update_element.fontFamily: parameter has no description
delete_element: description adds nothing beyond the tool name ("Delete an Excalidraw element")
delete_element.id: parameter has no description
query_elements.type: parameter has no description
query_elements.filter: parameter has no description
get_resource: description adds nothing beyond the tool name ("Get an Excalidraw resource")
get_resource.resource: parameter has no description
group_elements: description adds nothing beyond the tool name ("Group multiple elements together")
group_elements.elementIds: parameter has no description
ungroup_elements: description adds nothing beyond the tool name ("Ungroup a group of elements")
ungroup_elements.groupId: parameter has no description
align_elements: description adds nothing beyond the tool name ("Align elements to a specific position")
align_elements.elementIds: parameter has no description
align_elements.alignment: parameter has no description
distribute_elements: description adds nothing beyond the tool name ("Distribute elements evenly")
distribute_elements.elementIds: parameter has no description
distribute_elements.direction: parameter has no description
lock_elements: description adds nothing beyond the tool name ("Lock elements to prevent modification")
lock_elements.elementIds: parameter has no description
unlock_elements: description adds nothing beyond the tool name ("Unlock elements to allow modification")
unlock_elements.elementIds: parameter has no description
→ Descriptions are the model's only guide to when/how to call a tool — treat them as prompt engineering.
→ Describe every tool and every parameter, including units, formats, and constraints.
→ Each tool's description should say something the name doesn't, and should be unique to that tool.
!Tool annotations — Annotation coverage 0% (0/55 hint fields set).
• create_element: no annotations at all
• update_element: no annotations at all
• delete_element: no annotations at all
• query_elements: no annotations at all
• get_resource: no annotations at all
• group_elements: no annotations at all
• ungroup_elements: no annotations at all
• align_elements: no annotations at all
• distribute_elements: no annotations at all
• lock_elements: no annotations at all
• unlock_elements: no annotations at all
→ Add annotations: title, readOnlyHint, destructiveHint, idempotentHint, openWorldHint.
→ These let clients gate risky calls and give agents/users a friendly display name — optional but valuable.
!Tool titles — 11 of 11 tool(s) have no title.
• create_element: no top-level title (or annotations.title)
• update_element: no top-level title (or annotations.title)
• delete_element: no top-level title (or annotations.title)
• query_elements: no top-level title (or annotations.title)
• get_resource: no top-level title (or annotations.title)
• group_elements: no top-level title (or annotations.title)
• ungroup_elements: no top-level title (or annotations.title)
• align_elements: no top-level title (or annotations.title)
• distribute_elements: no top-level title (or annotations.title)
• lock_elements: no top-level title (or annotations.title)
• unlock_elements: no top-level title (or annotations.title)
→ Declare a top-level `title` on each tool — it gives clients a friendly display name distinct from the machine-readable `name`.
→ `annotations.title` (the older location) is also accepted, but the top-level `title` field is now the spec-preferred place for it.
!Server instructions — No top-level instructions declared.
→ Declare instructions to guide agents on when/how to use this server.
→ Return a non-empty `instructions` string in your InitializeResult — most SDKs let you set this alongside serverInfo.
✓Handshake + list latency — tools/list responded in 5ms.
add the badge
Paste into your README:
[](https://scoremcp.dev/servers/excalidraw-mcp)