Open API & MCP Server

Reports that look
ready to send.

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

Built for the last mile of a report.

Bring the content and brand choices. ReportGen takes care of typography, page structure, and a stable PDF output.

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.

Keep every report on-brand

Override colours, fonts, page size, cover layout, and header / footer text in a single JSON field. No CSS knowledge required.

Put it in the workflow

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

Make one before you integrate.

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

A small surface area for a serious output.

curl example
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
MCP Python client snippet
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())