pdfpipe-mcp-server 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,76 @@
1
+ # PDFPipe MCP Server
2
+
3
+ Generate PDF documents (invoices, reports, certificates) from HTML or a URL in
4
+ one tool call, from any MCP-compatible AI agent: Claude Desktop, Claude Code,
5
+ Cursor, Windsurf, and others.
6
+
7
+ It calls the [PDFPipe](https://pdfpipe.xyz) API, so rendering runs server-side in
8
+ a sandboxed Chromium. Your agent does not need a browser.
9
+
10
+ ## Tool
11
+
12
+ ### `pdfpipe_generate_pdf`
13
+
14
+ Render HTML or a public URL to a PDF and save it to disk.
15
+
16
+ | Argument | Type | Required | Default |
17
+ | --- | --- | --- | --- |
18
+ | `html` | string | one of html/url | — |
19
+ | `url` | string (http/https) | one of html/url | — |
20
+ | `output_path` | string | yes | — |
21
+ | `format` | `A4` `A3` `A5` `Letter` `Legal` `Tabloid` | no | `A4` |
22
+ | `landscape` | boolean | no | `false` |
23
+ | `margin` | CSS length (`1cm`, `0`, `0.5in`) | no | `1cm` |
24
+
25
+ Returns JSON: `{ output_path, size_bytes, plan, usage, limit }`.
26
+
27
+ ## Setup
28
+
29
+ You need a PDFPipe API key. Get one at https://pdfpipe.xyz.
30
+
31
+ ### Claude Desktop / Claude Code
32
+
33
+ Add to your MCP config (`claude_desktop_config.json`, or `.mcp.json` for Claude Code):
34
+
35
+ ```json
36
+ {
37
+ "mcpServers": {
38
+ "pdfpipe": {
39
+ "command": "npx",
40
+ "args": ["-y", "pdfpipe-mcp-server"],
41
+ "env": {
42
+ "PDFPIPE_API_KEY": "pp_live_your_key_here"
43
+ }
44
+ }
45
+ }
46
+ }
47
+ ```
48
+
49
+ ### Cursor / Windsurf
50
+
51
+ Same block, in the editor's MCP settings file.
52
+
53
+ ### Environment variables
54
+
55
+ | Variable | Required | Default |
56
+ | --- | --- | --- |
57
+ | `PDFPIPE_API_KEY` | yes | — |
58
+ | `PDFPIPE_BASE_URL` | no | `https://api.pdfpipe.xyz` |
59
+
60
+ ## Example prompts
61
+
62
+ - "Generate an invoice PDF for order #4012 and save it to ./invoices/4012.pdf"
63
+ - "Save https://example.com/report as a landscape A4 PDF at ./report.pdf"
64
+
65
+ ## Local development
66
+
67
+ ```bash
68
+ npm install
69
+ npm run build
70
+ # point at a local PDFPipe API and smoke-test:
71
+ node test-client.mjs <api_key> http://localhost:8077
72
+ ```
73
+
74
+ ## License
75
+
76
+ MIT
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * MCP server for PDFPipe (https://pdfpipe.xyz).
4
+ *
5
+ * Exposes a single high-value tool, `pdfpipe_generate_pdf`, that turns HTML or
6
+ * a public URL into a PDF document via the PDFPipe REST API and writes it to a
7
+ * path the agent chooses. Built so an AI agent can produce an invoice, report,
8
+ * or certificate in one tool call.
9
+ *
10
+ * Auth: set PDFPIPE_API_KEY. Override the host with PDFPIPE_BASE_URL.
11
+ */
12
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,226 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * MCP server for PDFPipe (https://pdfpipe.xyz).
4
+ *
5
+ * Exposes a single high-value tool, `pdfpipe_generate_pdf`, that turns HTML or
6
+ * a public URL into a PDF document via the PDFPipe REST API and writes it to a
7
+ * path the agent chooses. Built so an AI agent can produce an invoice, report,
8
+ * or certificate in one tool call.
9
+ *
10
+ * Auth: set PDFPIPE_API_KEY. Override the host with PDFPIPE_BASE_URL.
11
+ */
12
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
13
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
14
+ import { z } from "zod";
15
+ import axios from "axios";
16
+ import { mkdirSync, writeFileSync } from "node:fs";
17
+ import { dirname, isAbsolute, resolve } from "node:path";
18
+ const BASE_URL = (process.env.PDFPIPE_BASE_URL || "https://api.pdfpipe.xyz").replace(/\/$/, "");
19
+ const REQUEST_TIMEOUT_MS = 60_000;
20
+ const PAGE_FORMATS = ["A4", "A3", "A5", "Letter", "Legal", "Tabloid"];
21
+ const GeneratePdfInput = z
22
+ .object({
23
+ html: z
24
+ .string()
25
+ .min(1)
26
+ .optional()
27
+ .describe("Raw HTML to render into a PDF. Provide this OR url, not both."),
28
+ url: z
29
+ .string()
30
+ .url()
31
+ .optional()
32
+ .describe("Public http(s) URL to render into a PDF. Provide this OR html, not both."),
33
+ output_path: z
34
+ .string()
35
+ .min(1)
36
+ .describe("Filesystem path to write the resulting PDF to, e.g. './invoice.pdf'. " +
37
+ "Parent directories are created if missing."),
38
+ format: z
39
+ .enum(PAGE_FORMATS)
40
+ .default("A4")
41
+ .describe("Page size. Default A4."),
42
+ landscape: z
43
+ .boolean()
44
+ .default(false)
45
+ .describe("Render in landscape orientation. Default false."),
46
+ margin: z
47
+ .string()
48
+ .default("1cm")
49
+ .describe("Uniform page margin as a CSS length, e.g. '1cm', '0', '0.5in'. Default '1cm'."),
50
+ })
51
+ .strict();
52
+ const GeneratePdfOutput = z.object({
53
+ output_path: z.string(),
54
+ size_bytes: z.number(),
55
+ plan: z.string().optional(),
56
+ usage: z.number().optional(),
57
+ limit: z.number().optional(),
58
+ });
59
+ function apiKey() {
60
+ const key = process.env.PDFPIPE_API_KEY;
61
+ if (!key) {
62
+ throw new Error("PDFPIPE_API_KEY is not set. Get a key at https://pdfpipe.xyz and set it " +
63
+ "in the MCP server environment.");
64
+ }
65
+ return key;
66
+ }
67
+ function describeError(error) {
68
+ if (axios.isAxiosError(error)) {
69
+ const e = error;
70
+ if (e.response) {
71
+ // The API returns JSON {detail: "..."} for errors.
72
+ let detail = "";
73
+ const data = e.response.data;
74
+ if (data && typeof data === "object" && "detail" in data) {
75
+ detail = String(data.detail);
76
+ }
77
+ else if (Buffer.isBuffer(data)) {
78
+ try {
79
+ detail = String(JSON.parse(data.toString("utf8")).detail ?? "");
80
+ }
81
+ catch {
82
+ /* binary or non-JSON body */
83
+ }
84
+ }
85
+ switch (e.response.status) {
86
+ case 400:
87
+ return `Error: Bad request. ${detail || "Provide exactly one of 'html' or 'url'."}`;
88
+ case 401:
89
+ return "Error: Invalid or missing API key. Check PDFPIPE_API_KEY.";
90
+ case 402:
91
+ return `Error: Monthly document limit reached. ${detail || "Upgrade your plan at https://pdfpipe.xyz."}`;
92
+ case 413:
93
+ return `Error: Payload too large. ${detail || "Reduce the HTML size."}`;
94
+ case 422:
95
+ return `Error: Could not render the document. ${detail || "Check the HTML/URL is valid and reachable."}`;
96
+ case 429:
97
+ return "Error: Rate limit reached. Wait a moment and retry.";
98
+ default:
99
+ return `Error: PDFPipe API returned ${e.response.status}. ${detail}`.trim();
100
+ }
101
+ }
102
+ if (e.code === "ECONNABORTED") {
103
+ return "Error: Request timed out. The document may be too complex, or the API is unreachable.";
104
+ }
105
+ if (e.code === "ECONNREFUSED" || e.code === "ENOTFOUND") {
106
+ return `Error: Could not reach the PDFPipe API at ${BASE_URL}. Check PDFPIPE_BASE_URL and your connection.`;
107
+ }
108
+ }
109
+ return `Error: ${error instanceof Error ? error.message : String(error)}`;
110
+ }
111
+ const server = new McpServer({
112
+ name: "pdfpipe-mcp-server",
113
+ version: "0.1.0",
114
+ });
115
+ server.registerTool("pdfpipe_generate_pdf", {
116
+ title: "Generate a PDF with PDFPipe",
117
+ description: `Generate a PDF document from HTML or a public URL using the PDFPipe API, and save it to disk.
118
+
119
+ Use this to produce invoices, receipts, reports, certificates, statements, or any document, from HTML you compose or a web page you point at. The rendering runs server-side in a sandboxed Chromium, so the calling agent does not need a browser.
120
+
121
+ Args:
122
+ - html (string, optional): Raw HTML to render. Provide html OR url, not both.
123
+ - url (string, optional): Public http(s) URL to render. Provide html OR url, not both.
124
+ - output_path (string, required): Where to save the PDF, e.g. "./invoice.pdf". Parent dirs are created.
125
+ - format ('A4'|'A3'|'A5'|'Letter'|'Legal'|'Tabloid', optional): Page size, default 'A4'.
126
+ - landscape (boolean, optional): Landscape orientation, default false.
127
+ - margin (string, optional): CSS length page margin, e.g. '1cm', '0', default '1cm'.
128
+
129
+ Returns JSON:
130
+ {
131
+ "output_path": string, // absolute path the PDF was written to
132
+ "size_bytes": number, // size of the generated PDF
133
+ "plan": string, // the API key's plan (e.g. "hobby")
134
+ "usage": number, // documents used this month after this call
135
+ "limit": number // monthly document limit for the plan
136
+ }
137
+
138
+ Examples:
139
+ - "Make an invoice PDF": html="<h1>Invoice #4012</h1>...", output_path="./invoice-4012.pdf"
140
+ - "Save this web page as PDF": url="https://example.com/report", output_path="./report.pdf"
141
+
142
+ Errors return a message starting with "Error:" explaining the cause (bad key, limit reached, render failure, unreachable API).`,
143
+ inputSchema: GeneratePdfInput.shape,
144
+ outputSchema: GeneratePdfOutput.shape,
145
+ annotations: {
146
+ readOnlyHint: false,
147
+ destructiveHint: false,
148
+ idempotentHint: false,
149
+ openWorldHint: true,
150
+ },
151
+ }, async (params) => {
152
+ // Exactly one of html / url.
153
+ if (!params.html && !params.url) {
154
+ return {
155
+ isError: true,
156
+ content: [{ type: "text", text: "Error: Provide either 'html' or 'url'." }],
157
+ };
158
+ }
159
+ if (params.html && params.url) {
160
+ return {
161
+ isError: true,
162
+ content: [{ type: "text", text: "Error: Provide 'html' or 'url', not both." }],
163
+ };
164
+ }
165
+ try {
166
+ const response = await axios.post(`${BASE_URL}/v1/pdf`, {
167
+ ...(params.html ? { html: params.html } : { url: params.url }),
168
+ options: {
169
+ format: params.format,
170
+ landscape: params.landscape,
171
+ margin: params.margin,
172
+ },
173
+ }, {
174
+ responseType: "arraybuffer",
175
+ timeout: REQUEST_TIMEOUT_MS,
176
+ headers: {
177
+ Authorization: `Bearer ${apiKey()}`,
178
+ "Content-Type": "application/json",
179
+ Accept: "application/pdf",
180
+ },
181
+ });
182
+ const buffer = Buffer.from(response.data);
183
+ const absPath = isAbsolute(params.output_path)
184
+ ? params.output_path
185
+ : resolve(process.cwd(), params.output_path);
186
+ mkdirSync(dirname(absPath), { recursive: true });
187
+ writeFileSync(absPath, buffer);
188
+ const h = response.headers;
189
+ const num = (v) => {
190
+ const n = Number(v);
191
+ return Number.isFinite(n) ? n : undefined;
192
+ };
193
+ const output = {
194
+ output_path: absPath,
195
+ size_bytes: buffer.length,
196
+ plan: h["x-pdfpipe-plan"] ?? undefined,
197
+ usage: num(h["x-pdfpipe-usage"]),
198
+ limit: num(h["x-pdfpipe-limit"]),
199
+ };
200
+ return {
201
+ content: [{ type: "text", text: JSON.stringify(output, null, 2) }],
202
+ structuredContent: output,
203
+ };
204
+ }
205
+ catch (error) {
206
+ return {
207
+ isError: true,
208
+ content: [{ type: "text", text: describeError(error) }],
209
+ };
210
+ }
211
+ });
212
+ async function main() {
213
+ // Fail fast with a clear message if the key is missing.
214
+ if (!process.env.PDFPIPE_API_KEY) {
215
+ console.error("WARNING: PDFPIPE_API_KEY is not set. Tool calls will fail until it is. " +
216
+ "Get a key at https://pdfpipe.xyz.");
217
+ }
218
+ const transport = new StdioServerTransport();
219
+ await server.connect(transport);
220
+ console.error(`pdfpipe-mcp-server running (stdio), API base ${BASE_URL}`);
221
+ }
222
+ main().catch((error) => {
223
+ console.error("Fatal:", error);
224
+ process.exit(1);
225
+ });
226
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,32 @@
1
+ {
2
+ "name": "pdfpipe-mcp-server",
3
+ "version": "0.1.0",
4
+ "description": "MCP server for PDFPipe. Generate PDF documents (invoices, reports, certificates) from HTML or a URL in one tool call.",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "bin": {
8
+ "pdfpipe-mcp-server": "dist/index.js"
9
+ },
10
+ "files": ["dist"],
11
+ "author": "Johin Johny <johinjohny144@gmail.com>",
12
+ "license": "MIT",
13
+ "keywords": ["mcp", "pdf", "pdf-generation", "html-to-pdf", "pdfpipe", "ai-agents"],
14
+ "scripts": {
15
+ "build": "tsc",
16
+ "start": "node dist/index.js",
17
+ "dev": "tsx watch src/index.ts"
18
+ },
19
+ "engines": {
20
+ "node": ">=18"
21
+ },
22
+ "dependencies": {
23
+ "@modelcontextprotocol/sdk": "^1.6.1",
24
+ "axios": "^1.7.9",
25
+ "zod": "^3.23.8"
26
+ },
27
+ "devDependencies": {
28
+ "@types/node": "^22.10.0",
29
+ "tsx": "^4.19.2",
30
+ "typescript": "^5.7.2"
31
+ }
32
+ }