Skip to main content
Glama
Ye-Zayne

AI Canvas

by Ye-Zayne

AI 对话画布(AI Canvas)

CI License: MIT

一个可长期固定在 codex / claude code 里的对话画布插件。基于 React Flow + shadcn/ui,通过内置 MCP Server 与 Agent 双向通信:

  • Agent → 画布:Agent 把生成的文本、Markdown、图片、视频、音频、任意文件,以独立卡片的形式实时推送到画布,支持拖拽、缩放、拉伸、多选框选、节点连线等操作。

  • 画布 → Agent:在画布上点选卡片 →「加入对话」,再在 codex / claude code 里用 /canvas-pull 把这些内容作为上下文带回对话流。

两种形态(自动切换)

同一套画布,运行时自动选择渲染方式:

形态

触发条件

体验

内嵌画布(MCP Apps)

客户端支持 MCP Apps(如 Claude / Claude Desktop)

调用 canvas_show 后画布直接嵌在对话面板内

浏览器画布(回退)

不支持 MCP Apps 的客户端(如当前的 Codex)

调用 canvas_open 打开 http://127.0.0.1:4399

MCP Apps 是 MCP 官方协议的开放扩展。内嵌模式下,ui://canvas/app.html 只是一个装壳页,真正的画布 JS/CSS 通过 CSP 白名单从本地 bridge-server 加载,因此内嵌与浏览器共用同一份构建产物。两端「加入对话」行为一致(入队 + /canvas-pull)。

Related MCP server: Excalidraw MCP Server

架构

codex / claude code
   │
   ├─ stdio(MCP) ──► MCP 进程(轻量无状态)
                        │ HTTP
                        ▼
                     daemon(detached,不随客户端退出)
                     ├─ WebSocket ──► 浏览器画布(React Flow) [浏览器模式]
                     ├─ ui://资源 ──► 内嵌 iframe 画布      [MCP Apps 模式]
                     └─ 持久化 ────► <项目根>/.aicanvas/canvas.json
  • packages/canvas-web:React + Vite + TypeScript + React Flow(@xyflow/react,MIT)+ shadcn/ui 画布前端。

  • packages/bridge-server:同一份代码两种角色——MCP 进程(被客户端 spawn,只做协议转发)与 daemon(持有画布状态,提供 HTTP/WS/静态托管/本地文件代理)。

快速开始

Codex plugin 一句话安装(推荐)

直接对 Codex 说:

帮我从 stable 分支安装这个 Codex plugin:https://github.com/Ye-Zayne/canvas.git

Codex 会添加仓库 marketplace 并安装 ai-canvas plugin。等安装完成后, 新建一个任务,再说「打开画布」即可。

对应的手动命令是:

codex plugin marketplace add https://github.com/Ye-Zayne/canvas.git --ref stable
codex plugin add ai-canvas@ai-canvas

插件已经内置可直接运行的 MCP server 与画布前端;不需要克隆仓库、 运行 pnpm install、手动构建或修改 ~/.codex/config.toml

一键安装(推荐)

以下脚本方式同时支持 Codex 与 Claude Code:

cd ai-canvas
./install.sh

脚本会自动完成:环境检查 → 安装依赖 → 构建 → 注册到 Codex / Claude Code。 无需手动编辑任何配置文件。

安装完成后:

  1. 完全退出并重启 Codex / Claude Code(务必 Cmd + Q,关窗口无效)

  2. 新建对话,输入「打开画布」

  3. 在浏览器打开返回的地址即可使用

脚本可重复执行(幂等)。代码更新后再跑一次即可,不会产生重复配置; 修改前会自动备份为 config.toml.bak / .claude.json.bak


手动安装

若你想自行控制每一步:

1. 安装依赖

cd ai-canvas
pnpm install

若你的目录路径包含冒号 :(如本项目),pnpm 无法把 .bin 加入 PATH。项目已内置 scripts/run-bin.mjs 自动绕过,无需额外处理。

2. 构建

pnpm build

3. 启动

./start.sh
# 或
pnpm start

启动后画布地址:http://127.0.0.1:4399(可用环境变量 CANVAS_PORT 修改端口)。

4. 注册到客户端

只做注册(不重新构建):

node scripts/register-mcp.mjs "$(pwd)/packages/bridge-server/dist/index.js"

或参考下方「接入 codex / claude code」手动填写配置。

开发模式(热更新)

分两个终端:

pnpm dev:server   # 启动 bridge-server(HTTP+WS+MCP)
pnpm dev:web      # 启动 Vite 开发服务器(http://localhost:5173,已代理 /ws /assets /api)

接入 codex / claude code

