MCP Server¶
Give an AI agent the InvoicePDFs API as tools. Ask Claude, Cursor or any other MCP client to "render this invoice as a PDF" and it happens — no integration to write first.
Install¶
Add it to your MCP client's configuration:
{
"mcpServers": {
"invoicepdfs": {
"command": "npx",
"args": ["-y", "@invoicepdfs/mcp"],
"env": { "INVOICEPDFS_API_KEY": "inv_live_..." }
}
}
}
Create a key in your dashboard. Set
INVOICEPDFS_BASE_URL as well if you are pointing at a local server.
The server runs on your machine and talks to the API over HTTPS. There is nothing to deploy and no data path that does not already exist — it is an ordinary API client that happens to speak MCP.
An API key is not scoped
Any key you give the server can do anything your account can, including deleting data. That is a property of the key rather than of this server: there is no narrower credential to hand it. Your MCP client will still ask before each tool call, which is the control that actually applies here.
What the agent gets¶
Thirty tools. Twenty-seven name a common operation outright —
document_render, document_create, compliance_check, customer_list and so
on — document_transition covers the document lifecycle, and two reach
everything else:
| Tool | What it does |
|---|---|
find_operation |
Search all operations by what they do, and get the full input schema of each match |
call_operation |
Run one of them |
The whole API is reachable; only the common path is listed up front. Every client caps the tool list — Cursor around 40, Junie 100, Copilot 128 — so a server advertising every operation would either break or crowd out every other server you have connected.
A few tools are worth knowing about before an agent surprises you with them:
document_renderrenders asynchronously and waits for the result, so it returns a finished render rather than a queued one. Rendering is CPU-bound and served by a single worker: prefer one render at a time over starting many in parallel.document_transitioncovers the whole document lifecycle — finalize, mark_sent, mark_paid, mark_unpaid, void, archive, restore — through onetoargument, so an agent does not have to know which transition exists before picking one.document_sendemails a real customer.mark_sentonly records that delivery happened. They are not interchangeable, and the tool descriptions say so, but it is worth knowing which is which before you approve one.
Where tool descriptions come from¶
Every tool's description is the API handler's own documentation, carried through
openapi.json. The server builds its tool surface from that spec at startup, so
an endpoint added to the API becomes a working tool with no release here, and
prose about an operation is never maintained in two places where it can drift.
That is also why a model's answer about an operation tends to match this documentation: both are the same sentences.
Source¶
github.com/invoicepdfs/invoicepdfs-mcp
— published to npm as
@invoicepdfs/mcp with build
provenance, and listed in the
MCP Registry as
io.github.invoicepdfs/mcp.