A collection of Python utility scripts for PDF processing and skill evaluation, including PDF form field extraction, validation, conversion, and benchmark aggregation tools.
This server has 11 tools with basic descriptions and input schemas, but significant quality gaps. Most tool names are verb-noun (good), but descriptions are inconsistent, some are detailed (check_bounding_boxes: 180 chars), others minimal (check_fillable_fields: 80 chars). Parameter descriptions exist but are often generic ('Path to...'). No output schemas are documented. Error handling is minimal, tools print to stdout without structured error guidance. No tool annotations (readOnlyHint/destructiveHint) despite clear risk levels. Parameters lack constraints (enums, ranges, format specs). The server is STDIO-only, which is a hard transport limitation.
Aggregates individual run results into benchmark summary statistics with mean, stddev, min, max for each metric and delta calculations.
Validates bounding boxes in a form fields JSON file by checking for intersections between label and entry boxes on the same page, and verifying entry box heights are sufficient for font size.
Checks whether a PDF has fillable form fields and reports the result.
Converts a PDF document to PNG images, one per page, with optional downscaling to a maximum dimension.
Creates a validation image by overlaying bounding boxes from a fields JSON file onto a page image, with entry boxes in red and label boxes in blue.
Extracts form field information from a PDF including field IDs, types, locations, and states, outputting structured JSON.
Extracts form structure from a non-fillable PDF by analyzing text labels, horizontal lines, checkboxes, and row boundaries.
No output schemas documented. Tools return unstructured stdout (print statements) without specifying what fields, types, or structure the LLM should expect. This forces LLMs to parse free-text output, wasting tokens and increasing hallucination risk.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). Tools are marked with Risk levels (READ_ONLY, WRITE) in metadata but not exposed via MCP tool annotations. LLMs cannot determine which tools are safe to retry or have side effects.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 41 | 2026-07-28+ | v2 |
Fills fillable form fields in a PDF with values from a JSON file, with validation of field IDs, pages, and value types.
Fills a non-fillable PDF form by adding text annotations at specified bounding box locations, with support for font customization.
Generates an HTML report from run_loop.py output showing skill description optimization iterations with test results for each query.
Generates and serves a self-contained HTML review page for evaluation results, with embedded output data and feedback auto-save functionality.
Parameter descriptions are generic ('Path to...'). No format specs, constraints, or examples. Parameters like 'max_dim' lack range documentation (is it 1 - 10000? pixels or percentage?). No enums for constrained values.
Error handling is minimal. Tools print success/failure to stdout without structured error responses. No guidance on what to do next (retry, ask user, abort). Example: 'FAILURE: intersection...' is human-readable but not machine-parseable.
STDIO transport only. Server is not remotely accessible and cannot be used by hosted MCP clients. This is a hard architectural limitation.