Local-first MCP server and CLI for turning PDFs into source-linked HTML readers with notes, highlights, and static publishing.
PDF Card MCP has three well-named tools with complete input schemas and generally clear descriptions. Tool names follow verb_noun convention (convert_*, validate_*, publish_*) which is excellent. However, descriptions vary in quality: convert_pdf_to_card_html has a verbose, complex description (~420 chars) that buries key details; validate_reader_annotations and publish_reader_bundle have minimal descriptions (<80 chars each). All three tools have comprehensive input schemas with types, enums, and descriptions for most parameters. Output schema documentation is entirely missing, no tool documents what fields the response contains. Error handling guidance is absent; tools provide no recovery hints or categorization. Security considerations are present (file paths validated internally) but not explicitly documented. The server implements optional LLM sampling for style and post-processing but does not expose sampling as a formal MCP Sampling feature.
Convert a local PDF into a portable, source-linked HTML reader. The generated reader is static HTML with embedded assets. It keeps source text intact, includes source-page previews for verification, and crops detected tables, figures, and display formulas as images. Optional MCP sampling is limited to validated style-token choices or boundary-only card polish; raw CSS and source-text rewrites are rejected.
Publish a static reader bundle with selected notes and highlights.
Validate a notes/highlights sidecar against a generated reader HTML file.
Output schemas not documented. No tool documents return field structure or types. LLMs cannot plan downstream calls or extract required data.
validate_reader_annotations and publish_reader_bundle have minimal descriptions (<80 chars). validate_reader_annotations: 'Validate a notes/highlights sidecar against a generated reader HTML file.', lacks WHEN and WHY context. publish_reader_bundle: 'Publish a static reader bundle with selected notes and highlights.', omits use case and return value guidance.
convert_pdf_to_card_html description is 420+ characters and buries key details in prose. The caveat about 'Optional MCP sampling is limited to validated style-token choices or boundary-only card polish; raw CSS and source-text rewrites are rejected' appears in the middle of the description and is critical for safety. Structure as: WHAT (converts PDF to HTML), WHEN (use this to create portable readers), RETURN (manifest with reader path and metadata), then CONSTRAINTS.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 64 | 2026-07-28+ | v2 |
No error handling or recovery guidance. Tools provide no hints on what to do if PDF is corrupted, path is invalid, or validation fails. Descriptions lack 'try this first' or 'this is retryable' context.
convert_pdf_to_card_html accepts 'style_engine' and 'postprocess_engine' with enum values including 'sampling', which triggers LLM interaction via MCP context. However, this is internal implementation detail, not a formal MCP Sampling pattern. If sampling is a feature, it should be negotiated via capabilities and use the Sampling protocol; if not, internal LLM calls should not be exposed as 'sampling' enum options.