A lightweight MCP server that sends files to TextIn OCR and returns structured text and Markdown.
ocr2md-mcp demonstrates solid tool design with complete schemas, clear descriptions, and proper parameter typing. All 4 tools have explicit input schemas with type definitions and descriptions. Tool names follow verb_noun convention (ocr_file, ocr_url, ocr_batch, ocr_to_markdown). Descriptions are substantive (80-150 chars) and explain purpose and use cases. Parameters include enums (displayPath), constraints (concurrency 1-10), and optional flags. However, output schemas are not formally documented, responses return structuredContent but the shape is inferred from code. Error handling is minimal; no recovery guidance or actionable error messages visible. No tool annotations (readOnlyHint, idempotentHint) despite all tools being read-only. Batch tools lack per-item failure reporting.
OCR multiple local files. Accepts explicit file paths and/or a directory plus glob pattern. Partial failures are preserved.
OCR one local file through TextIn and return structured text plus Markdown.
OCR one or more local files and return a combined Markdown document.
OCR one http(s) URL through TextIn URL mode and return structured text plus Markdown.
Output schemas not formally documented. Tools return structuredContent but shape is inferred from implementation, not declared in tool definition. LLMs cannot plan downstream operations without knowing response structure.
No tool annotations despite all tools being read-only. Missing readOnlyHint and idempotentHint annotations prevent clients from optimizing caching and retry logic.
Batch tools (ocr_batch, ocr_to_markdown) lack per-item error reporting. If 1 of 10 files fails, the response summary does not indicate which file failed or why, forcing the agent to retry all files.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 57 | 2025-06-18+ | v2 |
No error recovery guidance. Tool descriptions do not explain what to do if OCR fails, TextIn API is unavailable, or file is unreadable. Agents receive errors with no actionable next steps.
Parameter 'relativeTo' lacks validation guidance. Description does not specify if path must exist, be absolute, or relative, or what happens if invalid. LLMs may pass arbitrary strings.