使用 ./install.sh 已自动完成下述配置,本节仅供手动配置或排查参考。

Claude Code

在项目根或全局的 .mcp.json 添加:

{
  "mcpServers": {
    "canvas": {
      "command": "node",
      "args": ["<绝对路径>/ai-canvas/packages/bridge-server/dist/index.js"]
    }
  }
}

MCP 的 prompts 会自动暴露为 slash 命令,例如:

  • /mcp__canvas__canvas-pull — 拉取画布上加入对话的内容

  • /mcp__canvas__canvas-open — 获取画布地址

resources 可用 @ 引用:@canvas://selection@canvas://all

Codex

~/.codex/config.toml 添加:

[mcp_servers.canvas]
command = "node"
args = ["<绝对路径>/ai-canvas/packages/bridge-server/dist/index.js"]

注意:Agent 客户端会自行以 stdio 方式 spawn MCP 进程,该进程会自动拉起(或复用)项目级 daemon 提供画布 UI,因此无需再单独运行 start.sh(除非你想在开发模式下调试前端)。

MCP 能力清单

Tools(Agent 主动调用)

工具

说明

canvas_show

内嵌打开画布(支持 MCP Apps 的客户端在对话面板内渲染)

canvas_open

返回画布浏览器地址(回退方式)

canvas_add_text

推送文本 / Markdown 卡片

canvas_add_image

推送图片(本地路径或 URL)

canvas_add_media

推送视频 / 音频

canvas_add_file

推送任意文件卡片(可下载)

canvas_list

列出画布上所有卡片摘要

canvas_relink

修复素材已丢失的卡片(重新指向新路径)

canvas_pull

取出用户「加入对话」的内容(出队)

canvas_enqueue

内嵌画布内部调用:把选中卡片入队(一般不由用户直接触发)

Prompts(slash 命令)

  • canvas-pullcanvas-open

Resources(@ 引用)

  • canvas://selectioncanvas://all

典型用法

  1. 让 Agent 生成内容并推到画布:

    “把这段方案画到画布上” → Agent 调用 canvas_add_text “把 /tmp/demo.mp4 放到画布” → Agent 调用 canvas_add_media

  2. 在浏览器画布里自由排布、缩放这些卡片。

  3. 选中若干卡片,点卡片上的「加入对话」或工具栏「选中加入」。

  4. 回到 codex / claude code,执行 /canvas-pull,选中内容即作为上下文进入对话。

目录结构

ai-canvas/
├─ package.json              # pnpm workspace 根
├─ pnpm-workspace.yaml
├─ start.sh                  # 一键启动
├─ scripts/run-bin.mjs       # 绕过含 ":" 路径的 bin 启动器
└─ packages/
   ├─ canvas-web/            # 前端画布
   │  └─ src/
   │     ├─ App.tsx
   │     ├─ canvas/CanvasBoard.tsx    # React Flow 画布
   │     ├─ canvas/CardNode.tsx       # 卡片节点(含断链占位)
   │     ├─ bridge/                   # 通信适配层
   │     ├─ components/{Toolbar,QueueDrawer}.tsx
   │     ├─ hooks/useBridge.ts
   │     └─ lib/{types,mode,utils}.ts
   └─ bridge-server/         # MCP + WS + REST
      └─ src/
         ├─ index.ts         # 入口(MCP / daemon / 调试 三种模式)
         ├─ cli.ts           # daemon start/stop/status
         ├─ mcp.ts           # MCP tools/prompts/resources
         ├─ daemon-client.ts # MCP 侧:确保 daemon 存在 + HTTP 调用
         ├─ daemon-state.ts  # 状态文件、陈旧检测、端口分配
         ├─ ws.ts            # WebSocket 广播
         ├─ store.ts         # 内存状态 + 拉取队列
         ├─ canvas-service.ts # 加载/落盘/素材重注册
         ├─ persist.ts       # .aicanvas/canvas.json 读写(原子+防抖)
         ├─ project.ts       # 项目根目录解析
         ├─ assets.ts        # 本地文件代理
         ├─ config.ts
         └─ types.ts

数据与持久化

画布内容保存在项目目录下,随项目走:

<项目根>/.aicanvas/canvas.json

保存的内容:节点、连线、每张卡片的位置与尺寸视口(缩放与平移)。 刷新页面或重启服务后,画布会完全恢复到上次的样子。

项目根默认为服务启动时的工作目录,可用环境变量 CANVAS_PROJECT_DIR 指定。

素材只存路径,不复制文件

canvas.json 里只保存素材的原始磁盘路径,不把图片视频拷进项目。

优点

代价

不占额外空间(视频往往很大)

源文件被移动或删除会断链

修改源文件即时生效

