Use the source you already have
Send any CommonMark / GFM Markdown document — headings, tables, code blocks, footnotes. ReportGen parses and lays it out for print.
Open API & MCP Server
Turn Markdown into branded, publication-quality PDFs through one dependable HTTP API or an MCP tool your agents already understand.
No account needed. Your sample is rendered in your browser session.
From source to sendable
Bring the content and brand choices. ReportGen takes care of typography, page structure, and a stable PDF output.
Send any CommonMark / GFM Markdown document — headings, tables, code blocks, footnotes. ReportGen parses and lays it out for print.
Override colours, fonts, page size, cover layout, and header / footer text in a single JSON field. No CSS knowledge required.
Mount /mcp in any MCP-compatible agent host.
The render_pdf tool is auto-discovered via the tools
listing endpoint.
A real render, not a mockup
Render up to 50 KB of Markdown. The public demo is limited to 5 renders per hour, per IP.
When you are ready to automate
curl -s https://your-instance/v1/render \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"markdown": "# Hello World\n\nThis is a test.",
"metadata": {
"title": "Hello World",
"author": "Your Name"
},
"theme": {
"template": "default"
}
}' \
--output report.pdf
import asyncio, base64
from mcp import ClientSession, StdioServerParameters
from mcp.client.streamable_http import streamablehttp_client
async def render_via_mcp():
async with streamablehttp_client(
"https://your-instance/mcp",
headers={"Authorization": "Bearer YOUR_TOKEN"},
) as (read, write, _):
async with ClientSession(read, write) as session:
await session.initialize()
result = await session.call_tool(
"render_pdf",
arguments={
"markdown": "# Hello\n\nFrom MCP.",
"metadata": {"title": "MCP Report", "author": "Agent"},
},
)
# Find the PDF blob in the result content
for item in result.content:
if hasattr(item, "resource") and item.resource.mimeType == "application/pdf":
pdf_bytes = base64.b64decode(item.resource.blob)
with open("report.pdf", "wb") as f:
f.write(pdf_bytes)
asyncio.run(render_via_mcp())