fusion-svg-mcp
# fusion-svg-mcp
MCP server that generates **Disler-style** [fusion-harness](https://github.com/disler/fusion-harness) README diagrams — same dark GitHub chrome, monospace type, role colors, and CSS flow animations.
Used by the fork: [oteroantoniogom/fusion-models](https://github.com/oteroantoniogom/fusion-models).
## Install
```bash
git clone https://github.com/oteroantoniogom/fusion-svg-mcp.git
cd fusion-svg-mcp
npm install
```
### Cursor MCP (`~/.cursor/mcp.json`)
```json
{
"mcpServers": {
"fusion-svg": {
"command": "npx",
"args": ["tsx", "src/server.ts"],
"cwd": "/ABSOLUTE/PATH/TO/fusion-svg-mcp"
}
}
}
```
On Windows, prefer an absolute `node.exe` + `tsx` path if `npx` is unreliable in MCP hosts.
## Tools
| Tool | Purpose |
|---|---|
| `list_style_tokens` | Palette, glyphs, structural rules from Disler originals |
| `list_diagrams` | Diagram ids (`svg-07`…`svg-12`) + reference originals |
| `preview_diagram` | Return SVG markup without writing |
| `generate_diagram` | Write one SVG to disk |
| `generate_all_fork_diagrams` | Write all fork diagrams |
## CLI
```bash
npm run generate
npm run generate -- gauntlet-pipeline
npm run generate -- --out ./out
```
## Diagrams
| Id | File |
|---|---|
| `gauntlet-campaign` | `svg-07-gauntlet-campaign.svg` |
| `coordination-suite` | `svg-08-coordination-suite.svg` |
| `multi-provider-cast` | `svg-09-multi-provider-cast.svg` |
| `council-panel` | `svg-10-council-panel.svg` |
| `value-ladder` | `svg-11-value-ladder.svg` |
| `gauntlet-pipeline` | `svg-12-gauntlet-pipeline.svg` |
Open `preview.html` to compare against upstream `svg-03`.
## Examples (prompt → result)
| Prompt | Result SVG |
|---|---|
| [`examples/gauntlet-pipeline.prompt.md`](./examples/gauntlet-pipeline.prompt.md) | [`examples/gauntlet-pipeline.result.svg`](./examples/gauntlet-pipeline.result.svg) |
| [`examples/coordination-suite.prompt.md`](./examples/coordination-suite.prompt.md) | [`examples/coordination-suite.result.svg`](./examples/coordination-suite.result.svg) |
| [`examples/council-panel.prompt.md`](./examples/council-panel.prompt.md) | [`examples/council-panel.result.svg`](./examples/council-panel.result.svg) |
Flow diagram: [`examples/prompt-to-result.result.svg`](./examples/prompt-to-result.result.svg)
```bash
npm run examples
```
<p align="center">
<img src="examples/prompt-to-result.result.svg" alt="MCP prompt in, SVG result out" width="760">
</p>
<p align="center">
<img src="examples/gauntlet-pipeline.result.svg" alt="Example gauntlet-pipeline result" width="850">
</p>
## Style grammar (from Disler originals)
| Token | Rule |
|---|---|
| Canvas | `#0d1117`, `rx=14`, inset stroke `#30363d` |
| Cards | `#161b22`, `rx=10`, accent stroke `1.5` |
| Roles | architect `#a78bfa` · builder `#f0b429` · fusion `#22d3ee` · success `#3fb950` · error `#f85149` · panel `#58a6ff` |
| Font | `ui-monospace,SFMono-Regular,Menlo,Consolas,monospace` |
| Motion | `.flow` dash march `1.1s` + `prefers-reduced-motion: reduce` |
## License
MIT
TDQS
Scored across 5 tools
Most tools are clearly distinct: list vs generate vs preview operations. However, generate_diagram and generate_all_fork_diagrams overlap somewhat in purpose (both generate diagrams to disk), distinguished mainly by count. preview_diagram, list_diagrams, and list_style_tokens are clearly distinct.
Names follow a consistent verb_noun pattern (list_, generate_, preview_). The pattern is consistent throughout; generate_all_fork_diagrams is slightly longer/more specific but still fits the pattern. All snake_case, consistent verb-first style.
Five tools is a well-scoped count for an SVG diagram generator MCP server. Each tool serves a clear role: discovery (list_diagrams), style reference (list_style_tokens), single generation, bulk generation, and in-memory preview. No redundancy or bloat.
The surface covers the core lifecycle: list available diagrams, inspect style tokens, generate (single and all), and preview without writing. Minor gaps include no delete/cleanup tool and no way to configure output beyond outDir, but the main generate workflow is complete.