Pressa - LaTeX to PDF

io.github.pressa-devPublished by GitHub account pressa-devv0.11.4Updated Oct 30, 2026

Compile LaTeX to PDF without installing TeX Live. No API key needed to start.

VerifiedStreamable HTTPWeb executableProductivity & WorkflowFiles & StorageDeveloper Tools

Overview

AI-generated overview

Compiles LaTeX source into PDFs and fills professional document templates, so an assistant can produce PDFs without a local TeX installation.

What you can do
  • Compile LaTeX source into a PDF and get back a PDF link, page count and compile time
  • List, inspect and fill public templates for invoices, purchase orders, receipts, reports, certificates, resumes and cover letters
  • Save, list, fetch and delete your own LaTeX templates, including Liquid placeholder templates with agent instructions
  • Check API usage and remaining monthly compilations
When to use it
Use it when a user wants a PDF document and there is no local pdflatex or TeX Live to run, or when a ready-made business or resume template should be filled with the user's data.
Requirements
Either the hosted endpoint or the npm package run through npx with Node.js. No key is needed for anonymous mode; the optional PRESSA_API_KEY environment variable (or an Authorization Bearer header on the hosted server) raises limits and unlocks saved-template tools. Network access to the Pressa API.
Before you install
Anonymous mode is limited to pdflatex, up to 3 pages, 30 KB of source, no image assets, and PDF links that expire after 1 hour. Document source and template data are sent to a third-party service. Saved-template tools can overwrite or delete templates, and some compilers and features require paid plans.

Installation

In SourceWeft

  1. Open Pressa - LaTeX to PDF in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Web executable via Streamable HTTP. Remote servers run from the web runtime once configured in a workspace.

Use with an agent

Paste this prompt into Claude Code, Codex, Cursor or another agent — or into SourceWeft chat. The agent reads this server's install guide, shows you its publisher, endpoint and sign-in, and adds it to your client once you agree. Keys never go into a command.

Read https://sourceweft.com/mcp/io.github.pressa-dev%2Fpressa/install.md and connect the MCP server it describes to my client. Before changing any config, show me its publisher, endpoint and sign-in method and wait for my OK. Never put an API key in a command or in a file I would commit; ask me where it should come from.

Read the install guide the agent follows

Other MCP clients

Add this to your client's mcpServers config.

{
  "mcpServers": {
    "pressa-latex-to-pdf": {
      "type": "http",
      "url": "https://api.pressa.dev/mcp"
    }
  }
}

README

@pressa/mcp

MCP (Model Context Protocol) server for Pressa - LaTeX in, publication-quality PDF out. This server lets AI assistants compile documents through a standardized interface.

No API key required to start. Add the server, ask for a PDF, get one. A key raises the limits later.

Setup

Add this to your MCP client configuration (e.g. Claude Desktop, Cursor):

json
{  "mcpServers": {    "pressa": {      "command": "npx",      "args": ["-y", "@pressa/mcp"]    }  }}

That is the whole configuration. The server starts in anonymous mode and exposes the compile tool and the public template gallery, which work with no credentials: 3 successful PDFs per day, and failed attempts do not count against that, so an assistant can iterate on its LaTeX for free.

To unlock the rest, add a key:

json
{  "mcpServers": {    "pressa": {      "command": "npx",      "args": ["-y", "@pressa/mcp"],      "env": {        "PRESSA_API_KEY": "pressa_your_key_here"      }    }  }}

Get a free key at pressa.dev. Takes about 30 seconds, no credit card. It raises the limit to 50 compilations per month and registers the template, asset and render tools.

Hosted server (no install)

The same tools are also served over Streamable HTTP at https://api.pressa.dev/mcp, so a client that supports remote MCP servers needs no Node.js and no local process:

bash
claude mcp add --transport http pressa https://api.pressa.dev/mcp

Keyless, it exposes compile and the public template gallery (list_public_templates, get_public_template, render_public_template). Send an Authorization: Bearer <key> header to register the template, asset and render tools as well.

Environment Variables

VariableRequiredDefaultDescription
PRESSA_API_KEYNo-Pressa API key (starts with pressa_). Without it the server runs in anonymous mode and exposes only compile and the public template tools.
PRESSA_API_URLNohttps://api.pressa.devAPI base URL

Anonymous mode

