Skip to main content
Glama
chlee1001

ExcaliDash MCP

by chlee1001

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 API

Related 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-a6969c9

0.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이라 상태 코드만으로는 구분되지 않습니다.

응답

의미

드로잉 구조 요약 텍스트

정상 동작

{"error":"Forbidden","message":"API key is not authorized for this route"}

v0.5.x. Agent API가 없어 인증 단계에서 차단됨

{"error":"AI features disabled",...}

v0.6이지만 관리자가 AI 기능을 꺼 둠

{"error":"Drawing not found"}

드로잉 ID가 틀렸거나 소유자가 아님

{"error":"Engine mismatch",...}

tldraw 드로잉. Excalidraw 드로잉으로 시도해야 함

API 키 발급

ExcaliDash에서 Settings → API Keys로 이동합니다. 이름을 입력하고 아래 스코프를 선택한 뒤 키를 생성합니다.

  • Read drawings

  • Write 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=9003

ExcaliDash도 같은 호스트의 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 down

Compose는 포트를 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 start

stdio 클라이언트 설정 예시:

{
  "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}"
      }
    }
  }
}

제공 도구

도구

설명

list_drawings

드로잉 목록을 페이지 단위로 조회하고 이름으로 검색합니다.

select_drawing

이후 호출에서 사용할 기본 드로잉을 선택합니다.

get_selected_drawing

현재 MCP 세션에서 선택한 드로잉 ID를 반환합니다.

create_drawing

빈 Excalidraw 드로잉을 만들고 기본값으로 선택합니다.

get_drawing_summary

이름, 버전, 요소 관계를 담은 구조 요약을 읽습니다.

inspect_drawing_element

요소 원본 JSON과 바인딩된 자식 요소를 읽습니다.

apply_drawing_ops

최대 50개의 편집 연산을 원자적으로 적용합니다.

get_drawing_summary, inspect_drawing_element, apply_drawing_opsdrawingId를 직접 전달하면 현재 선택값 대신 해당 드로잉을 사용합니다.

편집 연산

연산

기능

add_shape

사각형, 타원, 다이아몬드, 텍스트, 프레임 생성

connect

두 요소를 화살표 또는 선으로 연결

set_text

텍스트 변경

set_style

색상, 채우기, 선, 투명도, 글꼴 등의 스타일 변경

move

상대 거리 또는 절대 좌표로 이동

resize

너비와 높이 변경

align

좌우·상하·가운데 정렬

distribute

가로 또는 세로 간격 분배

layout

가로, 세로, 그리드 자동 배치

group

여러 요소 그룹화

delete

요소 삭제

import_elements

Excalidraw 요소 배열 가져오기

revert_to_snapshot

지정한 스냅샷 버전으로 복원

배치 예시:

{
  "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

없음

ExcaliDash 공개 URL 또는 내부 URL. /api는 생략해도 됩니다.

EXCALIDASH_API_KEY

없음

Read drawings, Write drawings 스코프를 가진 계정 API 키

EXCALIDASH_TOKEN

아니요

없음

이전 설정과의 호환을 위한 API 키 별칭

EXCALIDASH_DRAWING_ID

아니요

없음

시작할 때 선택할 기본 드로잉 ID

MCP_HTTP_HOST

HTTP만

0.0.0.0

컨테이너 내부 HTTP 바인드 주소

MCP_HTTP_PORT

HTTP만

8080

컨테이너 내부 HTTP 포트

MCP_MAX_BODY_BYTES

아니요

10485760

HTTP 요청 본문 최대 크기

MCP_MAX_SESSIONS

아니요

64

동시에 유지할 MCP 세션 수 상한. 초과하면 429를 반환합니다.

MCP_SESSION_IDLE_MS

아니요

1800000

유휴 세션을 정리하기까지의 시간(밀리초)

MCP_PORT

Compose만

9003

호스트 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:http

Docker 이미지 빌드:

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_drawingsselect_drawing을 호출하거나 도구 인자에 drawingId를 전달합니다.

ENGINE_MISMATCH

대상 드로잉이 tldraw 엔진으로 생성되었습니다. Excalidraw 드로잉을 선택하거나 새로 만드십시오.

9003 포트를 이미 사용 중

.env에서 호스트 포트를 바꿉니다.

MCP_PORT=9010

MCP 클라이언트 URL도 http://127.0.0.1:9010/mcp로 변경해야 합니다.

라이선스

MIT License

Available Tools

7 tools
apply_drawing_opsA

Atomically apply up to 50 semantic operations. Uses drawingId when provided, otherwise the selected drawing. Read the summary first.

ParametersJSON Schema
NameRequiredDescriptionDefault
opsYes
drawingIdNo
clientBatchIdNo

TDQS

A3.9/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
selectNo

TDQS

B3.2/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 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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters1/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
drawingIdNo

TDQS

A3.9/5.0
Behavior3/5

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.

Conciseness5/5

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.

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 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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

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 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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
drawingIdNo
elementIdYes

TDQS

B3.3/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 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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
offsetNo
searchNo

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
drawingIdYes

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 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.

Conciseness5/5

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.

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 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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 7 tool updatesv0.3.1
    • First observedapply_drawing_ops
    • First observedcreate_drawing
    • First observedget_drawing_summary
    • First observedget_selected_drawing
    • First observedinspect_drawing_element
    • First observedlist_drawings
    • First observedselect_drawing

TDQS

A3.9/5.0

Scored across 7 tools

Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivitySlowing
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers