drawio-mcp 全仓架构与 MCP 工具实战指南:从 `create_diagram` 到 `list_pages` 的完整实现解析

发布时间:2026/10/12 1:59:30

drawio-mcp 全仓架构与 MCP 工具实战指南:从 `create_diagram` 到 `list_pages` 的完整实现解析 AI 应用MCP 服务交互助手【免费下载链接】drawio-mcp项目地址https://gitcode.com/gh_mirrors/dr/drawio-mcp点击查看免费下载drawio-mcp 是官方 draw.io MCPModel Context Protocol服务器实现它让 LLM 可以直接在 draw.io 编辑器中打开和创建图表。本文以仓库根目录的 AGENTS.md 为主干结合 mcp-tool-server/src/index.js、mcp-app-server/src/index.js 及 shared/ 共享模块源码系统讲解该仓库的目录结构、两大 MCP 服务器的全部工具create_diagram、search_shapes、open_drawio_xml、open_drawio_csv、open_drawio_mermaid、list_pages/get_page/set_page的入参语义、底层实现与最佳实践并给出可复制的 XML 示例与排障对照表。读完本文你将掌握 draw.io 接入 MCP 的完整技术路径以及如何在 LLM 场景下正确选择 Mermaid / XML / CSV 三种生成方式。仓库结构与各目录职责AGENTS.md 首先定义了仓库的整体布局。drawio-mcp 采用「一份共享逻辑 多种交付通道」的设计每个子目录自带独立的AGENTS.md作为该目录唯一事实源其旁的CLAUDE.md仅通过AGENTS.md导入修改时应改AGENTS.md而非CLAUDE.md见 CLAUDE.md。目录 / 文件职责shared/单一事实源Single Source of TruthLLM 面向的参考文档xml-reference.md、mermaid-reference.md、style-reference.md与两个服务器共用的逻辑代码shape-search.js、icon-search.js、mermaid-elk.js以及无头 mxGraph 栈mx-model.js/mx-xml.js/normalize-model.jsmcp-app-server/MCP App 服务器通过 iframe 在聊天中内联渲染图表托管于https://mcp.draw.io/mcp也可用 Node.js、Docker Hub 镜像jgraph/drawio-mcp或 Cloudflare Workers 自托管其 server.json 是 MCP Community Registry 清单io.draw/mcpmcp-tool-server/原始 MCP 工具服务器基于 stdio、打开浏览器以drawio/mcp发布到 npmplugins/按宿主分组、面向 AI 助手侧的插件claude-code/、codex/drawio/、copilot/三个子目录各自打包同一份drawio技能project-instructions/Claude Project 指令无需 MCP、无需安装shape-search/形状搜索索引生成器通过 jsdom 加载 draw.io 的app.min.js把所有形状样式与标签抽取为search-index.json供search_shapes工具使用三种插件 Marketplace 清单的差异AGENTS.md 特别强调了三个插件市场清单虽然都指向同一个drawio插件但格式与元数据继承方式各不相同.claude-plugin/marketplace.json——Claude Code 插件市场清单元数据继承自每个插件自己的plugin.json。安装命令为/plugin marketplace add jgraph/drawio-mcp后执行/plugin install drawiodrawio。.agents/plugins/marketplace.json——Codex CLI 插件市场清单Codex 格式source对象 policycategory插件源位于plugins/codex/drawio元数据继承自其.codex-plugin/plugin.json。安装命令为codex plugin marketplace add jgraph/drawio-mcp后执行codex plugin add drawiodrawio。.github/plugin/marketplace.json——GitHub Copilot CLI 插件市场清单schema 族与 Claude 相同但元数据内联在plugins[]条目中需与plugins/copilot/plugin.json保持同步。安装命令为copilot plugin marketplace add jgraph/drawio-mcp后执行copilot plugin install drawiodrawio。Copilot CLI 会先检查该路径找不到再回退到.claude-plugin/marketplace.json。插件技能文件方面plugins/claude-code/skills/drawio/SKILL.md 与 plugins/codex/drawio/skills/drawio/SKILL.md 字节级一致Codex 使用同样的/drawio:drawio调用并从 GitHub 获取同一份共享参考Copilot 版本用户侧命令则是不带前缀的/drawio。技能既能生成原生.drawio文件以 Mermaid 为源、由桌面 CLI 转换并布局或以 XML 直接书写并可选 ELK--layout也能导出 PNG/SVG/PDF或以浏览器 URL 方式在app.diagrams.net打开其中 Mermaid 转换、ELK 布局与图片导出需要 draw.io Desktop纯 XML 的.drawio/url输出则不需要。MCP App Server 工具create_diagram与search_shapescreate_diagram内联渲染的交互式图表项目说明输入{ xml: string }——mxGraphModel 格式的 draw.io XML输出通过 draw.io viewer 库内联渲染的交互式图表功能缩放、平移、图层、全屏、Open in draw.io 按钮对于没有 MCP Apps UI 的普通 MCP 客户端Codex CLI、终端 agent、脚本create_diagram会额外返回一段包含app.diagrams.net/#createURL 的文本块——否则没有任何东西能为它们渲染图表。该检测依据客户端声明的io.modelcontextprotocol/ui能力以及它是否曾获取过 app 资源实现对应源码见 mcp-app-server/src/shared.js 中create_diagram工具与 UI 资源的注册逻辑以及#createURL 的拼接如https://app.diagrams.net/?pv0grid0#create encodeURIComponent(JSON.stringify(createObj))。模型归一化是所有 XML 图表的必经步骤任何其他逻辑看到图表之前shared/normalize-model.js 都会先对每个 XML 图表执行归一化其修复内容与桌面 CLI 的--normalize完全一致边归位到其端点的最近公共祖先——LLM 生成的 XML 通常把所有边都停在 layer 上parent1渲染没问题但布局会出错停在外层容器与内部两个单元格之间连线上的边会在错误的坐标系中被布局。归一化会将边移到最近的公共祖先下并把几何坐标换算到该父级坐标系。为缺少几何的边补上几何——没有mxGeometry子元素的边在 draw.io 中完全无法渲染静默丢失。把容器扩到能包住会被裁剪的子元素——容器永远只扩大不缩小子元素不被移动因此作者刻意留出的留白不会丢失。归一化过程不需要任何布局引擎、不改变其他任何内容且是幂等的已处于正确形态的图表经过处理后字节级不变。它通过transformPages处理每一页返回值{ xml, changed }中的changed是被重写的单元格数量。测试用例 mcp-tool-server/test/normalize-model.test.js 覆盖了边归位含容器内部、跨容器、自环、带 waypoint 的边、几何补全、容器扩增、幂等性以及多页文件逐页归一化等场景。search_shapes覆盖一万形状的关键词搜索项目说明输入{ query: string, limit?: number }——搜索关键词与可选的最大结果数默认 10最大 50输出匹配形状数组每项为{style, w, h, title}style字符串可直接用于 mxCell 属性搜索逻辑对空格分隔的多个词条做AND匹配支持精确匹配 Soundex 语音匹配覆盖范围约 10,000 形状覆盖 draw.io 全部库AWS、Azure、GCP、PID、电气、Cisco、Kubernetes、UML、BPMN 等本地索引无强匹配时由 draw.io 图标服务icons.diagrams.net实时补充品牌 Logo 与通用概念图标返回为shapeimage样式搜索算法的核心实现在 shared/shape-search.js先对查询词做复合词拆分如pid2misc→pidmisc、discInst→discinst再尝试严格的 AND 交集AND 无结果时回退到带评分的 OR 排序每个词条精确命中 1.0 分、仅 Soundex 命中 0.5 分按分数降序、标题字母序排列。返回的strong标志报告最佳匹配是否精确命中全部查询词是判断本地图库覆盖是否真实的信号。形状索引由 shape-search/generate-index.js 从 draw.io 的app.min.js生成提交在 shape-search/search-index.json。使用场景来自 AGENTS.md 的明确建议只在图表需要行业特定、品牌化或图形化图标云、网络、PID、电气、Cisco、Kubernetes、产品 Logo时才在create_diagram之前调用search_shapes标准图表流程图、UML、ERD、组织结构图使用基础几何形状即可应跳过此工具。MCP Tool Server 工具详解open_drawio_xml以 XML 打开编辑器在 draw.io 编辑器中以 XML 内容打开图表。每次调用都会先做模型归一化见上文create_diagram一节且布局过程本身从不触碰单元格层级。参数参数类型说明contentstring必填draw.io XML 内容lightboxboolean可选以只读 lightbox 模式打开默认 falsedarkstring可选深色模式true或false默认 falsepostLayoutstring可选取值elk打开前运行服务端 ELK 重布局——放置顶点并路由边通过编辑器与 app server 同用的drawio-elkElkLayout桥接实现首次使用时从 CDN 加载、按用户缓存DRAWIO_ELK_URL可覆盖来源。适用于流程图等有向/分层图表。节点尺寸永不被修改只改位置directionstring可选postLayout的流向——vertical默认或horizontalroutingstring可选取值libavoid打开前运行服务端避障正交边路由——保持顶点位置不变只绕开形状重连连接线。适用于手工摆放、边会穿过方框的图表。它是postLayout的替代方案而非伴随方案示例 XML来自 AGENTS.md 原文mxGraphModel adaptiveColorsauto root mxCell id0/ mxCell id1 parent0/ mxCell id2 valueHello stylerounded1; vertex1 parent1 mxGeometry x100 y100 width120 height60 asgeometry/ /mxCell /root /mxGraphModel从 mcp-tool-server/src/index.js 的工具注册代码可见open_drawio_xml的描述会在启动时动态拼接 shared/xml-reference.md 的完整内容使 LLM 在生成工具调用时就能看到样式、边路由、容器、图层等语法提示。源码中的 schema 定义还给出了各参数的边界语义dark支持auto/true/false枚举postLayout仅elkrouting仅libavoid且两者明确是互斥替代关系ELK 已自带边路由勿同时设置。ELK 与 libavoid 的底层实现postLayout: elk由 mcp-tool-server/src/elk-pass.js 的layoutXml实现routing: libavoid由 mcp-tool-server/src/libavoid-pass.js 的routeXml实现。libavoid 通道在无渲染器的环境下用共享无头模型shared/mx-xml.js 解析出的 mxGraph 模型运行与编辑器相同的AvoidRouting.computeRoutes路由核心再把 waypoint 写回 XML 后压缩进 URL每个页面独立路由只有被路由的边被重写其余字节原样保留任何意外情况只会让该页保持未路由而不会产生损坏的图表。路由核心通过 mcp-tool-server/src/cdn-cache.js 的 ETag 复验型按用户磁盘缓存加载npm postinstall已预热CDN 不可达时回退到 vendor 副本。open_drawio_csv从 CSV 数据生成图表在 draw.io 编辑器中以 CSV 数据打开并转换为图表。⚠️ 注意CSV 依赖 draw.io 的服务端处理偶尔可能失败或不可用可能的情况下组织结构图优先考虑使用 Mermaid。参数参数类型说明contentstring必填CSV 内容lightboxboolean可选以只读 lightbox 模式打开默认 falsedarkstring可选深色模式true或false默认 false⚠️ 避免在样式属性中使用%column%占位符如fillColor%color%——这会导致 URI malformed 错误。open_drawio_mermaid从 Mermaid 定义打开编辑器在 draw.io 编辑器中以 Mermaid.js 图表定义打开。参数参数类型说明contentstring必填Mermaid.js 语法lightboxboolean可选只读 lightbox 模式默认 falsedarkstring可选深色模式true或false默认 falsepostLayoutstring可选取值elk将 Mermaidflowchart切换到分层 ELK 布局。服务端不计算任何布局——它只在源文件中写入config: { layout: elk }的 frontmattershared/mermaid-elk.js 的withElkLayout由 draw.io 在转换图表时应用布局。非 flowchart 类型会忽略该参数由它们自行布局Mermaid 的 ELK 选择在 shared/mermaid-elk.js 中是纯文本变换withElkLayout负责写入选择器无 frontmatter 时生成最小config: { layout: elk }块已有 frontmatter 则嵌套进config:块已存在显式 layout 或旧式%%{init: {flowchart: {defaultRenderer: elk}}}%%指令时保持原样不动mermaidDiagramType/isFlowchartSource决定是否适用ELK 只对 flowchart 有意义flowchart与旧式graph拼写都算。mcp-tool-server/test/mermaid-elk.test.js 验证了withElkLayout对各类 frontmatter 形态的输出及非 flowchart 类型的忽略行为。open_drawio_mermaid的工具描述同样在启动时动态附加 shared/mermaid-reference.md该参考覆盖 26 种受支持的图表类型flowchart、sequence、class、state、ER、gantt、mindmap、timeline、quadrant、C4、architecture、radar、packet、venn、treemap、kanban、zenuml 等及 flowchart 样式style、classDef、linkStyle。search_shapesTool Server 版与 app server 的search_shapes是同一个工具共享 shared/shape-search.js 与 shared/icon-search.js。约 4.6 MB 的索引不打进 npm 包而是首次使用时通过 CDN 获取走与 ELK bundle 相同的 ETag 复验型按用户磁盘缓存mcp-tool-server/src/cdn-cache.js20 秒超时、热启动为 304、离线时使用最后一次缓存副本DRAWIO_SHAPE_INDEX_URL可用其他 URL 或本地路径覆盖在仓库内检出时则直接读本地文件。本地索引无强匹配时结果由 draw.io 图标服务实时补充可用DRAWIO_ICON_SERVICE_URL覆盖设为off即禁用。参数与输出query必填空格分隔的搜索关键词如aws lambda、cisco router、kubernetes podlimit可选最大结果数默认 10最大 50输出匹配形状数组{style, w, h, title}——style字符串可直接用于mxCell的 style 属性。仅当图表需要行业特定图标时使用标准流程图、UML、ERD 与组织结构图应跳过。list_pages/get_page/set_page多页文件的分页访问针对本地多页.drawio文件的页面级访问使大文件无需整体加载进上下文即可查看或编辑某一页。工具参数 → 输出说明list_pages{ path: string }→[{index, id, name, approxSizeBytes}]列出每个页面不解压页面内容get_page{ path: string, page: string }→ 该页原始mxGraphModelXMLpage为从 0 开始的索引、精确页面名或页面 idset_page{ path: string, page: string, content: string }→ 替换该页内容新内容为单个mxGraphModel元素不含diagram标签其余页面不受影响这三个工具是仅有的按路径读写本地文件的工具路径必须以.drawio或.xml结尾。使用场景对任何大型多页文件先调用list_pages按名称/索引/id 找到目标页再用get_page/set_page只操作该页而不是加载整个文件。底层实现见 mcp-tool-server/src/pages.jsparseDiagrams用正则切分diagram标签但不解压内容listPageMeta直接给出元数据findPage支持数字索引、名称精确匹配与 id 匹配重名时明确报错提示改用索引或 iddecompressDiagram通过 pako 解压 deflate raw并带 64 MB 解压上限防解压炸弹writePageXml会校验新内容必须以mxGraphModel开头且不含diagram标签压缩状态跟随原页并通过临时文件 原子重命名写入。快速决策指南与 LLM 最佳实践AGENTS.md 用一张表概括了三种生成方式的选型需求使用可靠性流程图、时序图、ER 图open_drawio_mermaid高自定义样式、精确定位open_drawio_xml高从数据生成组织结构图open_drawio_csv中默认使用 Mermaid——它能可靠处理大多数图表类型。给 LLM 的最佳实践AGENTS.md 原文五条默认用 Mermaid能可靠处理流程图、时序图、ER 图、甘特图等需要精度时用 XML需要精确定位、自定义颜色或复杂布局时关键图表避免 CSVCSV 处理可能失败组织结构图尽量用 Mermaid发送前校验语法确保 Mermaid/CSV/XML 语法正确把 URL 返回给用户总是提供生成的 URL让用户能在浏览器打开图表从 mcp-tool-server/src/index.js 的实现看三种内容都会先做类型映射xml/csv/mermaid其中 XML 先归一化再可选执行 ELK/libavoidMermaid 的 ELK 是纯文本 frontmatter 变换最后统一经 pakodeflateRaw压缩 base64 编码生成#create片段 URLMermaid 会附带MERMAID_DEFAULTS_VERSION 12版本号以锁定 Mermaid 12 默认外观并由openBrowser打开macOS 用open、Linux 用xdg-open、Windows 用临时.url文件超长 URL 则用临时 HTML 页做 JS 重定向规避cmd.exe截断#片段的问题。共享参考跨通道的单一事实源AGENTS.md 强调两份规范文件位于 shared/是所有交付通道MCP App Server、MCP Tool Server、Claude Code 插件、Project Instructions共同消费的单一事实源shared/xml-reference.md——draw.io XML 生成参考样式、边路由、容器、图层、标签、元数据、深色模式、XML 良构规则。被create_diagramapp server与open_drawio_xmltool server消费。shared/mermaid-reference.md——全部受支持 Mermaid 类型的语法参考及 flowchart 样式与 ELK 布局选择器。被open_drawio_mermaidtool server与create_diagramapp server消费。shared/还承载了两个服务器共用的共享逻辑shape-search.js/icon-search.jssearch_shapes算法、mermaid-elk.jsMermaid ELK 布局选择器——withElkLayout drawio-dev 的图表类型检测以及无头 mxGraph 栈——mx-model.js各 pass 需要的 mxGraph 切片含mxGraphModel.updateEdgeParents、mx-xml.jsmxGraphModel XML 与该模型的互转只重写 pass 修改过的内容、normalize-model.js两个服务器对每个 XML 图表应用的归一化与桌面 CLI 的--normalize一致。Tool server 通过copy-shared步骤获得这些副本App server 则直接 import。两个 MCP 服务器在启动时读取这些参考文件并追加到相关工具描述中技能与 Project Instructions 则通过 GitHub URL 引用它们。更新图表生成指导时只改这些文件变更会自动传播到所有消费方。编码约定AGENTS.md 规定了全仓的代码风格Allman 大括号风格所有控制结构、函数、对象与回调的大括号独占一行function example() { if (condition) { doSomething(); } else { doOther(); } }回调优先使用function()表达式而非箭头函数。排障对照表AGENTS.md 提供了一份实战排障表覆盖 LLM 生成图表时的典型失败模式错误原因解决方案输出中出现 XML 注释生成的 XML 里含有!-- --注释删除所有 XML 注释——严格禁止URI malformedCSV 样式属性中的特殊字符使用硬编码颜色不用%column%占位符Service nicht verfügbardraw.io CSV 服务器不可用稍后重试或改用 Mermaid空白图表Mermaid/XML 语法无效检查语法确保正确转义图表与预期不符Mermaid 版本差异简化语法避免边缘情况这些失败模式与 plugins/claude-code/skills/drawio/SKILL.md 中更细的排障表相互印证——后者还补充了边不自闭合缺mxGeometry relative1 asgeometry /子元素导致边不渲染、根单元格缺失id0/id1、Windows 远程桌面/CI 环境的GPU process isnt usable加--disable-gpu等桌面 CLI 场景的坑。总结drawio-mcp 通过「共享单一事实源 多交付通道」的架构把 draw.io 的图表能力以 MCP 工具形式暴露给 LLMApp server 负责聊天内联渲染create_diagramsearch_shapesTool server 负责浏览器打开XML/CSV/Mermaid 三种格式 页面级文件访问 ELK/libavoid 服务端布局插件与 Project Instructions 则提供无需 MCP 的替代路径。对开发者而言掌握每个工具的入参边界postLayout与routing互斥、page的索引/名称/id 三态、CSV 的%column%陷阱、理解归一化与 CDN 缓存的底层机制并按「默认 Mermaid、精度用 XML、关键图避 CSV」的原则调用就能稳定、可靠地把 draw.io 集成进任何 MCP 宿主。赞分享AI 应用MCP 服务交互助手【免费下载链接】drawio-mcp项目地址https://gitcode.com/gh_mirrors/dr/drawio-mcp点击查看免费下载相关推荐显卡总崩溃却查不出病根memtest_vulkan 显存测试5 分钟揪出真凶显卡总崩溃却查不出病根memtest_vulkan 显存测试5 分钟揪出真凶 最近有位朋友向我倒苦水他花大价钱买的游戏本跑分软件分数漂亮可一进大型 3测试硬件开发开发工具mcp-for-beginners 仓库实战用 Python 与 FastMCP 构建 MCP Server 与 Client 的完整指南mcp for beginners 仓库实战用 Python 与 FastMCP 构建 MCP Server 与 Client 的完整指南 本指南以 mcp教程文档人工智能用 mcp-agent 构建 Reference Agent Server从 MCP 工具、Elicitation 到云端部署的完整实战用 mcp agent 构建 Reference Agent Server从 MCP 工具、Elicitation 到云端部署的完整实战 这篇技术指南以 mc人工智能AI AgentAgent 框架MCP ClientsAgent 工作流上一篇华硕笔记本性能优化新选择G-Helper轻量控制工具全面指南下一篇炉石传说HsMod插件55项功能全面优化你的游戏体验创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/10/12 1:59:30

