内容
# Excalidraw MCP 服务器
[](https://opensource.org/licenses/MIT)
[](https://nodejs.org/)
[](https://www.typescriptlang.org/)
[](https://github.com/whallysson/excalidraw-mcp)
一个实现了模型上下文协议(MCP)的服务器,通过标准化的工具和资源,暴露 Excalidraw 图表能力,并结合一个独立的 React 前端进行可视化编辑。
## 功能
- 🎨 **MCP 协议集成**:通过 AI 助手以编程方式控制 Excalidraw
- 🖥️ **独立前端**:独立使用 Excalidraw 接口
- 🔄 **实时同步**:前端和 MCP 服务器之间的 WebSocket 同步
- 🐳 **Docker 支持**:本地或通过 Docker Compose 运行
- 📦 **TypeScript**:具有 Zod 验证的完全类型代码库
- 🧪 **充分测试**:单元、集成和 E2E 测试覆盖
## 快速开始
### 前提条件
- Node.js 18+(推荐 LTS 版本)
- Docker 和 Docker Compose(可选,用于容器部署)
### 本地开发
**选项 1:使用一个命令启动所有内容**(推荐)
```bash
# 安装依赖(仅第一次运行)
npm install
cd backend && npm install
cd ../frontend && npm install
cd ..
# 配置环境(仅第一次运行)
cp backend/.env.example backend/.env
cp frontend/.env.example frontend/.env
# 启动所有内容(MCP + HTTP/WebSocket + 前端)
npm run dev:all
```
该单个命令启动:
- `[MCP]` - 后端上的 MCP 服务器(stdio)
- `[HTTP]` - 端口 3333 上的 HTTP/WebSocket 服务器
- `[FRONTEND]` - 端口 5173 上的前端 Vite 开发服务器
在浏览器中打开 **http://localhost:5173**,开始创建图表!
**选项 2:单独启动服务**(用于调试)
```bash
# 终端 1:后端 MCP + HTTP/WebSocket 服务器
cd backend
npm run dev:all
# 终端 2:前端
cd frontend
npm run dev
```
**选项 3:独立进程**(高级)
```bash
# 终端 1:仅 HTTP/WebSocket 服务器
cd backend && npm run dev
# 终端 2:仅 MCP 服务器(用于 Claude Desktop 集成)
cd backend && npm run dev:mcp
# 终端 3:前端
cd frontend && npm run dev
```
### Docker 部署(生产环境)
**重要**:Docker 仅启动**前端 + HTTP/WebSocket 服务器**。**MCP 服务器**(stdio)必须**本地运行**,以便与 Claude Desktop 通信。
#### 单个容器
Docker 现在使用**1 个容器**,该容器结合了:
- ✅ 前端(React/Vite 静态构建)
- ✅ 后端 HTTP 服务器(Express + WebSocket)
- ❌ MCP 服务器 stdio(本地运行 - 参见下文)
#### Docker 命令
```bash
# 启动应用程序(前端 + HTTP/WebSocket)
docker-compose up -d
# 查看日志
docker-compose logs -f
# 重新构建后更改
docker-compose down
docker-compose build
docker-compose up -d
# 停止应用程序
docker-compose down
# 清理卷(删除画布数据)
docker-compose down -v
```
#### 访问应用程序
- **前端**:http://localhost:3333
- **健康检查**:http://localhost:3333/health
- **API**:http://localhost:3333/api/canvas/main
#### MCP 服务器(本地运行)
MCP 服务器使用 stdio 协议(stdin/stdout),**无法**在 Docker 中运行。本地运行:
```bash
# 单独终端:用于 Claude Desktop 的 MCP 服务器
cd backend
npm run dev:mcp
```
**Claude Desktop 配置**(`claude_desktop_config.json`):
```json
{
"mcpServers": {
"excalidraw": {
"command": "npx",
"args": ["tsx", "/absolute/path/backend/src/index.ts"],
"env": {
"HTTP_SERVER_URL": "http://localhost:3333"
}
}
}
}
```
#### 完整架构
```
┌─────────────────────────────────────────┐
│ Docker 容器(excalidraw-mcp) │
│ │
│ ┌──────────────┐ ┌────────────────┐ │
│ │ 前端 │ │ HTTP 服务器 │ │
│ │ (静态文件)│◄──┤ Express + WS │ │
│ └──────────────┘ └────────────────┘ │
│ │
│ 端口:3333 │
└─────────────────────────────────────────┘
▲
│ HTTP POST /api/canvas/*/broadcast
│
┌─────────────────┴───────────────────────┐
│ 本地进程(MCP 服务器) │
│ │
│ ┌──────────────────────────────────┐ │
│ │ MCP 服务器(stdio) │ │
│ │ JSON-RPC 2.0 协议 │ │
│ └──────────────────────────────────┘ │
│ ▲ │
│ │ stdin/stdout │
│ │ │
│ ┌───────────────┴──────────────────┐ │
│ │ Claude Desktop(MCP 客户端) │ │
│ └──────────────────────────────────┘ │
└─────────────────────────────────────────┘
```
#### 完整测试
运行自动化测试:
```bash
# 测试 Docker(前端、HTTP、API、健康检查)
./test-complete-flow.sh
# 查看详细结果
cat DOCKER_TEST_RESULTS.md
```
## 项目结构
```
├── backend/ # MCP 服务器
│ ├── src/
│ │ ├── mcp/ # MCP 工具和资源
│ │ ├── services/ # 画布管理、WebSocket、存储
│ │ ├── types/ # TypeScript 定义
│ │ └── utils/ # 日志记录、验证助手
│ └── tests/ # 单元和集成测试
├── frontend/ # React 前端
│ ├── src/
│ │ ├── hooks/ # WebSocket 客户端
│ │ ├── services/ # API 客户端
│ │ └── utils/ # 元素验证、转换
│ └── tests/ # E2E 测试
└── docker-compose.yml # 协调
```
## 安装
### 后端依赖
```bash
cd backend
npm install
```
### 前端依赖
```bash
cd frontend
npm install
```
## 本地设置
### 步骤 1:安装依赖
为后端和前端安装依赖:
```bash
# 后端
cd backend
npm install
# 前端
cd ../frontend
npm install
```
### 步骤 2:配置环境变量
复制示例环境文件并配置:
```bash
# 后端环境
cp backend/.env.example backend/.env
# 前端环境
cp frontend/.env.example frontend/.env
```
**后端 `.env` 配置:**
```env
PORT=3333
WS_PORT=3333
NODE_ENV=development
LOG_LEVEL=debug
CANVAS_DATA_DIR=./data
SERVER_NAME=excalidraw-mcp-server
SERVER_VERSION=1.0.0
```
**前端 `.env` 配置:**
```env
VITE_MCP_SERVER_URL=http://localhost:3333
VITE_WS_SERVER_URL=ws://localhost:3333
```
### 步骤 3:启动后端服务器
后端需要**两个进程**才能运行:
1. **MCP 服务器**(stdio)- 处理 MCP 协议命令
2. **HTTP/WebSocket 服务器** - 提供前端和管理 WebSocket 连接
**选项 A:使用单个命令运行两个进程**(推荐):
```bash
npm run dev:all
```
这同时启动两个服务器,输出彩色:
```
[HTTP] 🚀 Excalidraw MCP 服务器
[HTTP] HTTP: http://localhost:3333
[HTTP] WebSocket: ws://localhost:3333
[HTTP] 健康检查: http://localhost:3333/health
[MCP] MCP 服务器启动成功
[MCP] 已注册工具: element_create, element_update, element_delete, get_canvas_state
```
**选项 B:单独运行进程**(用于调试):
```bash
# 终端 1:HTTP/WebSocket 服务器
npm run dev
# 终端 2:MCP 服务器(用于 Claude Desktop 集成)
npm run dev:mcp
```
**可用的 MCP 工具(共 12 个):**
**元素操作:**
- `element_create` - 创建新元素(矩形、椭圆、菱形、箭头、文本、自由绘制、图像、框架等)
- `element_update` - 更新现有元素属性(位置、大小、颜色、文本等)
- `element_delete` - 软删除元素(标记为删除但不从存储中删除)
- `batch_create_elements` - 高效创建多个元素
**画布操作:**
- `get_canvas_state` - 获取所有活动元素和画布状态
- `clear_canvas` - 从画布中删除所有元素
- `canvas_export` - 以 JSON 或 Excalidraw 格式导出画布数据
- `canvas_import` - 将元素导入画布(合并或替换模式)
**分组和布局:**
- `group_create` - 将元素分组在一起作为一个单元移动
- `group_ungroup` - 取消分组元素
**元素状态:**
- `lock_elements` - 锁定元素以防止意外修改
- `unlock_elements` - 解锁以前锁定的元素
**可用的 MCP 资源:**
- `canvas://main/state` - 读取画布状态和元素
- `health://check` - 服务器健康指标
### 步骤 4:启动前端(可选)
前端是可选的,独立运行:
```bash
cd frontend
npm run dev
```
前端将在:`http://localhost:5173` 提供
### 步骤 5:测试 MCP 命令
使用 curl 或您的 MCP 客户端测试 MCP 服务器:
```bash
# 健康检查
curl http://localhost:3333/health
# 通过 MCP 创建矩形
curl -X POST http://localhost:3333/mcp \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "element_create",
"arguments": {
"type": "rectangle",
"x": 100,
"y": 100,
"width": 200,
"height": 150,
"strokeColor": "#c92a2a",
"backgroundColor": "#ffd43b"
}
}
}'
# 查询所有元素
curl -X POST http://localhost:3333/mcp \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/call",
"params": {
"name": "element_query",
"arguments": {}
}
}'
# 读取画布状态
curl -X POST http://localhost:3333/mcp \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 3,
"method": "resources/read",
"params": {
"uri": "canvas://main/state"
}
}'
```
### 故障排除
**问题**:端口 3333 已被占用
```bash
# 在 backend/.env 中更改 PORT
PORT=3334
WS_PORT=3334
# 更新 frontend/.env
VITE_MCP_SERVER_URL=http://localhost:3334
VITE_WS_SERVER_URL=ws://localhost:3334
```
**问题**:模块未找到错误
```bash
# 清理安装
rm -rf node_modules package-lock.json
npm install
```
**问题**:TypeScript 编译错误
```bash
# 重新构建
npm run build
```
## Docker 部署
使用 Docker Compose 运行整个系统,支持开发环境的热重载。
### 前提条件
- Docker 20.10+ 和 Docker Compose 1.29+
- 可用的端口 3333(后端)和 8080(前端)
### 快速开始
**启动所有服务**:
```bash
docker-compose up
```
前端:`http://localhost:8080`
后端:`http://localhost:3333`
**重新构建**(代码更改后):
```bash
docker-compose up --build
```
**分离模式**(在后台运行):
```bash
docker-compose up -d
```
**查看日志**:
```bash
# 所有服务
docker-compose logs -f
# 特定服务
docker-compose logs -f backend
docker-compose logs -f frontend
```
**停止服务**:
```bash
docker-compose down
```
**停止并删除卷**(删除持久的画布数据):
```bash
docker-compose down -v
```
### 架构
**服务**:
1. **后端**:Node.js 18 Alpine(MCP 服务器 + WebSocket + REST API)
2. **前端**:Nginx Alpine(静态 React SPA)
**卷**:
- `canvas-data`:持久画布存储(容器重启后存活)
- `./backend/src`:后端开发的热重载(只读挂载)
**网络**:
- 自定义桥接网络 `excalidraw-network`
- 前端依赖后端健康检查
- 服务通过服务名称通信
### 健康检查
两个服务都有内置的健康检查:
```bash
# 检查后端健康
curl http://localhost:3333/health
# 检查前端健康
curl http://localhost:8080/health
```
Docker 会自动重启不健康的容器。
### 开发环境与生产环境
**开发环境**(具有热重载):
```yaml
# docker-compose.yml - 后端卷部分
volumes:
- canvas-data:/app/data
- ./backend/src:/app/src:ro # 已启用
```
**生产环境**(无热重载):
```yaml
volumes:
- canvas-data:/app/data
# - ./backend/src:/app/src:ro # 已禁用
```
在生产环境中注释掉热重载卷以获得更好的性能。
### 环境变量
在 `docker-compose.yml` 中重写默认值:
```yaml
environment:
- PORT=3333
- WS_PORT=3333
- NODE_ENV=production
- LOG_LEVEL=info
- VITE_MCP_SERVER_URL=http://localhost:3333
- VITE_WS_SERVER_URL=ws://localhost:3333
```
### 数据持久性
画布数据保存在 Docker 卷 `canvas-data` 中:
```bash
# 检查卷
docker volume inspect excalidraw-mcp_canvas-data
# 备份数据
docker run --rm -v excalidraw-mcp_canvas-data:/data -v $(pwd):/backup alpine tar czf /backup/canvas-backup.tar.gz -C /data .
# 恢复数据
docker run --rm -v excalidraw-mcp_canvas-data:/data -v $(pwd):/backup alpine tar xzf /backup/canvas-backup.tar.gz -C /data
```
### 故障排除
**问题**:端口 3333 或 8080 已被占用
```bash
# 在 docker-compose.yml 中更改端口
ports:
- "3334:3333" # 后端
- "8081:80" # 前端
```
**问题**:服务无法启动
```bash
# 检查日志
docker-compose logs
# 从头开始重建
docker-compose down -v
docker-compose build --no-cache
docker-compose up
```
**问题**:前端无法连接到后端
```bash
# 确保后端健康
docker-compose ps
# 检查后端日志
docker-compose logs backend
# 验证网络
docker network inspect excalidraw-mcp_excalidraw-network
```
**问题**:更改未反映(热重载未工作)
```bash
# 确保卷挂载是否正确
docker-compose config | grep volumes
# 重启服务
docker-compose restart
```
### 自定义 Dockerfile 构建
**仅限后端**:
```bash
cd backend
docker build -t excalidraw-mcp-backend .
docker run -p 3333:3333 -v canvas-data:/app/data excalidraw-mcp-backend
```
**仅限前端**:
```bash
cd frontend
docker build -t excalidraw-mcp-frontend .
docker run -p 8080:80 excalidraw-mcp-frontend
```
## 前端独立使用
前端可以在不使用后端 MCP 服务器的情况下独立使用。所有数据都将持久保存在浏览器本地存储中。
### 启动前端
```bash
cd frontend
npm run dev
```
前端将在:`http://localhost:5173` 提供
### 功能
**主题管理**
- 点击左上角菜单图标(☰)
- 选择 **主题** → 选择浅色、深色或系统主题
- 主题偏好将保存到本地存储
**绘图**
- 使用左侧工具栏选择形状(矩形、圆、菱形、箭头、线条、文本、自由绘制)
- 点击并拖动画布以创建元素
- 选择元素以编辑属性(颜色、笔画、大小)
- 使用鼠标滚轮或捏合手势缩放
- 点击并拖动画布以平移
**持久性**
- 画布每秒自动保存到本地存储
- 视口位置(滚动、缩放)也会被保存
- 刷新页面以验证持久性
**导出选项**
- 点击菜单图标(☰)→ **导出**
- **导出为 PNG**:高质量的栅格图像
- **导出为 SVG**:矢量格式(可缩放、可编辑)
- **导出为 JSON**:完整的 Excalidraw 格式(`.excalidraw` 文件)
**清除画布**
- 点击菜单图标(☰)→ **画布** → **清除画布**
- 在删除所有元素之前确认
- 也清除本地存储
### 键盘快捷键
提供标准 Excalidraw 快捷键:
- `V` - 选择工具
- `R` - 矩形
- `D` - 菱形
- `O` - 椭圆
- `A` - 箭头
- `L` - 线条
- `T` - 文本
- `Delete` - 删除选定元素
- `Ctrl+Z` / `Cmd+Z` - 撤销
- `Ctrl+Shift+Z` / `Cmd+Shift+Z` - 重做
- `Ctrl+D` / `Cmd+D` - 复制
- `Ctrl+A` / `Cmd+A` - 全选
### 与后端集成
前端可以通过 WebSocket 与后端进行实时同步。有关详细信息,请参见下面的 **实时同步** 部分。
## 用法
### MCP 工具
```bash
# 示例:创建矩形
curl -X POST http://localhost:3333/mcp \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "element_create",
"arguments": {
"type": "rectangle",
"x": 100,
"y": 100,
"width": 200,
"height": 150
}
}
}'
```
更多使用示例请参见 [快速入门指南](./specs/001-excalidraw-mcp-server/quickstart.md)。
## MCP 服务器配置适用于 IDE
将 Excalidraw MCP 服务器与 AI 支持的 IDE 集成,以实现编程图表控制。
### 前提条件
确保后端服务器正在运行:
```bash
# 选项 1:开发模式
npm run dev:all
# 选项 2:生产构建
npm run build && npm run start:all
```
MCP 服务器将在 **stdio**(stdin/stdout)上可用,HTTP/WebSocket 服务器将在 **http://localhost:3333** 上可用。
### 快速参考
| IDE | 配置文件 | 位置 |
|-----|-----------|----------|
| **Claude Desktop** | `claude_desktop_config.json` | 平台特定(参见下文) |
| **Claude Code** | `.mcp.json` | 项目根目录 |
| **Cursor** | `mcp.json` | `.cursor/` 目录 |
(后面内容未翻译)
### 克劳德桌面版配置
**配置文件位置:**
- **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
- **Windows**: `%APPDATA%\Claude\claude_desktop_config.json`
- **Linux**: `~/.config/Claude/claude_desktop_config.json`
**本地开发(推荐):**
```json
{
"mcpServers": {
"excalidraw": {
"command": "node",
"args": ["/absolute/path/to/excalidraw-mcp/backend/dist/index.js"],
"env": {
"CANVAS_DATA_DIR": "/absolute/path/to/excalidraw-mcp/backend/data",
"LOG_LEVEL": "info"
}
}
}
}
```
**重要:** 请将 `/absolute/path/to/excalidraw-mcp` 替换为您的实际项目路径。
**Docker(替代方案):**
```json
{
"mcpServers": {
"excalidraw": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-v", "/path/to/canvas-data:/app/data",
"excalidraw-mcp-backend"
]
}
}
}
```
首先构建Docker镜像:
```bash
cd backend
docker build -t excalidraw-mcp-backend .
```
### 克劳德代码配置
在您的**项目根目录**中创建或编辑 `.mcp.json`:
**本地开发(推荐):**
```json
{
"mcpServers": {
"excalidraw": {
"command": "node",
"args": ["backend/dist/index.js"],
"env": {
"CANVAS_DATA_DIR": "./backend/data",
"LOG_LEVEL": "info"
}
}
}
}
```
**使用克劳德CLI:**
```bash
# 项目范围(推荐)
claude mcp add --scope project --transport stdio excalidraw \
-- node backend/dist/index.js
# 用户范围(在所有项目中可用)
claude mcp add --scope user --transport stdio excalidraw \
-- node /absolute/path/to/excalidraw-mcp/backend/dist/index.js
```
### 游标IDE配置
编辑 `.cursor/mcp.json`:
```json
{
"mcpServers": {
"excalidraw": {
"command": "node",
"args": ["/absolute/path/to/excalidraw-mcp/backend/dist/index.js"],
"env": {
"CANVAS_DATA_DIR": "/absolute/path/to/excalidraw-mcp/backend/data",
"LOG_LEVEL": "info"
}
}
}
}
```
### 环境变量
| 变量 | 默认值 | 描述 |
|----------|---------|-------------|
| `CANVAS_DATA_DIR` | `./data` | 画布持久化目录 |
| `LOG_LEVEL` | `info` | 日志级别(debug, info, warn, error) |
| `SERVER_NAME` | `excalidraw-mcp-server` | MCP服务器标识 |
| `SERVER_VERSION` | `1.0.0` | 服务器版本 |
### 验证
配置您的IDE后:
1. **重启IDE** 以加载新的MCP服务器配置
2. **打开一个新的对话** 在AI助手
3. **测试连接** 通过询问:
```
使用Excalidraw MCP创建一个简单的图表,包含一个矩形和一个圆形
```
AI应该使用MCP工具创建在前端可见的元素(如果运行)。
### 故障排除
**问题:** MCP服务器未检测到
```bash
# 验证后端已构建
cd backend && npm run build
# 检查dist文件夹是否存在
ls -la backend/dist/
# 直接测试MCP服务器
echo '{"jsonrpc":"2.0","method":"initialize","id":1}' | node backend/dist/index.js
```
**问题:** 权限被拒绝
```bash
# 确保后端可执行
chmod +x backend/dist/index.js
# 验证Node.js在PATH中
which node
```
**问题:** 画布数据未持久化
```bash
# 检查数据目录是否存在且可写
mkdir -p backend/data
chmod 755 backend/data
```
## 实时同步
前端和后端通过WebSocket双向同步,实现多客户端协作和持久化。
### 工作原理
**架构:**
```
前端(浏览器) ←→ WebSocket ←→ 后端(Node.js) ←→ JSON存储
↓ ↓
本地存储 MCP工具(stdio)
```
**连接流程:**
1. 前端在页面加载时连接到 `ws://localhost:3333`
2. 后端发送初始画布状态
3. 前端启用自动同步(菜单中的切换按钮)
4. 更改实时传播到所有连接的客户端
**源跟踪** (防止回声循环):
- 每个消息都有 `source: 'mcp' | 'frontend'`
- 客户端忽略来自自己的源的消息
- 防止无限更新循环
### 功能
**自动同步(菜单中切换):**
- **开启:** 更改自动同步每3秒(限流)
- **关闭:** 独立模式(仅本地存储)
- 连接状态指示器在连接时显示绿色
**手动同步:**
- 菜单 → **同步** → **立即同步到后端:** 强制立即同步
- 菜单 → **同步** → **从后端加载:** 从后端拉取最新数据
**多客户端支持:**
1. 在多个浏览器标签/窗口中打开前端
2. 在一个标签中绘图
3. 在其他标签中实时查看更改
**离线处理:**
- WebSocket自动重新连接,指数退避
- 消息缓存离线(最大100)
- 重新连接时发送缓存消息
### 测试实时同步
**步骤1:启动两个服务器**
```bash
# 终端1:后端
cd backend && npm run dev
# 终端2:前端
cd frontend && npm run dev
```
**步骤2:打开多个标签**
```bash
# 在2个以上浏览器标签中打开 http://localhost:5173
```
**步骤3:启用自动同步**
- 在每个标签中:菜单(☰)→ **同步** → **自动同步:关闭** → 点击开启
- 连接指示器应显示绿色“已连接”
**步骤4:绘图和观察**
- 在标签1中绘制一个矩形
- 在3秒内在标签2中查看其出现
- 更改自动持久化到后端
**步骤5:测试MCP集成**
```bash
# 在前端打开时通过MCP创建元素
curl -X POST http://localhost:3333/mcp \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "element_create",
"arguments": {
"type": "ellipse",
"x": 300,
"y": 300,
"width": 100,
"height": 100,
"strokeColor": "#5f3dc4"
}
}
}'
# 元素立即出现在所有打开的前端标签中
```
### API端点
**HTTP REST API:**
- `GET /api/canvas/main` - 获取当前画布状态
- `POST /api/canvas/main/sync` - 同步元素到后端
- `GET /health` - 健康检查与指标
**WebSocket消息:**
- `sync_request` - 请求完整画布同步
- `sync_to_backend` - 发送元素持久化
- `sync_response` - 接收更新元素
- `element_created` - 广播新元素
- `element_updated` - 广播元素更改
- `element_deleted` - 广播元素删除
### 故障排除
**问题:** 连接指示器显示红色“断开连接”
```bash
# 检查后端是否运行
curl http://localhost:3333/health
# 检查WebSocket端口
lsof -i :3333
# 重启后端
cd backend && npm run dev
```
**问题:** 标签之间更改不同步
```bash
# 确保在所有标签中启用自动同步
# 菜单 → 同步 → 自动同步:开启
# 在浏览器控制台中检查WebSocket错误
# 打开开发者工具 → 控制台标签
```
**问题:** “同步失败”错误
```bash
# 检查后端日志
tail -f backend/logs/combined.log
# 验证画布数据目录存在
ls -la backend/data/
# 确保写入权限
chmod 755 backend/data
```
## 测试
```bash
# 后端测试
cd backend
npm test
# 前端测试
cd frontend
npm test
# 集成测试
cd backend
npm run test:integration
```
## 贡献
欢迎贡献!请参阅 [CONTRIBUTING.md](./CONTRIBUTING.md) 获取指南。
## 许可证
MIT许可证 - 请参阅 [LICENSE](./LICENSE) 获取详细信息。
## 支持
- **GitHub仓库:** [https://github.com/whallysson/excalidraw-mcp](https://github.com/whallysson/excalidraw-mcp)
- **问题:** [报告错误和功能请求](https://github.com/whallysson/excalidraw-mcp/issues)
- **讨论:** [提问和分享想法](https://github.com/whallysson/excalidraw-mcp/discussions)
- **日志:** 在 `backend/logs/` 中查看结构化JSON日志
MCP 配置
以下是此 MCP Server 的配置信息,可直接复制到 Cursor 或其他 MCP 客户端中使用。
mcp.json
连接信息
猜你喜欢
暂无推荐服务器