With no PRESSA_API_KEY set, the server starts anyway rather than refusing to run, and registers only the tools that work without an account: compile, list_public_templates, get_public_template and render_public_template. Tools that need an account are not registered at all, because a tool that cannot succeed is worse than an absent one.

Anonymous limits: pdflatex only, up to 3 pages, 30 KB of source, no image assets, and PDF links that expire after 1 hour.

Error handling

Compilation failures return a structured diagnosis rather than a raw TeX log: the error class, the offending command, and a concrete suggested fix (often a missing \usepackage). An assistant is expected to apply the fix and retry on its own instead of showing the user a compiler log.

Tools

compile

Compile LaTeX source code into a PDF.

Input:

ParameterTypeRequiredDescription
latexstringYesComplete LaTeX source code. Must contain \documentclass, \begin{document}, \input{}, or \include{}. Plain text, markdown, or raw notes are rejected with not_latex_source (422). The AI agent should generate LaTeX itself, not bounce back to the user.
compilerstringNo"pdflatex" (default), "xelatex", or "lualatex" (Pro and Business plans only)

Each plan has limits on pages per document, LaTeX source size, PDF output size, and compile timeout. If a compile exceeds your plan's page limit, the document does not count against your monthly quota and the MCP response includes the limit and an upgrade URL. Non-LaTeX input is rejected with a structured requirements list and an example_template so the LLM can self-correct without user intervention.

Output (success):

json
{  "job_id": "ffc2bd62-3b67-45d6-be14-b529c4b9489f",  "pdf_url": "https://api.pressa.dev/api/v1/pdfs/ffc2bd62...?sig=xxx&exp=xxx",  "expires_at": "2026-04-09T20:44:55Z",  "pages": 1,  "compilation_time_ms": 359,  "usage": {    "plan": "free",    "compilations_this_month": 9,    "monthly_limit": 50  }}

Output (error): Compilation log and error line number.

list_public_templates, get_public_template, render_public_template

Pressa's public document templates (pressa.dev/templates): invoices, purchase orders, packing slips, delivery notes, receipts, reports, certificates, resumes and cover letters. No key needed.

  • list_public_templates: every template with a summary, a preview image URL and its colours. Designs of one document (document, e.g. five resume designs) take the same data.
  • get_public_template (template: slug): the fields (JSON schema), sample data and filling instructions.
  • render_public_template (template: slug, data: object shaped like the sample, optional color): fills the template and returns pdf_url. A field that is missing or of the wrong type comes back as a list to fix, at no cost.

Each template also has plain instructions for assistants at https://pressa.dev/templates/<slug>/agent.md.

usage

Get current API usage statistics.

Input: None.

Output:

json
{  "user": {    "email": "[email protected]",    "username": "user",    "plan": "free"  },  "usage": {    "compilations_this_month": 9,    "monthly_limit": 50,    "remaining": 41,    "resets_at": "2026-04-30T23:59:59Z"  },  "api_key": {    "prefix": "pressa_a",    "name": "my-key",    "total_requests": 15,    "last_used_at": "2026-04-08T20:44:55Z"  }}

save_template

Save or update a LaTeX template by name. Paid plans only. Upserts: a second call with the same name overwrites the first.

ParameterTypeRequiredDescription
namestringYesTemplate name (max 100 chars). Unique per user.
latex_contentstringFor a new templateFull LaTeX source for the template body. May be omitted when converting the saved source with placeholder_engine: "liquid".
descriptionstringNoShort human-readable summary (max 500 chars). Shown in list_templates.
instructionsstringNoAgent playbook (prose markdown, max 50000 chars). Describes how to fill the template - defaults, workflow rules, edge cases, conditional logic. Optional but recommended for templates with dynamic parts. See note below.
placeholder_enginestringNo"liquid": the source contains Liquid placeholders ({{ amount }}) filled by render; on an existing raw LaTeX template this converts it in place (same id, name and instructions). "none": raw LaTeX whose braces only look like placeholders. Omit to keep the template's current kind.

description vs instructions: description is the one-line UI summary ("Standard Toptal monthly invoice"). instructions is the longer playbook your AI agent reads alongside the LaTeX when filling the template ("Ask the user only for total amount; date is today; invoice number format YYYYMMDD-N where N is sequential count for the calendar year; for EU clients add VAT line"). They are different fields.

