{"_id":"@plantuml/mcp-js","_rev":"7-8fab8b306d3fa021f2babf241b3c5ab3","name":"@plantuml/mcp-js","dist-tags":{"latest":"0.2.2"},"versions":{"0.1.0":{"name":"@plantuml/mcp-js","version":"0.1.0","keywords":["plantuml","uml","mcp","model-context-protocol","teavm"],"author":{"name":"Arnaud Roques"},"license":"MIT","_id":"@plantuml/mcp-js@0.1.0","maintainers":[{"name":"arnaud.roques","email":"plantuml@gmail.com"}],"homepage":"https://plantuml.com/","bugs":{"url":"https://github.com/plantuml/plantuml/issues"},"bin":{"plantuml-mcp-js":"server.js"},"dist":{"shasum":"e9f5557593dc27443385112f525e1e38446ffc44","tarball":"https://registry.npmjs.org/@plantuml/mcp-js/-/mcp-js-0.1.0.tgz","fileCount":5,"integrity":"sha512-LRmB7wbVroYpBGZ4D/7PNt8FtibNp5V8ckOHU3c1IlSWbpnAE0VvacF8VK1sW3UrsFpK3IXGiTrp271QQLJFQA==","signatures":[{"sig":"MEQCIBoCqCHy0C5f3ydtxV8OjXiSvGsDE/2BmT768DjTSLr7AiAHjwHfTLEfuJ74xuggN81e5V7hYB0stRKHPilg4fVY2A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":6202842},"main":"server.js","type":"module","gitHead":"1333b94b8daac2564a96a45a9a4e5d1862d56307","scripts":{"start":"node server.js"},"_npmUser":{"name":"arnaud.roques","email":"plantuml@gmail.com"},"repository":{"url":"git+https://github.com/plantuml/plantuml.git","type":"git"},"_npmVersion":"11.13.0","description":"Pure Node/JS Model Context Protocol (MCP) server for PlantUML, powered by the TeaVM-compiled engine. No Java runtime required.","directories":{},"_nodeVersion":"24.16.0","dependencies":{"zod":"^3.23.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/mcp-js_0.1.0_1780937127570_0.6876512207533283","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@plantuml/mcp-js","version":"0.1.1","keywords":["plantuml","uml","mcp","model-context-protocol","teavm"],"author":{"name":"Arnaud Roques"},"license":"MIT","_id":"@plantuml/mcp-js@0.1.1","maintainers":[{"name":"arnaud.roques","email":"plantuml@gmail.com"}],"homepage":"https://plantuml.com/","bugs":{"url":"https://github.com/plantuml/plantuml/issues"},"bin":{"plantuml-mcp-js":"server.js"},"dist":{"shasum":"e39f5b91337ed398cee9c64978fe321b9abf90bb","tarball":"https://registry.npmjs.org/@plantuml/mcp-js/-/mcp-js-0.1.1.tgz","fileCount":5,"integrity":"sha512-cCJ8dZc+95wanZcvx9ymcJOZLn4H/MUTpkEVsPSOs8i3V44W0hx+foFT84mAyJek6Qd7tNfwQQkKggZR8R2wQg==","signatures":[{"sig":"MEQCIG5kgEJcmcHMSSENPIsGO81pB2++j1rTwhlqD8k/jV3yAiBs4JvE4x6zCCluBqLry9uGE1WPOcHxOjepP+nv/byCCw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":6196872},"main":"server.js","type":"module","gitHead":"ee49732db38257fd6ec1b5127ac280e972423fba","scripts":{"start":"node server.js"},"_npmUser":{"name":"arnaud.roques","email":"plantuml@gmail.com"},"repository":{"url":"git+https://github.com/plantuml/plantuml.git","type":"git"},"_npmVersion":"11.13.0","description":"Pure Node/JS Model Context Protocol (MCP) server for PlantUML, powered by the TeaVM-compiled engine. No Java runtime required.","directories":{},"_nodeVersion":"24.16.0","dependencies":{"zod":"^3.23.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/mcp-js_0.1.1_1780938410432_0.45112853670852426","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@plantuml/mcp-js","version":"0.1.2","keywords":["plantuml","uml","mcp","model-context-protocol","teavm"],"author":{"name":"Arnaud Roques"},"license":"MIT","_id":"@plantuml/mcp-js@0.1.2","maintainers":[{"name":"arnaud.roques","email":"plantuml@gmail.com"}],"homepage":"https://plantuml.com/","bugs":{"url":"https://github.com/plantuml/plantuml/issues"},"bin":{"plantuml-mcp-js":"server.js"},"dist":{"shasum":"5f0aa0553db7d229fbd4ce6750db49c5d333ebda","tarball":"https://registry.npmjs.org/@plantuml/mcp-js/-/mcp-js-0.1.2.tgz","fileCount":5,"integrity":"sha512-yb0/E2tdEqGY4MMaDr1D3BUyATdFPrErc/oHB3QC9suUQjfMIF6SWAbEiMmfG3xh5oUmXINGokrl5QWQ/sC/lA==","signatures":[{"sig":"MEUCIQCUBwuV6Uuw7ld+W+sF7dNuLg3sgvxisz9pfpNfXJW49wIgGB5NaM98rvxpNM2uV2a2sukft63R4EAjAFweCL+LiAA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":6197718},"main":"server.js","type":"module","gitHead":"3fc6e757b036a666d0be701979377707b9128786","scripts":{"start":"node server.js"},"_npmUser":{"name":"arnaud.roques","email":"plantuml@gmail.com"},"repository":{"url":"git+https://github.com/plantuml/plantuml.git","type":"git"},"_npmVersion":"11.13.0","description":"Pure Node/JS Model Context Protocol (MCP) server for PlantUML, powered by the TeaVM-compiled engine. No Java runtime required.","directories":{},"_nodeVersion":"24.16.0","dependencies":{"zod":"^3.23.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/mcp-js_0.1.2_1780953929722_0.6886552192877606","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@plantuml/mcp-js","version":"0.1.3","keywords":["plantuml","uml","mcp","model-context-protocol","teavm"],"author":{"name":"Arnaud Roques"},"license":"MIT","_id":"@plantuml/mcp-js@0.1.3","maintainers":[{"name":"arnaud.roques","email":"plantuml@gmail.com"}],"homepage":"https://plantuml.com/","bugs":{"url":"https://github.com/plantuml/plantuml/issues"},"bin":{"plantuml-mcp-js":"server.js"},"dist":{"shasum":"6a35696277c47280c0f53b21a37897070ec0fc38","tarball":"https://registry.npmjs.org/@plantuml/mcp-js/-/mcp-js-0.1.3.tgz","fileCount":5,"integrity":"sha512-q14b/fYZcES8ORzHpGCe/zXdqf1mx9DMlG4llgHiVe7rbF5728Di8vg9T2bfdAjwA9F+jNbRi14vTmGZ4rKbXQ==","signatures":[{"sig":"MEYCIQCWBhrN9L3sj8Q8eWCPqqno46YpoS76WX2bYC/Ome5mHgIhAJB7bdg1TE7gae9XauiWKYcv/nuHstTDxHN3TcSZelfy","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":6496762},"main":"server.js","type":"module","gitHead":"08fad0595ab7b345df97f8cd925e42f3a59215dd","scripts":{"start":"node server.js"},"_npmUser":{"name":"arnaud.roques","email":"plantuml@gmail.com"},"repository":{"url":"git+https://github.com/plantuml/plantuml.git","type":"git"},"_npmVersion":"11.13.0","description":"Pure Node/JS Model Context Protocol (MCP) server for PlantUML, powered by the TeaVM-compiled engine. No Java runtime required.","directories":{},"_nodeVersion":"24.16.0","dependencies":{"zod":"^3.23.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/mcp-js_0.1.3_1781549077839_0.9117416281835822","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@plantuml/mcp-js","version":"0.2.0","keywords":["plantuml","uml","mcp","model-context-protocol","teavm"],"author":{"name":"Arnaud Roques"},"license":"MIT","_id":"@plantuml/mcp-js@0.2.0","maintainers":[{"name":"arnaud.roques","email":"plantuml@gmail.com"}],"homepage":"https://plantuml.com/","bugs":{"url":"https://github.com/plantuml/plantuml/issues"},"bin":{"plantuml-mcp-js":"server.js"},"dist":{"shasum":"00a808eb9dfa5d2475bd699cfb9e0a71f1939b36","tarball":"https://registry.npmjs.org/@plantuml/mcp-js/-/mcp-js-0.2.0.tgz","fileCount":5,"integrity":"sha512-bYGd9HCN9Xj3L9VFfV90YcZAwyETkd5PqAFihkJvBoa27+BlGHeync42mdyXyNqbXASKDO7+KkDnj9bRLryCaQ==","signatures":[{"sig":"MEYCIQC3MRAAwE+vfPaYHzJFlhOCuyBa2K52lMtRpUhqloaYiAIhAPwvZDpbi6wRwDP/W9LfZunXEaZ5mjmoISK2G8IMTpBr","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":27392171},"main":"server.js","type":"module","gitHead":"819db0b48b66fe46e3cbb9b5d724c7270ca3fb2f","scripts":{"start":"node server.js"},"_npmUser":{"name":"arnaud.roques","email":"plantuml@gmail.com"},"repository":{"url":"git+https://github.com/plantuml/plantuml.git","type":"git"},"_npmVersion":"11.13.0","description":"Pure Node/JS Model Context Protocol (MCP) server for PlantUML, powered by the TeaVM-compiled engine. No Java runtime required.","directories":{},"_nodeVersion":"24.16.0","dependencies":{"zod":"^3.23.0","@viz-js/viz":"^3.28.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/mcp-js_0.2.0_1782250636134_0.3329920631626144","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@plantuml/mcp-js","version":"0.2.1","keywords":["plantuml","uml","mcp","model-context-protocol","teavm"],"author":{"name":"Arnaud Roques"},"license":"MIT","_id":"@plantuml/mcp-js@0.2.1","maintainers":[{"name":"arnaud.roques","email":"plantuml@gmail.com"}],"homepage":"https://plantuml.com/","bugs":{"url":"https://github.com/plantuml/plantuml/issues"},"bin":{"plantuml-mcp-js":"server.js"},"dist":{"shasum":"41e20a1cb2804a18d35a3468b3aa5f609d42f0e1","tarball":"https://registry.npmjs.org/@plantuml/mcp-js/-/mcp-js-0.2.1.tgz","fileCount":5,"integrity":"sha512-lckxbpW/6tHZ2pPRovPUjCwEpvfcn/XteBmEKcwHpJAeVXLSRy22vJz654joWLCYaRyShxK8kQffAKGe+Xol7Q==","signatures":[{"sig":"MEUCIGYxmwDTd6HDWfbczAkZruhMgX8Jw4M36gLJ6oXGyKKyAiEApdOOChGO4cXrWhdt9+6GL0A33pTWU5pjuVaPAp7E8XI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14442575},"main":"server.js","type":"module","gitHead":"e131e279d48b199892b7d43a59af811efab48ca8","scripts":{"start":"node server.js"},"_npmUser":{"name":"arnaud.roques","email":"plantuml@gmail.com"},"repository":{"url":"git+https://github.com/plantuml/plantuml.git","type":"git"},"_npmVersion":"11.13.0","description":"Pure Node/JS Model Context Protocol (MCP) server for PlantUML, powered by the TeaVM-compiled engine. No Java runtime required.","directories":{},"_nodeVersion":"24.16.0","dependencies":{"zod":"^3.23.0","@viz-js/viz":"^3.28.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/mcp-js_0.2.1_1787651560142_0.6040856725630657","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@plantuml/mcp-js","version":"0.2.2","description":"Pure Node/JS Model Context Protocol (MCP) server for PlantUML, powered by the TeaVM-compiled engine. No Java runtime required.","type":"module","bin":{"plantuml-mcp-js":"server.js"},"main":"server.js","scripts":{"start":"node server.js"},"keywords":["plantuml","uml","mcp","model-context-protocol","teavm"],"homepage":"https://plantuml.com/","repository":{"type":"git","url":"git+https://github.com/plantuml/plantuml.git"},"bugs":{"url":"https://github.com/plantuml/plantuml/issues"},"author":{"name":"Arnaud Roques"},"license":"MIT","dependencies":{"@modelcontextprotocol/sdk":"^1.0.0","@viz-js/viz":"^3.28.0","zod":"^3.23.0"},"gitHead":"994060f34bc8cf9841dc67c9771fc5b2f2b1398f","_id":"@plantuml/mcp-js@0.2.2","_nodeVersion":"24.16.0","_npmVersion":"11.13.0","dist":{"integrity":"sha512-lqryOo1c2RirrU20lVfKxHGWzFSkbaH486pt5rgE+BfUI8VjGDH6FwQcl5Rdk7o3t7gwLIp1WkxfDWtqscPmeg==","shasum":"794def422eee07586e66096120de5949f046366e","tarball":"https://registry.npmjs.org/@plantuml/mcp-js/-/mcp-js-0.2.2.tgz","fileCount":5,"unpackedSize":14639776,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIA6JNzeU2dcvOjLOOc9onVHb0m6XoPxgxJ5AvTtp7/rZAiEAgKYElkZmAKiM+yRPH3lYsQYu4WszzUIyCmPPCjOLn5M="}]},"_npmUser":{"name":"arnaud.roques","email":"plantuml@gmail.com"},"directories":{},"maintainers":[{"name":"arnaud.roques","email":"plantuml@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/mcp-js_0.2.2_1788683159155_0.04658175370633644"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-08T16:45:27.071Z","modified":"2026-09-06T08:25:59.544Z","0.1.0":"2026-06-08T16:45:27.746Z","0.1.1":"2026-06-08T17:06:50.636Z","0.1.2":"2026-06-08T21:25:29.921Z","0.1.3":"2026-06-15T18:44:38.032Z","0.2.0":"2026-06-23T21:37:16.368Z","0.2.1":"2026-08-25T09:52:40.322Z","0.2.2":"2026-09-06T08:25:59.342Z"},"bugs":{"url":"https://github.com/plantuml/plantuml/issues"},"author":{"name":"Arnaud Roques"},"license":"MIT","homepage":"https://plantuml.com/","keywords":["plantuml","uml","mcp","model-context-protocol","teavm"],"repository":{"type":"git","url":"git+https://github.com/plantuml/plantuml.git"},"description":"Pure Node/JS Model Context Protocol (MCP) server for PlantUML, powered by the TeaVM-compiled engine. No Java runtime required.","maintainers":[{"name":"arnaud.roques","email":"plantuml@gmail.com"}],"readme":"# @plantuml/mcp-js\r\n\r\nA pure Node/JavaScript [Model Context Protocol](https://modelcontextprotocol.io)\r\n(MCP) server for PlantUML, powered by the TeaVM-compiled PlantUML engine.\r\n\r\n**No Java required** — the PlantUML engine is compiled to JavaScript with\r\n[TeaVM](https://teavm.org/) from the exact same source as the main PlantUML jar,\r\nso the server runs on a plain Node process.\r\n\r\n## What it is for\r\n\r\nThis is a lightweight alternative to the Java-based [`plantuml-mcp`](https://github.com/plantuml/plantuml-mcp)\r\nserver. Both expose PlantUML capabilities to MCP clients (LLM tools, IDEs,\r\nagents), but they differ in one important way:\r\n\r\n- `plantuml-mcp` (Java / Spring AI) requires a **Java runtime (JRE)** to run.\r\n- `plantuml-mcp-js` requires only **Node.js** — no Java needed.\r\n\r\nThe PlantUML engine itself is compiled to JavaScript with\r\n[TeaVM](https://teavm.org/), from the exact same Java source as the main\r\nPlantUML jar. This dramatically lowers the barrier to entry for the `stdio`\r\ntransport: a user can run the server with `node` without installing or\r\nconfiguring a JVM.\r\n\r\n## Quick test with the MCP Inspector\r\n\r\nTo poke at the tools interactively before wiring up a client, use the\r\n[MCP Inspector](https://github.com/modelcontextprotocol/inspector) — no clone,\r\nno install:\r\n\r\n```sh\r\nnpx @modelcontextprotocol/inspector npx -y @plantuml/mcp-js\r\n```\r\n\r\nIt opens a browser UI (with a session token in the printed URL). Make sure the\r\ntransport is **stdio**, click **Connect**, then open **Tools → List Tools** to\r\nsee `plantuml_version`, `check_syntax`, `render_diagram` and `explain_diagram`,\r\nand run them with the inputs shown below.\r\n\r\n\r\n## Quick start\r\n\r\nYou don't need to clone anything. Point your MCP client at `npx`, which\r\ndownloads and runs the server on demand:\r\n\r\n```json\r\n{\r\n  \"mcpServers\": {\r\n    \"plantuml-js\": {\r\n      \"command\": \"npx\",\r\n      \"args\": [\"-y\", \"@plantuml/mcp-js\"]\r\n    }\r\n  }\r\n}\r\n```\r\n\r\nTo avoid surprise updates, pin a specific version:\r\n\r\n```json\r\n{\r\n  \"mcpServers\": {\r\n    \"plantuml-js\": {\r\n      \"command\": \"npx\",\r\n      \"args\": [\"-y\", \"@plantuml/mcp-js@0.2.0\"]\r\n    }\r\n  }\r\n}\r\n```\r\n\r\nThis works in any MCP client that supports the **stdio** transport (LM Studio,\r\nClaude Desktop, and others). The configuration format varies slightly by client,\r\nbut the `command` / `args` pair is the same. After adding it, restart or reload\r\nyour client's MCP servers and the tools below become available to the model.\r\n\r\nYou can also run it straight from a terminal to check it starts:\r\n\r\n```sh\r\nnpx -y @plantuml/mcp-js\r\n```\r\n\r\nIt prints `plantuml-mcp-js server started (stdio).` to stderr and then waits for\r\na client to connect — that is normal, a stdio server is driven by its client.\r\n\r\n## Tools\r\n\r\n| Tool               | Status      | Description                                      |\r\n| ------------------ | ----------- | ------------------------------------------------ |\r\n| `plantuml_version` | available   | Returns the version of the embedded PlantUML.    |\r\n| `check_syntax`     | available   | Validates a diagram and reports syntax errors.   |\r\n| `render_diagram`   | available   | Renders a diagram to a deterministic SVG.        |\r\n| `explain_diagram`  | available   | Explains a diagram line by line.                 |\r\n\r\n**`plantuml_version`** takes no parameters and returns the version string.\r\n\r\n**`check_syntax`** takes a single `source` parameter. A valid diagram:\r\n\r\n```\r\n@startuml\r\nAlice -> Bob\r\n@enduml\r\n```\r\n\r\nreturns something like:\r\n\r\n```json\r\n{ \"valid\": true, \"diagramType\": \"SequenceDiagram\", \"lineCount\": 3, \"warnings\": [] }\r\n```\r\n\r\nAn invalid one reports the offending line and message:\r\n\r\n```json\r\n{\r\n  \"valid\": false,\r\n  \"lineCount\": 3,\r\n  \"warnings\": [],\r\n  \"errorLineNumber\": 2,\r\n  \"errorMessage\": \"...\",\r\n  \"errorLine\": \"Alice ->\"\r\n}\r\n```\r\n\r\nThe failure fields are `errorLineNumber` (1-based), `errorMessage`, `errorLine`\r\n(the offending source line, when available) and `errorContext`.\r\n\r\n**`render_diagram`** takes a single `source` parameter and renders the diagram\r\nto a deterministic SVG. A valid diagram:\r\n\r\n```\r\n@startuml\r\nAlice -> Bob\r\n@enduml\r\n```\r\n\r\nreturns something like:\r\n\r\n```json\r\n{\r\n  \"valid\": true,\r\n  \"diagramType\": \"SequenceDiagram\",\r\n  \"lineCount\": 3,\r\n  \"warnings\": [],\r\n  \"svg\": \"<svg ...>...</svg>\"\r\n}\r\n```\r\n\r\nThe rendering is **deterministic**: text dimensions come from a built-in glyph\r\nwidth table rather than from the host's installed fonts or AWT, so the same\r\nsource yields byte-for-byte the same SVG on any machine. On failure it reports\r\nthe same fields as `check_syntax` (without `svg`).\r\n\r\n**`explain_diagram`** takes a single `source` parameter and explains how the\r\ndiagram is parsed, line by line. It returns a JSON array of objects, each with\r\n`input` (the source line(s) that produced the explanation), `explain` (a\r\nhuman-readable explanation) and `line` (1-based line number, when available).\r\nFor example:\r\n\r\n```\r\n@startuml\r\nAlice -> Bob\r\n@enduml\r\n```\r\n\r\nreturns something like:\r\n\r\n```json\r\n[\r\n  { \"input\": \"Alice -> Bob\", \"explain\": \"...\", \"line\": 2 }\r\n]\r\n```\r\n\r\n## Scope and limitations\r\n\r\nThe JavaScript build is **headless** (no browser DOM, no *native* Graphviz\r\nbinary). It renders to **SVG only**, via a deterministic, font-metrics-free\r\npipeline (see `render_diagram` above); raster and document formats (PNG/PDF) are\r\nout of scope here. Layouts that need Graphviz (class, state, component, ...) are\r\nhandled by the Viz.js (`@viz-js/viz`) WASM build rather than a native `dot`, so\r\nthey work too — only PNG/PDF output is unavailable.\r\n\r\nIf you need those raster/document formats, use the Java-based\r\n[`plantuml-mcp`](https://github.com/plantuml/plantuml-mcp) server instead. It\r\nexposes the same kind of tools but requires a Java runtime.\r\n\r\n## Architecture\r\n\r\n```\r\nplantuml (root project)                 net.sourceforge.plantuml.teavm.headless.PlantUMLHeadless\r\n        │                               a minimal, DOM-free entry point (@JSExport)\r\n        ▼\r\nplantuml-mcp-js (this subproject)        TeaVM compiles the engine to ES2015 JavaScript\r\n        │                               -> build/generated/teavm/js/plantuml-mcp-js.js\r\n        ▼\r\nserver.js (Node)                         imports the JS module and exposes it as MCP tools\r\n        │                               over the stdio transport\r\n        ▼\r\nMCP client (LM Studio, Claude Desktop, ...)\r\n```\r\n\r\nUnlike the root project's TeaVM *browser* build (`PlantUMLBrowser`), the\r\nheadless entry point stays minimal: `plantuml_version`, `check_syntax` and\r\n`explain_diagram` are synchronous and return plain strings. `render_diagram`\r\nis asynchronous — it runs on a TeaVM worker thread and uses the Viz.js\r\n(`@viz-js/viz`) WASM build for Graphviz-dependent layouts — and delivers its\r\nresult JSON through a callback that `server.js` wraps in a Promise.\r\n\r\n\r\n## Links\r\n\r\n- Source and issues: <https://github.com/plantuml/plantuml>\r\n- PlantUML website: <https://plantuml.com/>\r\n\r\n## License\r\n\r\nMIT.\r\n","readmeFilename":"README.md"}