自研分布式锁服务:从Redis到MySQL降级的完整实践

写这篇文章的背景:为什么最终自研了一套分布式锁服务做过几年后端的人,大概率都踩过分布式锁的坑。一开始业务简单,一个定时任务、一个库存扣减,用 Redis 的 SETNX 就能糊弄过去。等业务发展到多个服务实例同时跑、数据一致性要求…

2026/10/12 3:24:34

现代公寓内景全解:动线比例、材质灯光与渲染落地实战指南

现代公寓内部场景这个题目,这几年被问到的频率特别高。圈内人看到“现代公寓内景”这个词,第一反应往往不是某个具体风格,而是一整套关于比例、材质、光线和秩序的处理方式。这篇就从一个刚完成的内景项目说起,把这几年折腾现代公…

2026/10/12 3:24:34

游戏对象模型与资源管理:从ECS到缓存友好的引擎架构实践

1. 游戏对象模型:引擎架构里的“骨架”做游戏引擎的人都有一个共识:引擎里最容易被低估、却最难改好的两个系统,一个管“谁活在场景里”,一个管“这些活物用了什么资源”。前者叫游戏对象架构,后者叫资源管理。很多项目…

2026/10/12 3:24:34

AI端到端交付全栈项目:从需求到上线的实践与边界

说实话,我过去半年对“AI写代码”这件事的态度一直有点拧巴。一方面日常确实在用Copilot补全,确实能省不少敲键盘的时间;另一方面总觉得它离“独立交付一个完整项目”还差得远,更别提什么“全程不写几行代码”。直到前阵子&#x…

2026/10/11 0:02:13

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/11 0:02:13

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/11 0:02:13

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

2026/10/12 0:04:22

绝缘子缺陷检测数据集清洗与工业级训练实战指南

简介:本资源是面向电力AI研发人员、工业视觉工程师及智能巡检系统开发者的绝缘子缺陷检测专用YOLO格式数据集,解决无人机航拍场景下绝缘子破损、污闪、积雪等9类典型缺陷的精准识别与定位难题。数据集共2139张真实巡检图像(含训练/验证/测试集…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