MCP server for PDFPipe. Generate PDF documents (invoices, reports, certificates) from HTML or a URL in one tool call.
Single tool with comprehensive schema and detailed descriptions. Tool naming is clear (verb_noun pattern). Parameter descriptions are thorough with constraints, ranges, and format guidance. Output schema is documented in description. Error handling is present but could be more explicit about recovery paths. No security issues detected (API key via env var). Main gaps: no tool annotations (readOnlyHint/destructiveHint), output structure not formally documented in schema, and error categorization could guide LLM recovery better.
Generate a PDF document from HTML or a public URL using the PDFPipe API, and save it to disk. 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 browser, so the calling agent does not need a browser. Pass store: true to persist the PDF and receive a document_id for later retrieval.
Output schema not formally documented. Tool description mentions document_id, document_url, document_expires but no structured output schema is visible in code. LLMs cannot plan downstream operations without knowing return field types.
No tool annotations (destructiveHint, idempotentHint). The 'store' parameter persists data; 'password' parameter is sensitive. Tool should declare these via annotations for agent safety.
Error handling lacks recovery guidance. Code catches AxiosError but responses do not tell LLM what to do next (retry? ask user? check API key?). Errors should categorize as retryable vs user-fixable.
Mutually exclusive parameters (html vs url) documented in descriptions but not enforced at schema level. Zod validation catches this at runtime, but LLM may still pass both, wasting a call.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 66 | 2025-06-18+ | v2 |
Parameter 'filename' only used when store=true, but this dependency is not enforced or validated. LLM may pass filename without store=true, causing silent no-op.