By the Easy PDF Server Team · October 2026
Every AI agent that produces a document hits the same wall. The model can write the HTML. It cannot turn that HTML into a file you can open, attach, or print. So a person copies the output into a browser, or a developer builds a headless Chromium service and finds out why everyone else stops at wkhtmltopdf.
The Model Context Protocol closes that gap by giving the model a tool it is allowed to call. We shipped an MCP server for Easy PDF Server, so an agent can render the document itself and hand you the path.
MCP is how a client such as Claude Desktop, Cursor, or Claude Code discovers tools a model can use. The
server describes its tools and their arguments. The model chooses one, calls it, and gets a result back.
For PDFs that means the model writes the markup and calls html_to_pdf, and a real file exists
when it finishes. No copy and paste, no second window, no "download this and rename it".
The server is one file with no dependencies. It needs Node 18 or newer.
curl -fsSL https://www.easypdfserver.com/mcp/easypdfserver-mcp.mjs -o /easypdfserver-mcp.mjs
Add it to your client configuration, using the absolute path to the file and an API key:
{
"mcpServers": {
"easypdfserver": {
"command": "node",
"args": ["/Users/you/easypdfserver-mcp.mjs"],
"env": {
"EASYPDF_API_KEY": "eps_your_key_here"
}
}
}
}
The same block works in Claude Desktop's claude_desktop_config.json, Cursor's
mcp.json, and Claude Code. Restart the client and the two tools appear.
html_to_pdf takes an HTML string and an optional filename.url_to_pdf takes a public URL and an optional filename.Both write the PDF to /.easypdfserver and return the absolute path, so the model can tell you
where the file is or pass it to another tool. If you need the bytes instead, ask for
return_base64 and the result carries an embedded application/pdf resource.
You ask: "Turn this quarter's numbers into a one page PDF and put it on my desktop." The model writes the
HTML, including the table and whatever CSS it wants, calls html_to_pdf with
filename: "q3-summary.pdf", and replies with the path. The document is already there.
Or: "Save the pricing page as a PDF before it changes." The model calls url_to_pdf and the
renderer fetches the page, runs its JavaScript, and prints it the way a browser would.
One honest note: the model still writes the HTML. The server only renders it. When the output looks wrong, the fix is usually in the CSS, and the model can make that change on the next call.
fetch.url_to_pdf. Private and local addresses are rejected.@page rules are respected."EASYPDF_API_URL": "https://your-instance" to the same
env block.The full reference, including the config block for each client, is in the API documentation. New subscriptions start with a 7-day free trial, card required, and the demo key renders without an account if you just want to see it work.