画布不能整体搬到其他机器

断链后不会默默变空白:卡片会显示「素材已丢失」占位、列出原始路径, 并提供「重新指定路径」就地修复(也可让 Agent 调 canvas_relink)。

安全保障

  • 原子写入:先写临时文件再重命名,中断不会产生损坏文件。

  • 防抖 500ms:拖动过程不会高频写盘;退出前强制落盘。

  • 损坏容错:文件非法时保留原文件并报可恢复错误(见 /api/healthloadError),绝不清空你的画布

说明与约束

  • 本地文件访问:浏览器不能直接读磁盘,本地媒体统一经 daemon 的 /assets/:id 代理(支持 Range,视频可拖动进度)。

  • 大文件:优先传路径而非 base64,避免 MCP 消息体过大。

  • 单画布:当前为单项目单画布(多 Page 尚未支持)。

  • 端口:默认偏好 4399,被占用时自动换端口;可用 CANVAS_PORT 指定偏好值。

  • 本地只读于自己:daemon 仅监听 127.0.0.1,不对外网暴露;本阶段未加访问 token。

项目级 daemon

画布服务以 daemon 方式运行,不依赖某个对话存活

客户端 ──spawn─► MCP 进程(轻量、无状态)
                     │ HTTP
                     ▼
                  daemon(detached,独立存活)
                  ├─ 画布状态 + 持久化
                  └─ HTTP + WebSocket

关掉对话、重启客户端,画布与数据不受影响

一个项目一个 daemon

状态记录在 ~/.aicanvas/daemons/<项目哈希>.json(可用 AICANVAS_HOME 改位置)。 同一项目重复启动会复用已有 daemon;不同项目各自独立、自动分配不同端口。

复用判定需三条同时成立:状态文件存在、pid 进程存活、健康接口返回的 projectRoot 与当前一致。缺一即视为陈旧并自动清理。

为何不能只判 pid:pid 可能已被系统回收并复用给其他进程。

管理命令

pnpm daemon          # 启动(或复用)当前项目的 daemon
pnpm daemon:status   # 查看 pid / 端口 / 运行时长 / 日志位置
pnpm daemon:stop     # 停止(会先落盘再退出)

daemon 日志写在 ~/.aicanvas/daemons/<哈希>.log。 因为 detached 进程不能继承 stdio(会污染 MCP 的 stdio 协议通道),所以日志必须落文件。

调试(不接 Agent 也能测)

# 仅起 HTTP+WS,不起 MCP、不注册 daemon 状态
node packages/bridge-server/dist/index.js --no-mcp

# 直接用 REST 推一张卡片到画布
curl -X POST http://127.0.0.1:4399/api/nodes \
  -H 'Content-Type: application/json' \
  -d '{"kind":"markdown","title":"示例","content":"# Hello\n来自 REST"}'

# 查看 daemon 状态与日志位置
pnpm daemon:status

三种运行模式:

命令

用途

node dist/index.js

MCP 模式(客户端 spawn),自身无状态,自动确保 daemon 存在

node dist/index.js --daemon

daemon 模式(纯服务,一般不手动调用)

node dist/index.js --no-mcp

本地调试(单进程,不写状态文件)

A
license - permissive license
-
quality - not tested
A
maintenance

Maintenance

Maintainers
Response time
4dRelease cycle
3Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • A
    license
    -
    quality
    D
    maintenance
    Enables AI agents to read, write, and search local tldraw (.tldr) files, providing a persistent visual scratchpad for diagramming and note organization. It supports full CRUD operations on canvas shapes and metadata management for local canvas files.
    18
    3
    MIT
  • A
    license
    -
    quality
    F
    maintenance
    Enables AI agents to programmatically control a live Excalidraw canvas through element-level CRUD operations and real-time synchronization. It allows agents to iteratively build, inspect, and refine diagrams while providing visual feedback via screenshots and scene descriptions.
    1,359
    MIT
  • A
    license
    -
    quality
    D
    maintenance
    Enables AI agents to programmatically control a live Excalidraw canvas with element-level CRUD operations and real-time synchronization. It supports iterative diagramming through scene descriptions, screenshots, and advanced layout tools for collaborative AI-human workflows.
    1,359
    MIT

View all related MCP servers

Related MCP Connectors

  • Slack for AI agents: DMs, search, threads, triage, actions - browser-session or hosted OAuth.

  • Real-time collaborative whiteboard — AI agents and humans edit the same board live over MCP.

  • User-owned memory for AI agents, Copilot, Claude, IDEs, CLIs, and chat apps over remote MCP.

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Ye-Zayne/canvas'

If you have feedback or need assistance with the MCP directory API, please join our Discord server