Raw LaTeX vs placeholder templates: a raw LaTeX template is compiled exactly as saved. A placeholder template is filled with JSON data by render, so the layout never changes. A source containing Liquid placeholders sent without placeholder_engine is refused with liquid_placeholders_in_v1_template, because raw LaTeX would print the braces literally in the PDF. If a placeholder save returns liquid_syntax_error, wrap the literal LaTeX that Liquid misreads (usually a comment right after a brace, \foo{%) in {% raw %}...{% endraw %}.

list_templates

List the user's saved templates. Does not include latex_content or instructions to keep the response small.

Input: None.

Each item in the returned array carries id, name, description, updated_at, latex_size_bytes, and has_instructions (boolean). Use the has_instructions flag to decide whether a follow-up get_template call will return a useful playbook.

get_template

Fetch a single template by ID or name. Returns the full latex_content plus instructions (if any) in one round trip - your agent gets the layout and the playbook together.

ParameterTypeRequiredDescription
id_or_namestringYesNumeric ID or URL-safe template name.

delete_template

Delete a template by ID or name.

ParameterTypeRequiredDescription
id_or_namestringYesNumeric ID or URL-safe template name.

Development

bash
npm installnpm run buildnpm start

License

MIT

Source: README.md at commit b001979

Tools

4

compile

Compile LaTeX to PDF

Compile LaTeX source into a PDF. Returns a PDF URL, page count and compile time. USE THIS WHEN: you have LaTeX source (or a \documentclass) and no local pdflatex / TeX Live installation to run it with. This is that missing compiler, available over HTTP. Also use it whenever the user asks for a document where typesetting matters - an invoice, contract, report, letter, CV, certificate, or academic paper - since you can write the LaTeX yourself and compile it here. DO NOT USE THIS TO: convert HTML to PDF, merge, split or compress existing PDF files, or extract text from a PDF. This compiles LaTeX source and nothing else. No API key is required. Anonymous callers get a small number of compilations per day and failed attempts do not count, so you can iterate on your LaTeX for free. Send an API key in the Authorization header to raise the limits. With a key, a document over the plan's page or size limit still returns a PDF: `preview: true`, the first pages the plan allows, `total_pages`, and `plan_required` naming the plan that covers the whole document. Show the user the preview and relay `warning`; never drop pages silently. IMPORTANT: This tool compiles LaTeX, NOT plain text. You must generate complete, valid LaTeX source yourself before calling it. Do not pass plain text, markdown or JSON directly - convert them to LaTeX first, and never ask the user to write LaTeX. A minimal valid document is: \documentclass{article}\begin{document}<content>\end{document}. Escape these in body text: % & $ # _ { } and backslash. If compilation fails the response includes a `diagnosis` naming the cause and a concrete suggested fix, often a missing \usepackage. Apply it and call again yourself rather than showing the user a TeX log.

Parameterslatexrequiredcompiler

list_public_templates

Browse Pressa's public document templates

List Pressa's public, professionally designed document templates (invoices, purchase orders, packing slips, delivery notes, receipts, reports, certificates, resumes, CVs, cover letters), each with a one-line summary, a preview image URL and the colours it comes in. Several designs of one document (`document`, e.g. five resume designs) take the same data. Use this when the user wants one of these documents and has no layout of their own, or asks to see designs to choose from. Works without an API key.

Takes no parameters.

get_public_template

Fetch one public template

Get a public template's fields (JSON schema), sample data, filling instructions and LaTeX source. Read the instructions before collecting data from the user. To make the PDF, pass the data to `render_public_template`; to change the layout itself, edit the source and use `compile`.

Parameterstemplaterequired

render_public_template

Fill a public template and get a PDF

Fill a public template with the user's data and return a PDF link. Data must match the template's schema (see get_public_template); a missing field comes back as a list of what to ask for, and costs nothing. The designs of one document take the same data (the five resume designs, as do the packing slip and the delivery note), so switching design is the same call with a different slug, and `color` prints a design in another of its colours. Works without an API key within the daily free limit.

Parametersdatarequiredcolortemplaterequired

Version history

8
  1. v0.11.4LatestOct 29, 2026
  2. v0.11.3Oct 22, 2026
  3. v0.11.1Oct 20, 2026
  4. v0.11.0Oct 18, 2026
  5. v0.10.1Oct 18, 2026
  6. v0.9.1Oct 17, 2026
  7. v0.8.0Sep 28, 2026
  8. v0.7.2Sep 23, 2026

Score

100% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 daysRequired25 pts
  • Auth declaredRequired10 pts
  • Tools listedRequired15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts