# MCP Media Forge
[](https://www.npmjs.com/package/mcp-media-forge)
[](https://registry.modelcontextprotocol.io)
[](LICENSE)
MCP server that generates diagrams, charts, HTML pages, and slide decks from text DSLs -- designed for AI coding agents to embed into Markdown.
LLM agents call tools like `render_mermaid`, `render_html_page`, or `render_slides` with text input, and get back file paths to assets ready to embed in docs.
## Output Gallery
### Mermaid Flowchart
### Mermaid Sequence Diagram
### D2 Architecture Diagram
### Graphviz Dependency Graph
### Vega-Lite Bar Chart
## Tools
### Diagram & Chart Renderers (Docker)
| Tool | Input | Formats | Use Case |
|------|-------|---------|----------|
| `render_mermaid` | Mermaid code | SVG, PNG | Flowcharts, sequence, ER, state, Gantt, git graphs |
| `render_d2` | D2 code | SVG, PNG | Architecture diagrams with containers and icons |
| `render_graphviz` | DOT code | SVG, PNG | Dependency graphs, network diagrams |
| `render_chart` | Vega-Lite JSON | SVG, PNG | Bar, line, scatter, area, heatmap charts |
### HTML Generators (No Docker)
| Tool | Input | Output | Use Case |
|------|-------|--------|----------|
| `render_html_page` | HTML body + theme | Self-contained HTML | Technical docs, reports, dashboards |
| `render_slides` | JSON slide array + theme | HTML slide deck | Presentations, status updates, walkthroughs |
### Utilities
| Tool | Description |
|------|-------------|
| `get_tool_guide` | Usage examples, anti-patterns, complexity limits per tool |
| `list_assets` | List all generated files in the output directory |
## Quick Start
### 1. Start the rendering container (for diagram tools)
```bash
cd docker
docker compose up -d
```
> HTML page and slide tools work without Docker.
### 2. Install the MCP server
**Option A -- npx (no install)**
```bash
npx mcp-media-forge
```
**Option B -- Clone and build**
```bash
git clone https://github.com/PavelGuzenfeld/mcp-media-forge.git
cd mcp-media-forge
npm install
npm run build
```
### 3. Register with your MCP client
Any MCP-compatible client (Claude Code, Cursor, VS Code + Copilot, Cline, etc.) can use this server. The standard config:
```json
{
"mcpServers": {
"media-forge": {
"command": "node",
"args": ["/path/to/mcp-media-forge/dist/index.js"],
"env": {
"PROJECT_ROOT": "/path/to/your/project"
}
}
}
}
```
Where to add this depends on your client:
- **Claude Code**: `~/.claude/settings.json`
- **Cursor**: MCP settings panel
- **VS Code (Copilot)**: `.vscode/mcp.json`
- **Cline**: MCP server configuration
### 4. Use it
Ask your AI assistant to generate diagrams, pages, or presentations:
> "Create a sequence diagram showing the OAuth2 flow and embed it in the README"
> "Generate an HTML page summarizing the API architecture with KPI cards"
> "Make a slide deck with our Q1 metrics and architecture overview"
The agent calls the appropriate tool, gets back a file path, and embeds it in your markdown.
## How It Works
```
AI Agent (any MCP client)
|
| MCP Protocol (JSON-RPC over stdio)
v
MCP Media Forge (Node.js on host)
|
|--- Diagrams: docker exec (sandboxed, no network)
| |
| v
| Rendering Container
| ├── mmdc (Mermaid CLI + Chromium)
| ├── d2 (D2 diagrams)
| ├── dot/neato (Graphviz)
| └── vl2svg (Vega-Lite via vl-convert)
|
|--- HTML/Slides: template engine (no Docker)
| |
| v
| CSS Design System (4 themes, depth tiers, components)
|
v
docs/generated/
mermaid-a1b2c3.svg
d2-7f8e9a.svg
html_page-d4e5f6.html
slides-8b9c0d.html
```
**Key design decisions:**
- **Text in, file path out** -- returns relative paths, never base64 blobs
- **Content-hash naming** -- same input = same file = free caching + git-friendly
- **SVG preferred** -- vector format, small files, diffs cleanly in git
- **Docker-contained** -- diagram renderers run in a sandboxed container with `network_mode: none`
- **Self-contained HTML** -- pages and slides have zero external dependencies (inline CSS/JS)
- **Input pre-validation** -- catches common mistakes before Docker round-trips
- **Structured errors** -- error responses include `error_type`, `error_message`, and `suggestion` to enable LLM self-correction
## Tool Reference
### get_tool_guide
Get usage guide for any tool before rendering. Returns examples, anti-patterns to avoid, complexity limits, and tips.
```json
{ "tool_name": "mermaid" }
```
Available guides: `mermaid`, `d2`, `graphviz`, `vegalite`, `html_page`, `slides`, or `all` for a summary.
### render_mermaid
```json
{
"code": "flowchart TD\n A[Start] --> B{Decision}\n B -->|Yes| C[Done]",
"format": "svg",
"theme": "default"
}
```
| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `code` | string | required | Mermaid diagram code (must start with diagram type) |
| `format` | `svg` \| `png` | `svg` | Output format |
| `theme` | `default` \| `dark` \| `forest` \| `neutral` | `default` | Mermaid theme |
**Pre-validation catches:** missing diagram type, semicolons, HTML in labels, >25 nodes.
### render_d2
```json
{
"code": "client -> server -> database",
"format": "svg",
"layout": "dagre"
}
```
| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `code` | string | required | D2 diagram code |
| `format` | `svg` \| `png` | `svg` | Output format |
| `theme` | number | -- | Theme ID (0=default, 1=neutral-grey, 3=terminal) |
| `layout` | `dagre` \| `elk` \| `tala` | `dagre` | Layout engine |
**Pre-validation catches:** Mermaid/D2 syntax confusion, unbalanced braces, >3 nesting depth.
### render_graphviz
```json
{
"dot_source": "digraph G { A -> B -> C }",
"engine": "dot",
"format": "svg"
}
```
| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `dot_source` | string | required | Graphviz DOT source code |
| `engine` | `dot` \| `neato` \| `fdp` \| `sfdp` \| `twopi` \| `circo` | `dot` | Layout engine |
| `format` | `svg` \| `png` | `svg` | Output format |
**Pre-validation catches:** missing graph wrapper, `->` in undirected graphs, unbalanced braces.
### render_chart
```json
{
"spec_json": "{\"$schema\":\"https://vega.github.io/schema/vega-lite/v5.json\",\"data\":{\"values\":[{\"x\":1,\"y\":10}]},\"mark\":\"bar\",\"encoding\":{\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}}}",
"format": "svg"
}
```
| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `spec_json` | string | required | Vega-Lite JSON specification |
| `format` | `svg` \| `png` | `svg` | Output format |
| `scale` | number | 1 | Scale factor for PNG output |
**Pre-validation catches:** invalid JSON, missing `$schema`/`data`/`mark`, >500 inline data rows.
### render_html_page
Generates a self-contained themed HTML page. No Docker required.
```json
{
"title": "System Overview",
"body_html": "
Metrics