A Model Context Protocol (MCP) server that provides tools for reading and extracting text from PDF files. Supports both local files and URLs, with comprehensive error handling and standardized output format.
Two tools present with basic definitions but significant quality gaps. Both tools have descriptions that are adequate (25-30 chars), but parameter descriptions are minimal, output schemas are not formally documented, and error handling is present but not guidance-rich. Tool names are action-verb-based (read_*) which is good, but the descriptions lack the depth needed for LLM selection in complex scenarios. Per-tool average: (48 + 36) / 2 = 42.
Read text content from a local PDF file.
Read text content from a PDF URL.
Parameter descriptions are minimal. 'path' is described as 'Path to the local PDF file' (25 chars) and 'url' as 'URL of the PDF file to read' (27 chars). These lack actionable constraints: expected format, length limits, or validation rules.
Output schemas are not formally documented. The code returns a Dict with 'success', 'data', and 'error' fields, but there is no JSON Schema specification visible in the tool definition. LLMs cannot parse the response structure without explicit schema documentation.
Tool descriptions lack context for LLM selection. 'Read text content from a local PDF file' tells WHAT but not WHEN to use it vs the URL variant, or what prerequisites exist. When vs similar tools? What does it return?
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 40 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 43 | - | v1 |
Error handling returns structured objects but lacks recovery guidance. When a file is not found or fetch fails, the error message is informative ('PDF file not found: {path}') but does not suggest next steps.
No input validation or constraints documented. Parameters accept strings with no length limits, format patterns, or validation hints. The code reads whatever path is provided without sanitizing against path traversal attacks. read_pdf_url accepts any URL without validating it is actually a PDF.
No pagination or result limits. If a PDF contains 10,000+ pages of text, the response could be very large. No mechanism for the LLM to handle oversized responses.