Document parsing MCP server with Qwen2.5-VL, Docling, PyMuPDF and Marker
Two tools with complete input schemas and reasonable descriptions, but significant gaps in output documentation and error handling. Both tools accept identical parameters with good type coverage (string, boolean, integer, optional fields). Descriptions are adequate (150-180 chars) but lack actionable guidance on when to use each tool or what to expect in responses. No documented output schemas, no error recovery guidance, and no distinction between the two tools' use cases. Parameter descriptions are present but generic ('Language for OCR (default: "es")' lacks format/constraint details). No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite both being read-only operations.
Parse a document (PDF or image) and return its content as Markdown. Accepts the document either as a file path or as base64-encoded bytes. For images, use an engine that supports them (e.g. any Qwen-VL preset).
Parse a document (PDF or image) and return hierarchical chunks optimized for vector DBs. Uses Qwen-VL via mlx-vlm on Apple Silicon. Falls back to standard parse_document if not available. For images, use an engine that supports them (e.g. any Qwen-VL preset).
No output schema documented. LLMs cannot predict what fields parse_document and parse_document_chunks return, forcing them to guess about downstream field availability. Both tools return dict with 'progress_log' but full response structure is undocumented.
Tool naming lacks clear distinction. Both 'parse_document' and 'parse_document_chunks' start with the same verb and operate on identical inputs. The difference (chunking vs markdown output) is buried in descriptions. LLMs may conflate them or pick wrong variant.
No error handling guidance. Tools accept file_path OR file_bytes_b64 but no description states what happens if both/neither are provided, or if file doesn't exist, or if engine is invalid. No recovery hints for LLM.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 59 | <=2025-11-25 | v2 |
Parameter 'engine' lacks enum constraint in schema. Description lists options as free text ('docling, marker, pymupdf, qwen3_vl_30b, qwen3_vl_4b, qwen3_vl_8b') but schema shows type:string with no enum. LLMs may hallucinate invalid engine names.
No tool annotations. Both tools are read-only (no side effects) but lack readOnlyHint annotation. Agents cannot determine retry safety without explicit hints.