Press-ready is a standard, not a prayer. Connect an AI client and let it drop, check, fix, impose and ship — against the same engine a production floor bets its plates on.
POST https://pdfmodule.com/mcp
JSON-RPC 2.0 over HTTP POST. There is no SSE stream and no session id —
every request carries its own bearer token, so the server is stateless.
GET returns 405 by design.
| Protocol versions | 2025-11-25, 2025-06-18, 2025-03-26, 2024-11-05. The server echoes the version you request when it speaks it, and pins to the newest otherwise. |
|---|---|
| Methods | initialize, ping, tools/list, tools/call. resources/list and prompts/list answer empty. |
| Batching | Accepted, never required. Maximum 20 messages. |
| Body limit | 4 MB. Files travel as handles, not as inline base64. |
The same steps the dashboard shows, so a client can be wired up before you have an account. PKCE (S256) is mandatory and refresh tokens rotate; you can disconnect any client afterwards from Connect AI.
https://pdfmodule.com/mcp
Every client below wants the same thing: that address. Sign-in happens in your browser — there is no key to paste unless you want one.
Free, Pro, Max, Team and Enterprise plans can all add a custom connector.
On Team and Enterprise an owner adds it once under Organization settings → Connectors → Add → Custom → Web; everyone else then authenticates from Customize → Connectors.
Custom MCP connectors live behind developer mode, so switch that on first.
If you change plan later, open the app and press refresh — ChatGPT re-reads the tool list from the server.
One command, then authenticate in the browser it opens.
claude mcp add --transport http pdfmodule https://pdfmodule.com/mcp
No browser on the machine? Add a key instead — see Headless clients below.
Add it from Settings → Tools & MCP → New MCP Server, which opens the file below.
{
"mcpServers": {
"pdfmodule": {
"url": "https://pdfmodule.com/mcp"
}
}
}
Project-scoped instead of global? Use .cursor/mcp.json in the repo.
VS Code needs an explicit transport, and its root key is servers — not mcpServers like the others.
{
"servers": {
"pdfmodule": {
"type": "http",
"url": "https://pdfmodule.com/mcp"
}
}
}
Anything without a browser can send a live API key instead of signing in. Here a key and an OAuth token are the same kind of credential, so both behave identically and both draw on the same monthly quota.
claude mcp add --transport http pdfmodule https://pdfmodule.com/mcp \
--header "Authorization: Bearer pm_live_..." Create a key on the API Keys page. API Keys · Protocol notes
Ask the model, in its own words:
Which PDFModule tools do you have? Call whoami. You should get a plan, an email and a tool count. If the model says it has no such tools, the connector is not attached to that conversation yet — start a new chat.
PDFModule works on files; MCP arguments are JSON text. So every file is a handle
— pm_file_… — and tools chain on handles rather than on links:
drop-file → check-pdf → fix-pdf → check-pdf → plan-sheet → impose-sheet → ship-file
Get a handle with drop-file — a URL we fetch behind an SSRF guard,
or a small base64 payload. When the file is on someone's own computer, or too
large to inline, use request-upload. It answers with two doors: a
direct PUT for a client that can read the file itself, and an upload
page for everyone else — the assistant hands over the link, the person signs in
and drops the file, and the same conversation carries on. Handles live 7 days;
ship-file mints a link that lasts up to a week for a human.
| Group | Tools |
|---|---|
| Files & proofing | drop-file, request-upload, get-file, ship-file, proof-page |
| Check & fix | check-pdf, fix-pdf, autofix-pdf, and your house profiles |
| Impose | plan-sheet, visualise-sheet, impose-sheet, gang-sheet, and the stock catalogues |
| Design | Creator, large format up to 5,080 mm, and visit cards |
| Generate | Templates, HTML and Markdown to PDF, and rendered documents |
| Editor | Canvas products, designs, renders, and live editor links for a person |
| Flipbook | Publish, hotspots, analytics and leads |
| Presets | Save a house recipe and apply it — check, fix, check again, impose |
| Proofs | Send a file for customer approval and read the decisions |
| Plan | Reaches |
|---|---|
| free | Generate, templates, documents, editor, flipbook, presets, proofs and proof-page |
| production / scale | The above, plus Creator, large format and visit cards |
| enterprise | Everything, including preflight, fixes and imposition |
Every tool is listed on every plan. Nothing is hidden from you: calling a tool your plan does not reach returns an explanation of what it would take, rather than pretending the capability does not exist.
Every tool is listed on every plan. Calling one your plan does not reach returns a readable explanation rather than a mysterious failure, so the model can tell you what it would take.
| JSON-RPC requests | 120 per minute, 3,000 per hour, per connection |
|---|---|
| Tool calls | 30 per minute per connection |
| Failed authentications | 20 per minute per IP |
GET https://pdfmodule.com/.well-known/oauth-protected-resource/mcp
GET https://pdfmodule.com/.well-known/oauth-authorization-server
POST https://pdfmodule.com/oauth/register
GET https://pdfmodule.com/oauth/authorize
POST https://pdfmodule.com/oauth/token
POST https://pdfmodule.com/oauth/revoke
401 with no WWW-Authenticate |
A proxy is stripping the Authorization header before it reaches
the application. Without that header the client cannot discover the
authorization server, so the connector can never be added. |
|---|---|
403 on /.well-known/… |
A web-server rule denying dotfiles is matching the discovery documents. They must be served. |
invalid_target |
The client sent a resource that is not
https://pdfmodule.com/mcp. |
invalid_grant on token exchange |
The authorization code was already used or expired (10 minutes), or the PKCE verifier does not match the challenge. |