pdf-reporter-mcp
MCP server for rendering Mermaid diagrams to SVG and converting Markdown with callout blocks into styled PDF reports.
README
PDF Reporter MCP
Multi-purpose MCP server for generating SVG diagrams and PDF documents. Render Mermaid diagrams to SVG, compose Markdown content with callout blocks, and produce styled PDF reports — all through standard MCP tools.
Features
- Mermaid to SVG — Render Mermaid diagrams to clean SVG via dedicated MCP tool
- Markdown to PDF — Convert Markdown content with custom callout blocks to styled PDF documents
- Callout Blocks — 9 callout types (idea, automation, warning, success, info, critical, business, expert, tip) using
:::type Titlesyntax - Pastel Theme — Professional styling with configurable pastel color palette
- Harmonious Diagrams — Pastel fills with tonal text and borders for visual consistency
- MCP Protocol — Standard MCP server with stdio and SSE transports
Quick Start
Installation
git clone https://github.com/alexmakeev/pdf-reporter-mcp.git
cd pdf-reporter-mcp
npm install
Usage
# Development
npm run dev
# Production
npm run build && npm start
# Docker (pre-built image)
docker run --rm -p 3000:3000 -e TRANSPORT=sse ghcr.io/alexmakeev/pdf-reporter-mcp:latest
# Docker (build locally)
docker compose up
MCP Client Configuration
{
"mcpServers": {
"pdf-reporter": {
"command": "node",
"args": ["/path/to/pdf-reporter-mcp/dist/server.js"]
}
}
}
Docker
Pre-built Docker images are published to GitHub Container Registry on every push to main.
Pull and Run
docker pull ghcr.io/alexmakeev/pdf-reporter-mcp:latest
docker run --rm -p 3000:3000 -e TRANSPORT=sse ghcr.io/alexmakeev/pdf-reporter-mcp:latest
MCP Client Configuration (Docker)
{
"mcpServers": {
"pdf-reporter": {
"url": "http://localhost:3000/sse"
}
}
}
Available Tags
| Tag | Description |
|---|---|
latest |
Latest build from main branch |
main |
Same as latest |
v1.0.0 |
Specific release version |
sha-abc1234 |
Specific commit build |
Custom Configuration
docker run --rm \
-p 3000:3000 \
-e TRANSPORT=sse \
-e THEME_PRIMARY_COLOR="#E81E63" \
-v $(pwd)/output:/app/output \
ghcr.io/alexmakeev/pdf-reporter-mcp:latest
MCP Tools
1. render_diagram
Render a single Mermaid diagram to SVG.
Input Parameters:
mermaid(required, string) — Mermaid diagram definition
Output:
{
"svg": "<svg>...</svg>"
}
2. render_content
Render Markdown content with callouts and diagram placeholders to HTML.
Input Parameters:
content(required, string) — Markdown content with optional callout syntaxdiagrams(optional, object) — Pre-rendered SVG diagrams:{ [name]: string }
Output:
{
"html": "<article>...</article>"
}
3. generate_pdf
Generate a PDF document from HTML content.
Input Parameters:
title(required, string) — Document title for cover pagehtml(required, string) — Rendered HTML contentsubtitle(optional, string) — Document subtitlelogo(optional, string) — Logo as data URI or file pathtemplate(optional, string, default:generic) — Template nameoptions(optional, object) — PDF generation options:pageSize(string, default:A4) — Page size (e.g.A4,Letter)toc(boolean, default:false) — Generate table of contentsheaderTemplate(string or false) — Custom header template HTMLfooterTemplate(string or false) — Custom footer template HTMLmargins(object) — Page margins withtop,bottom,left,right(e.g.17mm)
Output:
{
"path": "/tmp/pdf-reporter-output/document-title.pdf",
"size": "2.4 MB",
"pages": 15
}
4. list_templates
List available report templates.
Output:
{
"templates": [
{
"name": "generic",
"description": "Universal report template with cover page, optional TOC, and markdown content"
}
]
}
5. get_template_schema
Get the input schema for a specific template.
Input:
template(required, string) — Template name
Output:
{
"required": ["title", "html"],
"optional": ["subtitle", "logo", "options"]
}
Workflow
The typical workflow is three steps:
1. render_diagram → Mermaid source → SVG string
2. render_content → Markdown + SVGs → HTML
3. generate_pdf → HTML + metadata → PDF file
Callout Syntax
:::info Important Note
This is an informational callout block.
Supports **markdown** inside.
:::
:::warning Caution
Be careful with this operation.
:::
:::success Achievement Unlocked
All systems operational.
:::
Supported Callout Types
| Type | Emoji | Use Case |
|---|---|---|
info |
ℹ️ | General information |
idea |
💡 | New ideas and suggestions |
automation |
🤖 | Automation features |
warning |
⚠️ | Warnings and cautions |
success |
✅ | Successful outcomes |
critical |
🔴 | Critical alerts |
business |
💰 | Business insights |
expert |
🔍 | Expert recommendations |
tip |
💎 | Tips and best practices |
Example
See the demo report for a complete example featuring all capabilities.
Generated with examples/generate-demo.ts.
Theme Configuration
| Variable | Default | Description |
|---|---|---|
THEME_PRIMARY_COLOR |
#4169E1 |
Primary accent color (Royal Blue) |
THEME_COVER_COLOR |
same as primary | Cover page accent color |
The server auto-generates a pastel palette from the primary color for backgrounds, table headers, and cover elements. All text remains dark for readability.
Example:
export THEME_PRIMARY_COLOR="#E81E63"
export THEME_COVER_COLOR="#880E4F"
npm run dev
Architecture
MCP Input
→ Mermaid Renderer (mmdc CLI → SVG)
→ Callout Parser (:::syntax → HTML)
→ Markdown Renderer (marked + highlight.js)
→ Template Engine (Handlebars)
→ PDF Generator (Puppeteer)
Development
npm run dev # Start dev server
npm test # Run 164 tests
npm run test:watch # Watch mode
npm run test:mutation # Mutation testing (Stryker)
npm run build # TypeScript compilation
See docs/dev.md for the full developer guide.
Deployment
See docs/prod.md for Docker and Dokploy deployment instructions.
Testing
- 164 unit tests across 8 test suites (vitest)
- 94.21% mutation score via Stryker (minimum 89% per module)
- All tests run offline with mocked dependencies
Tech Stack
| Component | Technology |
|---|---|
| Runtime | Node.js 20+, TypeScript (strict) |
| Puppeteer (headless Chrome) | |
| Diagrams | @mermaid-js/mermaid-cli |
| Templates | Handlebars |
| Markdown | marked + highlight.js |
| MCP | @modelcontextprotocol/sdk |
| Tests | vitest + Stryker |
License
MIT © Alexander Makeev
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.