ExcaliDash MCP
Provides tools for viewing and editing Excalidraw drawings through a self-hosted ExcaliDash server, including listing and selecting drawings, creating new drawings, fetching structural summaries, inspecting elements, and applying batch semantic operations such as adding shapes, connectors, text, styling, alignment, and grouping.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@ExcaliDash MCPList my drawings and summarize the 'Q3 roadmap' drawing."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
ExcaliDash MCP
셀프호스팅한 ExcaliDash의 드로잉을 MCP 클라이언트에서 조회하고 편집하는 서버입니다. ExcaliDash v0.6 계열의 Drawing Agent API를 얇게 감싸며 stdio와 Streamable HTTP를 지원합니다. 이 저장소는 ExcaliDash 공식 프로젝트가 아닌 독립 MCP 어댑터입니다.
지원 기능
드로잉 목록 조회와 이름 검색
작업할 드로잉 선택
빈 Excalidraw 드로잉 생성
구조 요약 조회
요소와 바인딩된 자식 요소 조회
최대 50개의 시맨틱 연산을 하나의 배치로 적용
HTTP 세션별 드로잉 선택 상태 분리
열려 있는 ExcaliDash 편집 화면에 변경 사항 실시간 반영
MCP 클라이언트
│
├─ stdio ───────────────┐
│ │
└─ Streamable HTTP ─ ExcaliDash MCP ─ HTTPS/REST ─ ExcaliDash
:9003/mcp v0.6 Agent APIRelated MCP server: excalidraw-mcp
요구 사항
ExcaliDash v0.6.0-dev 이상 (Drawing Agent API 포함)
Excalidraw 엔진으로 만든 드로잉
Node.js 20 이상 또는 Docker Compose
Read drawings,Write drawings스코프를 가진 ExcaliDash 계정 API 키ExcaliDash Settings에서 활성화된 AI 기능
ExcaliDash 버전 확인
Drawing Agent API(ops, summary, elements)는 v0.6.0-dev에서 추가되었습니다. v0.5.x에는 해당 엔드포인트가 없어 이 MCP 서버가 동작하지 않습니다.
2026년 8월 기준 안정판은 v0.5.1이고 0.6.0 정식 릴리스는 아직 없습니다. :latest 이미지로 배포했다면 v0.5.x이므로 프리릴리스 태그로 올려야 합니다.
services:
backend:
image: zimengxiong/excalidash-backend:0.6.0-dev-a6969c9
frontend:
image: zimengxiong/excalidash-frontend:0.6.0-dev-a6969c90.6.0-dev-a6969c9는 특정 빌드에 고정된 태그이고, dev는 새 프리릴리스마다 내용이 바뀌는 롤링 태그입니다.
업그레이드 전에 백엔드 볼륨(SQLite DB와 secrets)을 백업하십시오. 마이그레이션 후 이미지만 되돌리는 것은 안전한 롤백이 아닙니다.
버전이 맞는지 확인하려면 API 키로 실제 Agent API를 호출해 봅니다.
curl -sS -H "Authorization: Bearer $EXCALIDASH_API_KEY" \
https://your-excalidash/api/drawings/<drawing-id>/summary응답 본문으로 원인을 구분합니다. v0.5.x와 AI 비활성화 상태는 둘 다 403이라 상태 코드만으로는 구분되지 않습니다.
응답 | 의미 |
드로잉 구조 요약 텍스트 | 정상 동작 |
| v0.5.x. Agent API가 없어 인증 단계에서 차단됨 |
| v0.6이지만 관리자가 AI 기능을 꺼 둠 |
| 드로잉 ID가 틀렸거나 소유자가 아님 |
| tldraw 드로잉. Excalidraw 드로잉으로 시도해야 함 |
API 키 발급
ExcaliDash에서 Settings → API Keys로 이동합니다. 이름을 입력하고 아래 스코프를 선택한 뒤 키를 생성합니다.
Read drawingsWrite drawings
키 전체 값은 생성 직후 한 번만 표시됩니다. Read collections, Write collections는 이 MCP 서버에서 사용하지 않습니다.
드로잉별 Agent Token은 한 드로잉에만 접근할 때 쓸 수 있습니다. 이 서버에서 목록 조회와 신규 생성을 사용하려면 계정 API 키가 필요합니다.
Docker로 실행
저장소를 받은 뒤 환경변수 파일을 만듭니다.
cp .env.example .env
chmod 600 .env.env에 ExcaliDash 주소와 API 키를 입력합니다.
EXCALIDASH_URL=http://host.docker.internal:6767
EXCALIDASH_API_KEY=발급받은-키
MCP_PORT=9003ExcaliDash도 같은 호스트의 Docker에서 실행 중이라면 컨테이너 내부의 localhost를 사용하면 안 됩니다. macOS·Windows·이 저장소의 Linux Compose 설정에서는 host.docker.internal로 호스트에 접근합니다. Tailscale이나 리버스 프록시 주소가 있다면 HTTPS URL을 직접 넣어도 됩니다.
컨테이너를 빌드하고 시작합니다.
docker compose up -d --build
docker compose ps기본 엔드포인트:
MCP: http://127.0.0.1:9003/mcp
Health: http://127.0.0.1:9003/health상태와 로그 확인:
curl --fail http://127.0.0.1:9003/health
docker compose logs -f excalidash-mcp종료:
docker compose downCompose는 포트를 loopback에만 연결하고 컨테이너를 비루트 사용자, 읽기 전용 root filesystem, capability 제거 상태로 실행합니다.
GJC에 등록
프로젝트 디렉터리에서 실행합니다.
gjc mcp add excalidash \
--project \
--force \
--type http \
--url http://127.0.0.1:9003/mcp생성되는 .gjc/mcp.json은 다음과 같습니다.
{
"mcpServers": {
"excalidash": {
"sharing": "per-session",
"type": "http",
"url": "http://127.0.0.1:9003/mcp"
}
}
}설정 파일을 지정해 GJC를 실행합니다.
gjc --mcp-config "$PWD/.gjc/mcp.json"사용 중인 GJC 실행 래퍼가 가장 가까운 .gjc/mcp.json을 자동으로 찾는다면 평소처럼 gjc만 실행하면 됩니다.
도구 이름은 다음 형식으로 노출됩니다.
mcp__excalidash_list_drawings
mcp__excalidash_select_drawing
mcp__excalidash_get_selected_drawing
mcp__excalidash_create_drawing
mcp__excalidash_get_drawing_summary
mcp__excalidash_inspect_drawing_element
mcp__excalidash_apply_drawing_ops예시 요청:
ExcaliDash 드로잉 목록을 보여줘.
"서비스 아키텍처" 드로잉을 선택하고 현재 구조를 요약해줘.
새 드로잉을 만든 뒤 API Gateway, Worker, PostgreSQL을 그리고 흐름대로 연결해줘.다른 MCP 클라이언트에 등록
Streamable HTTP를 지원하는 클라이언트에는 아래 URL을 등록합니다.
http://127.0.0.1:9003/mcp클라이언트 설정 형식이 JSON이라면 다음 형태를 사용합니다.
{
"mcpServers": {
"excalidash": {
"type": "http",
"url": "http://127.0.0.1:9003/mcp"
}
}
}stdio로 실행
Docker 없이 로컬 프로세스로 실행할 수도 있습니다.
npm ci
npm run build
EXCALIDASH_URL=https://draw.example.com \
EXCALIDASH_API_KEY=발급받은-키 \
npm startstdio 클라이언트 설정 예시:
{
"mcpServers": {
"excalidash": {
"command": "node",
"args": ["/absolute/path/to/excalidash-mcp/dist/index.js"],
"env": {
"EXCALIDASH_URL": "https://draw.example.com",
"EXCALIDASH_API_KEY": "${EXCALIDASH_API_KEY}"
}
}
}
}제공 도구
도구 | 설명 |
| 드로잉 목록을 페이지 단위로 조회하고 이름으로 검색합니다. |
| 이후 호출에서 사용할 기본 드로잉을 선택합니다. |
| 현재 MCP 세션에서 선택한 드로잉 ID를 반환합니다. |
| 빈 Excalidraw 드로잉을 만들고 기본값으로 선택합니다. |
| 이름, 버전, 요소 관계를 담은 구조 요약을 읽습니다. |
| 요소 원본 JSON과 바인딩된 자식 요소를 읽습니다. |
| 최대 50개의 편집 연산을 원자적으로 적용합니다. |
get_drawing_summary, inspect_drawing_element, apply_drawing_ops에 drawingId를 직접 전달하면 현재 선택값 대신 해당 드로잉을 사용합니다.
편집 연산
연산 | 기능 |
| 사각형, 타원, 다이아몬드, 텍스트, 프레임 생성 |
| 두 요소를 화살표 또는 선으로 연결 |
| 텍스트 변경 |
| 색상, 채우기, 선, 투명도, 글꼴 등의 스타일 변경 |
| 상대 거리 또는 절대 좌표로 이동 |
| 너비와 높이 변경 |
| 좌우·상하·가운데 정렬 |
| 가로 또는 세로 간격 분배 |
| 가로, 세로, 그리드 자동 배치 |
| 여러 요소 그룹화 |
| 요소 삭제 |
| Excalidraw 요소 배열 가져오기 |
| 지정한 스냅샷 버전으로 복원 |
배치 예시:
{
"ops": [
{
"op": "add_shape",
"ref": "api",
"shape": "rectangle",
"x": 100,
"y": 100,
"w": 240,
"h": 100,
"label": "API Gateway"
},
{
"op": "add_shape",
"ref": "db",
"shape": "rectangle",
"x": 500,
"y": 100,
"w": 240,
"h": 100,
"label": "PostgreSQL"
},
{
"op": "connect",
"fromId": "api",
"toId": "db",
"label": "query"
}
],
"clientBatchId": "architecture-001"
}같은 배치에서 만든 요소는 ref 값으로 참조합니다.
환경변수
이름 | 필수 | 기본값 | 설명 |
| 예 | 없음 | ExcaliDash 공개 URL 또는 내부 URL. |
| 예 | 없음 |
|
| 아니요 | 없음 | 이전 설정과의 호환을 위한 API 키 별칭 |
| 아니요 | 없음 | 시작할 때 선택할 기본 드로잉 ID |
| HTTP만 |
| 컨테이너 내부 HTTP 바인드 주소 |
| HTTP만 |
| 컨테이너 내부 HTTP 포트 |
| 아니요 |
| HTTP 요청 본문 최대 크기 |
| 아니요 |
| 동시에 유지할 MCP 세션 수 상한. 초과하면 |
| 아니요 |
| 유휴 세션을 정리하기까지의 시간(밀리초) |
| Compose만 |
| 호스트 loopback에 공개할 포트 |
보안
HTTP MCP 엔드포인트에는 별도 인증 계층이 없습니다. 기본 Compose처럼 반드시 127.0.0.1에만 포트를 연결하거나 인증된 내부 프록시 뒤에 두십시오. 0.0.0.0:9003:8080처럼 LAN에 직접 공개하지 마십시오.
네트워크 노출
HTTP 서버는 /mcp 요청에 Host·Origin 검증을 적용하고, 요청 본문 크기와 동시 세션 수를 제한하며, 잘못된 요청 헤더가 프로세스를 중단시키지 못하도록 요청 처리를 격리합니다.
Host 헤더 검증은 브라우저발 DNS 리바인딩만 막습니다. 직접 접속하는 공격자는 Host 값을 위조할 수 있으므로 실제 접근 통제는 loopback 바인딩이나 앞단 프록시가 담당해야 합니다.
API 키 취급
계정 API 키에는 사용자가 소유한 드로잉을 조회하고 수정할 권한이 있습니다.
.env를 Git에 커밋하지 마십시오.API 키를 로그, 이슈, 스크린샷에 남기지 마십시오.
필요한 스코프만 발급하십시오.
키가 노출되면 ExcaliDash Settings에서 폐기하고 새 키를 발급하십시오.
제한 사항
Agent API 편집은 Excalidraw 엔진만 지원합니다. tldraw 드로잉은
ENGINE_MISMATCH오류를 반환합니다.컬렉션 스코프를 받아도 현재 MCP 도구는 컬렉션 CRUD를 제공하지 않습니다.
드로잉 삭제 도구는 제공하지 않습니다.
delete연산은 드로잉 안의 요소를 삭제합니다.HTTP 세션이 종료되면 선택한 드로잉 상태도 사라집니다.
drawingId를 직접 전달하면 선택 상태에 의존하지 않습니다.
개발
npm ci
npm test
npm run build
npm run start:httpDocker 이미지 빌드:
docker build -t excalidash-mcp:local .테스트에는 HTTP 헬스체크, stdio MCP 호출, Streamable HTTP 세션 상태, ExcaliDash API 요청 형식 검증이 포함됩니다.
문제 해결
403 Forbidden
세 가지 원인이 같은 상태 코드를 씁니다. 응답 본문으로 구분합니다.
API key is not authorized for this route— ExcaliDash가 v0.5.x입니다. 버전 확인을 참고해 업그레이드합니다.AI features disabled— Settings에서 AI 기능을 켭니다.그 외 — API 키에
Read drawings,Write drawings스코프가 있는지 확인합니다.
401 Unauthorized
API 키 값이 잘못되었거나 폐기되었습니다. Settings에서 새 키를 발급합니다.
컨테이너에서 ExcaliDash에 연결할 수 없음
EXCALIDASH_URL=http://localhost:6767을 사용하지 않았는지 확인합니다. 같은 호스트의 서비스에는 http://host.docker.internal:6767을 사용합니다.
No drawing selected
list_drawings 후 select_drawing을 호출하거나 도구 인자에 drawingId를 전달합니다.
ENGINE_MISMATCH
대상 드로잉이 tldraw 엔진으로 생성되었습니다. Excalidraw 드로잉을 선택하거나 새로 만드십시오.
9003 포트를 이미 사용 중
.env에서 호스트 포트를 바꿉니다.
MCP_PORT=9010MCP 클라이언트 URL도 http://127.0.0.1:9010/mcp로 변경해야 합니다.
라이선스
Available Tools
7 toolsapply_drawing_opsA
Atomically apply up to 50 semantic operations. Uses drawingId when provided, otherwise the selected drawing. Read the summary first.
| Name | Required | Description | Default |
|---|---|---|---|
| ops | Yes | ||
| drawingId | No | ||
| clientBatchId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the transparency burden. It discloses atomicity, the 50-operation limit, and the drawing-target fallback behavior. However, it does not mention that operations may be destructive (e.g., delete, revert_to_snapshot), failure semantics, or what happens on partial failure, so coverage is only partial.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is only two sentences, front-loads the core purpose ('Atomically apply...'), and contains no redundant detail. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a complex tool with many operation types, no output schema, and no annotations. The description covers essential preconditions (read summary first) and target resolution, but it omits details about individual operation semantics, error behavior, and return values. It is minimally adequate given the rich schema, but not comprehensive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It adds meaning for drawingId (used when provided, otherwise selected drawing) and reinforces the 50-operation cap, but it does not explain the ops array structure or clientBatchId. The schema's const values and required fields are self-descriptive, but clientBatchId remains unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Atomically apply up to 50 semantic operations,' clearly identifying a batch mutation tool for drawing elements. The verb 'apply' and the resource 'semantic operations' distinguish it from sibling read/inspection tools such as get_drawing_summary and inspect_drawing_element.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly explains target resolution: 'Uses drawingId when provided, otherwise the selected drawing.' It also instructs 'Read the summary first,' implying a dependency on get_drawing_summary, though it does not state exclusions or when alternative mutation tools would be preferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_drawingB
Create a new empty Excalidraw drawing and optionally select it as the default target.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| select | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full responsibility. It discloses the optional selection side effect but omits details about permissions, return values, failure modes, or the meaning of 'default target.' This is insufficient for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no wasted words. It begins with the action and covers the core purpose efficiently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter create operation, the description is adequate but not fully complete. It does not clarify what 'default target' means, what the tool returns, or any side effects, and with no annotations, additional context would be valuable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description does not explain the 'name' parameter or adequately detail the 'select' parameter. It says 'optionally select' but fails to convey that this controls the boolean 'select' field or how 'name' is used.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool creates a new empty Excalidraw drawing and optionally selects it as the default target. It uses a specific verb and resource, distinguishing it from sibling tools like select_drawing or list_drawings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when a new drawing is needed, but it does not explicitly mention when to use this tool versus alternatives or any exclusions. It lacks clear guidance on the decision between creating and selecting an existing drawing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_drawing_summaryA
Read a compact structural summary of a drawing. Uses drawingId when provided, otherwise the selected drawing.
| Name | Required | Description | Default |
|---|---|---|---|
| drawingId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations available, the description carries the full burden. It discloses the read-only nature ('Read') and the fallback behavior ('Uses drawingId when provided, otherwise the selected drawing'). However, it does not mention potential errors when no drawing is selected or what the returned summary contains.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences with no redundancy. It front-loads the core action ('Read a compact structural summary') and adds only the necessary fallback detail. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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, the description covers the main behavior but leaves gaps: no output schema exists, so the return value of the 'structural summary' is not defined. Error handling when neither drawingId nor a selected drawing is available is also unspecified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains the single parameter drawingId's purpose and optionality, including the fallback to the selected drawing. This adds meaningful semantics beyond the bare schema, though it doesn't elaborate on ID format or source.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Read a compact structural summary of a drawing.' This uses a specific verb ('Read') and resource ('compact structural summary'), distinguishing it from sibling tools like get_selected_drawing or inspect_drawing_element.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use this tool (to get a summary) but does not explicitly contrast it with alternatives. It provides context on parameter usage via the fallback rule, but no explicit when-to-use/when-not-to-use guidance is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_selected_drawingA
Return the drawing currently selected by this MCP process.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the behavioral burden. It does add useful context by specifying that selection is process-specific and that the action is a non-mutating 'Return'. However, it does not disclose behavior for an empty selection or the exact shape of what is returned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence contains all necessary information with no filler or redundancy. It avoids restating the tool name and is appropriately sized for a trivial getter.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
While the tool is simple (zero params), the lack of an output schema and annotations means the description should specify what 'drawing' returns (e.g., object, ID) and what happens if no drawing is selected. It covers the core purpose but leaves edge-case and return-shape details undetermined.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and the schema provides complete coverage (100% vacuously). Per the rubric, zero-parameter tools receive a base score of 4; the description adds meaning by indicating that the tool relies on existing process selection state rather than arguments.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Return') and a specific resource ('the drawing currently selected by this MCP process'), and it clearly differentiates from sibling tools like list_drawings (returns all drawings) and select_drawing (changes the selection).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'currently selected' implies this should be used after a selection has been made via select_drawing, but the description does not explicitly state when to use it versus alternatives or what happens if there is no current selection. Usage is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inspect_drawing_elementB
Inspect one element and its bound children. Uses drawingId when provided, otherwise the selected drawing.
| Name | Required | Description | Default |
|---|---|---|---|
| drawingId | No | ||
| elementId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden for behavioral disclosure. It implies a read-only operation via 'Inspect' but does not confirm side effects, permissions, or return behavior. 'Bound children' is not defined, and output format is omitted.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence that front-loads the primary action and includes key selection logic without unnecessary words. It earns its place despite being short.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has no annotations and no output schema, the description is too minimal. It does not describe return values, the nature of 'bound children', or any operational context, leaving significant gaps for an agent to handle correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description compensates for the 0% schema coverage by explaining drawingId's selection logic ('Uses drawingId when provided, otherwise the selected drawing'). elementId is only implicitly described as the element to inspect, so not all parameter semantics are fully clarified.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Inspect') and the resource ('one element and its bound children'), which distinguishes it from sibling tools like get_drawing_summary or select_drawing. It is specific about the scope of the inspection.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides useful context by explaining how drawingId is used ('Uses drawingId when provided, otherwise the selected drawing'), giving clear guidance on parameter selection. However, it does not explicitly compare with alternatives or state when-not-to-use, leaving the choice somewhat implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_drawingsA
List ExcaliDash drawings available to the account API key. Use this before selecting a drawing.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| offset | No | ||
| search | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden of disclosing behavioral traits. It mentions the account API key scope, which is useful, but does not describe pagination behavior, return format, or whether it reads from a cache. For a simple list operation, this is average but not rich in context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise: two sentences with no wasted words. The first sentence states the action, the second provides usage context. It is well-structured and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is straightforward, and the description provides the essential purpose and temporal usage. However, with no output schema and no annotations, the description does not mention what the tool returns, such as drawing IDs or metadata, nor does it discuss default pagination or search semantics. This leaves some gaps for a complete understanding.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description does not elaborate on the parameters (limit, offset, search). While the schema provides names and defaults, the description fails to clarify the meaning of 'search' (e.g., search by name, content, etc.) or how pagination works, leaving significant interpretation to the agent.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'List' and the resource 'ExcaliDash drawings available to the account API key', which precisely defines the tool's scope. It distinguishes itself from sibling tools like select_drawing by indicating this is a listing operation, not a selection or creation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'Use this before selecting a drawing' provides explicit temporal guidance relative to the sibling tools. It tells the agent when to invoke this tool, though it does not explicitly mention alternatives or when not to use it, leaving some room for ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
select_drawingA
Select an Excalidraw drawing as the default target for subsequent tools in this MCP process.
| Name | Required | Description | Default |
|---|---|---|---|
| drawingId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the full behavioral burden. It discloses that the tool sets a process-scoped default target, which is the core behavior. However, it does not mention input validation, behavior on invalid IDs, overwriting previous selections, or return values. This leaves meaningful gaps for a state-changing tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence of 15 words, front-loading the verb and resource. It contains no filler or redundant information, making it highly concise and well structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter tool, the description covers the core purpose, but lacks details about return values (no output schema) and prerequisite steps like listing drawings to get a valid ID. It is adequate for a straightforward selection operation but not fully complete for an agent to invoke with confidence.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, and the description adds no information about drawingId beyond its name. It does not explain where to obtain the ID, whether it must reference an existing drawing, or any format expectations. The parameter name is self-explanatory, but the description fails to compensate for the lack of schema details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool selects an Excalidraw drawing as the default target for subsequent tools. This is a specific verb+resource+effect combination that also distinguishes it from siblings like get_selected_drawing (retrieve) and list_drawings (list).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context: use this tool to set a default target before invoking other tools. It does not explicitly mention alternatives or exclusions, but the phrase 'subsequent tools' implies the intended workflow. Since no alternatives are named, it stops short of a 5.
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.
7 tool updates
v0.3.1- First observed
apply_drawing_ops - First observed
create_drawing - First observed
get_drawing_summary - First observed
get_selected_drawing - First observed
inspect_drawing_element - First observed
list_drawings - First observed
select_drawing
TDQS
Scored across 7 tools
Each tool has a distinct purpose: selection state vs. catalog listing vs. selection mutation vs. creation vs. summary reading vs. element inspection vs. operations application. There is no overlapping or ambiguous tool that could cause an agent to misselect. The descriptions clearly delineate responsibilities.
All tool names follow a consistent verb_noun pattern using snake_case, with verbs like get, list, select, create, inspect, and apply. The pattern is predictable and uniform across the set, making it easy for an agent to infer behavior from the name.
With exactly 7 tools, the set is well-scoped for a drawing management MCP. Each tool serves a clear, non-redundant function, and the count is neither too sparse nor overwhelming for the stated purpose.
The toolset covers listing, creating, selecting, reading summaries, inspecting elements, and applying operations, which are core workflows. A notable gap is the absence of a delete_drawing tool, and there is no explicit tool for updating drawing metadata, but these are minor and can be worked around.
Maintenance
Related MCP Connectors
OCR, transcription, file extraction, and image generation for AI agents via MCP.
Create and manage Mermaid.js flowcharts and diagrams with AI agents via MCP.
Render, verify, describe, and safely edit Mermaid diagrams through MCP.
Agent-native notes, tasks, dev-docs, vaults, sync & handoffs. MCP + OpenAPI dual surface.
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables creation, management, and export of Excalidraw drawings through natural language. Supports CRUD operations on drawings and export to SVG, PNG, and JSON formats with file-based storage.82,455 npm-
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to create and manipulate live visual diagrams on an Excalidraw canvas in real-time via MCP tools.2,455 npm38 PyPI14BSD 3-Clause
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to collaboratively draw and annotate Excalidraw diagrams in real-time via MCP tools, synced to a browser canvas.8Apache 2.0
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to create, modify, and share diagrams on a live Excalidraw canvas through MCP tools, supporting shapes, text, arrows, batch operations, and export to shareable links with images.1,645 npm8MIT