使用说明
JSON画布MCP服务器
A. 模型上下文协议 用于工作的(MCP)服务器
JSON画布 files——使用的开放无限画布格式
通过 黑曜石它允许MCP客户端创建、验证和执行数据,
读取并列出 .canvas 文件夹。
建立在官方 mcp Python SDK(>=1.27),协商 2025-11-25 主控程序
协议修订。跑过 标准 默认情况下,也可以选择覆盖 流式HTTP
运输。
支持的主机 MCP应用程序 UI扩展渲染 交互式画布查看器 当你阅读或创建画布时,内联——平移/缩放, 节点和边的黑曜石风格预览。纯文本客户端不受影响并保持 接收画布作为文本/结构化输出。
组件
工具
- create_canvas --从以下位置创建画布
nodes(可选edges)并将其写入 日期前缀.canvas归档于OUTPUT_PATH.- 输入:
nodes(JSON Canvas节点对象数组),filename(字符串,无扩展名),edges(可选的边缘对象数组)。 - 回报(结构化):
{ path, node_count, edge_count }.
- 输入:
- validate_canvas --根据JSON canvas 1.0规范验证画布数据。
- 输入:
canvas(带可选项的对象nodes和edges). - 回报(结构化):
{ valid, error }.
- 输入:
- read_canvas --读取已存储
.canvas文件并返回其节点和边。- 输入:
filename(字符串,有或没有.canvas扩展)。 - 回报(结构化):
{ nodes, edges }(也由画布查看器呈现;文本 回退是画布JSON)。
- 输入:
- list_canvases --列出
.canvas文件可用于OUTPUT_PATH.- 返回:文件名数组。
- edit_canvas --在存储的画布上添加、更新和/或删除节点和边
原子写入(失败的操作会使文件保持不变)。
- 输入:
filename,加上可选add_nodes,update_nodes(部分,必须包括id),remove_node_ids(级联连接边缘),add_edges,update_edges,remove_edge_ids. - 回报(结构化):
{ path, node_count, edge_count, canvas }--更新的画布,所以 支持UI的主机将其内联重新渲染。
- 输入:
- 出口canvas --将存储的画布导出为其他格式。
- 输入:
filename,format(markdown|svg). - 回报(结构化):
{ format, mime_type, content }Markdown是一种边缘有序的轮廓; SVG是一个独立的矢量图像(仅节点标题行——纯SVG无法渲染Markdown)。
- 输入:
- 搜索canvases --在存储的画布上进行不区分大小写的子字符串搜索。
- 输入:
query,可选filename将范围扩展到一个画布。 - 回报(结构化):
{ matches: [{ filename, kind, id, field, snippet }] }.
- 输入:
create_canvas, read_canvas,以及 edit_canvas 通过以下方式链接到画布查看器
_meta.ui.resourceUri,因此支持UI的主机将结果内联呈现。
节点对象使用JSON Canvas形状: id, type (text | file | link | group),
x, y, width, height,可选 color,加上特定类型的字段(text, file/subpath,
url, label/background/backgroundStyle).边缘对象使用 id, fromNode, toNode,以及
可选的 fromSide/toSide/fromEnd/toEnd/color/label.
资源
canvas://schema--用于验证画布文件的JSON模式。canvas://examples/basic--一个简单的示例画布(由边连接的两个文本节点)。ui://canvas/viewer.html--交互式画布查看器(MCP Apps UI),提供MIME服务 类型text/html;profile=mcp-app.引用人create_canvas和read_canvas.
交互式画布查看器(MCP应用程序UI)
查看器是一个自包含的HTML包,由 ui/ 来源Vite
和官方 @modelcontextprotocol/ext-apps
客户。它渲染节点(带有标记、颜色和组)和边(边、箭头、标签)
在平移/缩放视图中,通过主机的CSS变量进行主题化。
构建的捆绑包在 jsoncanvas/_ui/viewer.html 并在包裹中发货,所以
运行服务器只需要Python。更改后重建 ui/:
make build-ui # cd ui && npm install && npm run build (requires Node.js)
要独立预览渲染器(无MCP主机),请运行 cd ui && npm run dev 并打开
/preview.html.
使用Claude Desktop
Docker(标准操作系统)
docker build -t mcp/jsoncanvas .
添加到您的 claude_desktop_config.json:
{
"mcpServers": {
"jsoncanvas": {
"command": "docker",
"args": ["run", "-i", "--rm", "-v", "canvas-data:/data", "mcp/jsoncanvas"],
"env": { "OUTPUT_PATH": "/data/output" }
}
}
}
紫外线(stdio)
{
"mcpServers": {
"jsoncanvas": {
"command": "uv",
"args": ["--directory", "/path/to/jsoncanvas", "run", "mcp-server-jsoncanvas"],
"env": { "OUTPUT_PATH": "./output" }
}
}
}
可流式HTTP传输
要通过Streamable HTTP而不是stdio提供服务,请执行以下操作:
mcp-server-jsoncanvas --transport streamable-http --host 127.0.0.1 --port 8000
MCP端点为 http://127.0.0.1:8000/mcp传输绑定到localhost,并且,per
2025-11-25规范验证了 Origin 启用DNS重新绑定保护的标头
(默认情况下仅限localhost Origins)。接受来自主机外部的连接(例如,当
使用HTTP运行容器),bind --host 0.0.0.0 并配置您允许的起源
因此。
基于浏览器的MCP主机(渲染画布查看器的那种)连接跨源,并且必须
阅读 mcp-session-id 响应标头,因此Streamable HTTP传输提供许可
CORS标头。限制允许的来源 MCP_CORS_ORIGINS (逗号分隔;默认值
*).
安全说明。 HTTP传输是 未认证的 --任何能到达港口的人 可以读写
.canvas文件下OUTPUT_PATH该服务器旨在供本地使用; 保持它的束缚127.0.0.1(默认设置)。DNS重新绑定/Origin保护已固定 启动时的localhost起源和主机,因此绑定--host 0.0.0.0暴露上的端口 网络,但仍拒绝非本地主机Host/Originheaders——为了安全地远程公开它, 使用身份验证反向代理对其进行前端处理,而不是直接发布,并设置MCP_CORS_ORIGINS到你信任的具体来源(永远不要*).
配置
环境变量:
OUTPUT_PATH--目录在哪里.canvas文件被写入/读取(默认./output).MCP_TRANSPORT—stdio(默认)或streamable-http.MCP_HOST/MCP_PORT--流式HTTP传输的主机/端口(默认127.0.0.1:8000).MCP_CORS_ORIGINS--逗号分隔的HTTP传输允许CORS源(默认*).
发展
# Install uv: https://docs.astral.sh/uv/getting-started/installation/
make setup # uv venv && uv sync --extra dev
make build-ui # rebuild the canvas viewer bundle (requires Node.js)
make test # run the test suite
make lint # ruff check + format check
make audit # scan dependencies for known vulnerabilities (pip-audit)
make run # run the server over stdio
运行捆绑库示例:
make example # writes example.canvas to OUTPUT_PATH (default ./output)
图书馆示例
这 jsoncanvas 包也可以直接使用:
from jsoncanvas import Canvas, TextNode, Edge
title = TextNode(id="title", x=100, y=100, width=400, height=100,
text="# Hello Canvas", color="#4285F4")
info = TextNode(id="info", x=600, y=100, width=300, height=100,
text="More information here", color="2") # preset color
canvas = Canvas()
canvas.add_node(title)
canvas.add_node(info)
canvas.add_edge(Edge(id="edge1", from_node="title", to_node="info",
from_side="right", to_side="left", label="Connection"))
import json
print(json.dumps(canvas.to_dict(), indent=2))
许可证
MIT。看 许可证.