Two modes are available. Try MCP first — it has more capabilities.
Works with
AI-first code editor with Composer
Before installing skills in Cursor, ensure your development environment meets these requirements:
node --versionexcalidraw-skillExecute the skills CLI command in your project's root directory to begin installation:
Fetches excalidraw-skill from yctimlin/mcp_excalidraw and configures it for Cursor.
The CLI shows a list of agents. Use arrow keys and space to select Cursor:
Confirm successful installation by checking the skill directory location:
Restart Cursor to activate excalidraw-skill. Access via /excalidraw-skill in your agent's command palette.
We perform automated surface-level scans (Gen AI Scanner, Socket, Snyk) during installation. These checks detect common vulnerabilities but do not guarantee complete security. Always review skill source code and verify the publisher's reputation before production use.
Skills execute code in your environment. Always review source, verify the publisher, and test in isolation before production.
Submit your Claude Code skill and start earning
Create detailed user stories, acceptance criteria, and feature specs
Example
Generate user stories for 'password reset feature' with acceptance criteria, edge cases, and test scenarios
Reduce spec writing time by 50%, ensure comprehensive coverage
Research competitors, compare features, identify gaps
Example
Analyze 5 competitor products, create feature comparison matrix, suggest differentiation opportunities
Complete competitive research in 2 hours instead of 2 days
Evaluate features using frameworks (RICE, ICE, Kano) and create prioritized backlogs
Example
Score 20 feature ideas using RICE framework, generate prioritized roadmap with rationale
8
total installs
8
this week
1.6K
GitHub stars
0
upvotes
Run in your terminal
8
installs
8
this week
1.6K
stars
Two modes are available. Try MCP first — it has more capabilities.
MCP mode (preferred): If excalidraw/batch_create_elements and other excalidraw/* tools appear in your tool list, use them directly. MCP tools handle label and arrow binding format automatically.
REST API mode (fallback): If MCP tools aren't available, use HTTP endpoints at http://localhost:3000. See the cheatsheet for REST payloads. Note the format differences in the table below — REST and MCP accept slightly different field names.
Neither works? Tell the user:
The Excalidraw canvas server is not running. To set up:
git clone https://github.com/yctimlin/mcp_excalidraw && cd mcp_excalidrawnpm ci && npm run buildPORT=3000 npm run canvas- Open
http://localhost:3000in a browser- (Recommended) Install the MCP server:
claude mcp add excalidraw -s user -e EXPRESS_SERVER_URL=http://localhost:3000 -- node /path/to/mcp_excalidraw/dist/index.js
| Operation | MCP Tool | REST API Equivalent |
|---|---|---|
| Create elements | batch_create_elements |
POST /api/elements/batch |
| Get all elements | query_elements |
GET /api/elements |
| Get one element | get_element |
GET /api/elements/:id |
| Update element | update_element |
PUT /api/elements/:id |
| Delete element | delete_element |
DELETE /api/elements/:id |
| Clear canvas | clear_canvas |
DELETE /api/elements/clear |
| Describe scene | describe_scene |
GET /api/elements (parse manually) |
| Export scene | export_scene |
GET /api/elements (save to file) |
| Import scene | import_scene |
POST /api/elements/sync |
| Snapshot | snapshot_scene |
POST /api/snapshots |
| Restore snapshot | restore_snapshot |
GET /api/snapshots/:name then POST /api/elements/sync |
| Screenshot | get_canvas_screenshot |
POST /api/export/image (needs browser) |
| Viewport | set_viewport |
POST /api/viewport (needs browser) |
| Export image | export_to_image |
POST /api/export/image (needs browser) |
| Export URL | export_to_excalidraw_url |
Only via MCP |
"text": "My Label" on shapes (auto-converts). REST requires "label": {"text": "My Label"}.startElementId/endElementId. REST requires "start": {"id": "..."} / "end": {"id": "..."}."1") or omit entirely. Never pass a number."label" in the PUT body to ensure it renders correctly after updates.The canvas uses a 2D coordinate grid: (0, 0) is the origin, x increases rightward, y increases downward. Plan your layout before writing any JSON.
General spacing guidelines:
max(160, labelCharCount * 9) to prevent text truncationThese are the most common mistakes that produce unreadable diagrams. Avoid all of them.
label.text (or text) on large background zone rectanglesWhen you put a label on a background rectangle, Excalidraw creates a bound text element centered in the middle of that shape — right where your service boxes will be placed. The text overlaps everything inside the zone and cannot be repositioned.
Wrong:
{"id": "vpc-zone", "type": "rectangle", "x": 50, "y": 50, "width": 800, "height": 400, "text": "VPC (10.0.0.0/16)"}
Right — use a free-standing text element anchored at the top of the zone:
{"id": "vpc-zone", "type": "rectangle", "x": 50, "y": 50, "width": 800, "height": 400, "backgroundColor": "#e3f2fd"},
{"id": "vpc-label", "type": "text", "x": 70, "y": 60, "width": 300, "height": 30, "text": "VPC (10.0.0.0/16)", "fontSize": 18, "fontWeight": "bold"}
The free-standing text element sits at the top corner of the zone and doesn't interfere with elements placed inside.
An arrow from an element in one layout zone to an element in a distant zone will draw a long diagonal line crossing through everything in between. In a multi-zone infra diagram this produces an unreadable tangle of spaghetti.
Design rule: Keep arrows within the same zone or tier. To show cross-zone relationships, use annotation text or separate the zones so their edges are adjacent (no elements between them), and route the arrow along the edge.
If you must connect across zones, use an elbowed arrow that travels along the perimeter — never through the middle of another zone.
Arrow labels are placed at the midpoint of the arrow. On short arrows, they overlap the shapes at both ends. On crowded diagrams, they collide with nearby elements.
Excalidraw diagrams are visual communication. If text is cut off, elements overlap, or arrows cross through unrelated shapes, the diagram becomes confusing and unprofessional — it defeats the whole purpose of drawing it. So after every batch of elements, verify before adding more.
After each batch_create_elements / POST /api/elements/batch, take a screenshot and check:
width and/or height.text/label.text on a background zone rectangle, the zone label will be centered in the middle of the zone, overlapping everything inside. Fix: delete the bound text element and add a free-standing text element at the top of the zone instead (see Layout Anti-Patterns above).If you find any issue: stop, fix it, re-screenshot, then continue. Say "I see [issue], fixing it" rather than glossing over problems. Only proceed once all checks pass.
Use create_from_mermaid when: the user already has a Mermaid diagram, or the structure maps cleanly to a flowchart/sequence/ER diagram with standard Mermaid syntax. It's fast and handles conversion automatically, though you get less control over exact layout.
Use batch_create_elements directly when: you need precise layout control, the diagram type doesn't map to Mermaid well (e.g., custom architecture, annotated cloud diagrams), or you want elements positioned in a specific coordinate grid.
read_diagram_guide for design best practices (colors, fonts, anti-patterns).clear_canvas to start fresh.batch_create_elements — create shapes and arrows in one call. Custom id fields (e.g. "id": "auth-svc") make later updates easy.max(160, labelLength * 9). Use text field for labels.startElementId / endElementId — they auto-route to element edges.set_viewport with scrollToContent: true to auto-fit.get_canvas_screenshot → run Quality Checklist → fix issues before next iteration.MCP element + arrow example:
{"elements": [
{"id": "lb", "type": "rectangle", "x": 300, "y": 50, "width": 180, "height": 60, "text": "Load Balancer"},
{"id": "svc-a", "type": "rectangle", "x": 100, "y": 200, "width": 160, "height": 60, "text": "Web Server 1"},
{"id": "svc-b", "type": "rectangle", "x": 450, "y": 200, "width": 160, "height": 60, "text": "Web Server 2"},
{"id": "db", "type": "rectangle", "x": 275, "y": 350, "width": 210, "height": 60, "text": "PostgreSQL"},
{"type": "arrow", "x": 0, "y": 0, "startElementId": "lb", "endElementId": "svc-a"},
{"type": "arrow", "x": 0, "y": 0, "startElementId": "lb", "endElementId": "svc-b"},
{"type": "arrow", "x": 0, "y": 0, "startElementId": "svc-a", "endElementId": "db"},
{"type": "arrow", "x": 0, "y": 0, "startElementId": "svc-b", "endElementId": "db"}
]}
curl -X DELETE http://localhost:3000/api/elements/clearPOST /api/elements/batch. Use "label": {"text": "..."} for labels."start": {"id": "..."} / "end": {"id": "..."}.POST /api/export/image → save PNG → run Quality Checklist.REST API element + arrow example:
curl -X POST http:Make data-driven prioritization decisions faster
Draft PRDs, status updates, and stakeholder presentations
Example
Create executive summary of Q3 roadmap, monthly progress report, feature launch announcement
Save 3-5 hours/week on communication overhead
Prerequisites
Time Estimate
30-60 minutes to see productivity improvements
Steps
Common Pitfalls
✓ Do
✗ Don't
💡 Pro Tips
✓ Use when
Use for user story writing, competitive research, roadmap prioritization, stakeholder communication, and PRD drafting. Best for reducing repetitive documentation and research work.
✗ Avoid when
Avoid for strategic product vision (requires deep customer empathy), pricing decisions (needs market and financial expertise), or when face-to-face customer discovery is more valuable than speed.
mattpocock/skills
parcadei/continuous-claude-v3
cursor/plugins
ailabs-393/ai-labs-claude-skills
pproenca/dot-skills
mattpocock/skills
excalidraw-skill is among the better-maintained entries we tried; worth keeping pinned for repeat workflows.
excalidraw-skill reduced setup friction for our internal harness; good balance of opinion and flexibility.
Keeps context tight: excalidraw-skill is the kind of skill you can hand to a new teammate without a long onboarding doc.
excalidraw-skill reduced setup friction for our internal harness; good balance of opinion and flexibility.
Useful defaults in excalidraw-skill — fewer surprises than typical one-off scripts, and it plays nicely with `npx skills` flows.
Registry listing for excalidraw-skill matched our evaluation — installs cleanly and behaves as described in the markdown.
Useful defaults in excalidraw-skill — fewer surprises than typical one-off scripts, and it plays nicely with `npx skills` flows.
We added excalidraw-skill from the explainx registry; install was straightforward and the SKILL.md answered most questions upfront.
excalidraw-skill fits our agent workflows well — practical, well scoped, and easy to wire into existing repos.
Solid pick for teams standardizing on skills: excalidraw-skill is focused, and the summary matches what you get after install.
showing 1-10 of 67