# Show HN: MintPDF – HTML/Markdown to PDF API with an MCP Server

> Source: <https://mintpdf.dev>
> Published: 2026-08-12 12:25:59+00:00

A PDF API for developers and AI agents. No template editor, no template IDs, no dashboard. One POST request, or one MCP tool call. Markdown comes with a stylesheet that makes agent-written documents look right by default.

| built for | invoices · receipts · reports · agent output |
| send | Markdown, HTML, or a public URL |
| get back | PDF bytes, or a link that expires in an hour |

```
# Invoice #42

| Item   | Price  |
|--------|--------|
| Widget | $9.00  |
```

| Item | Price |
|---|---|
| Widget | $9.00 |
| Gadget | $24.00 |

```
# no signup needed, 10 seconds
curl -X POST https://mintpdf.dev/v1/pdf \
  -H "Content-Type: application/json" \
  -d '{"markdown":"# Invoice #42\n\n| Item | Price |\n|---|---|\n| Widget | $9.00 |\n| Gadget | $24.00 |","pageNumbers":true}' \
  --output invoice.pdf

# → 200 application/pdf · one A4 page, table already styled

# want a link instead of bytes? add:
  "output": "url"  → {"download_url": "…", "expires_at": "…"}
# one line in your MCP config
"mintpdf": {
  "command": "npx",
  "args": ["-y", "mintpdf-mcp"]
}

# or point straight at the hosted endpoint with mcp-remote:
# …railway.app/mcp
```

| tools | generate_pdf · pdf_from_url |
| transport | streamable HTTP, stateless |
| returns | download URL, 1h TTL |

``` bash
# send content, not a template id
$ curl -sS -X POST https://mintpdf.dev/v1/pdf \
     -H 'Content-Type: application/json' \
     -d '{"markdown":"# Q3 report\n\nRevenue grew **12%**.",
          "pageNumbers":true, "footerText":"Acme Ltd"}' \
     -o report.pdf -D -

HTTP/2 200
content-type: application/pdf
x-ratelimit-remaining: 2

$ pdfinfo report.pdf | head -3
Pages:          3
Page size:      595 x 842 pts (A4)
File size:      166 kB

# prefer a link? add "output":"url"
$ curl -sS …/v1/pdf -d '{"markdown":"# Hi","output":"url"}'
{"download_url":"https://mintpdf.dev/f/…",
 "expires_at":"…","size_bytes":6751}  ✓
# the file is deleted an hour later
```

One POST, or one MCP tool call from an agent. No template to design first, no template id to keep in sync with your code.

Markdown gets a stylesheet that keeps code blocks and tables whole across page breaks and repeats table headers. Send HTML instead and your own CSS is used as-is.

Stream the file straight into your response, or take a download URL valid for one hour. Nothing is stored afterwards.

One email, one key, no card. Or try 10 renders a day with no signup at all. Lost your key? Ask again with the same email.

```
# or from the terminal
curl -X POST …/v1/keys \
  -d '{"email":"you@example.com"}'
```

| format | A4 · Letter · Legal · A3 · A5 |
| margin | any, e.g. "18mm" |
| landscape | true / false |
| header / footer | text on every page |
| pageNumbers | "3 / 7" in footer |
| engine | Chromium. Your CSS works |

| Solo | $19 /mo | 3,000 renders/month |
| Team | $49 /mo | 12,000 renders/month |
| Scale | $129 /mo | 50,000 renders/month |

Your documents are rendered and forgotten.
**Generated files auto-delete after one hour.** No accounts, no
document storage, no tracking of what you render. Requests to private and internal addresses
are blocked at the browser layer.
