Schema-driven document extraction with local OCR + LLM. Document in, Structured JSON out.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
π‘ Paste into ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows)
Document in, Structured JSON out. Locally. With your schema.
docpick is a lightweight, schema-driven document extraction pipeline that combines local OCR engines with local LLMs to extract structured JSON from any document β invoices, receipts, bills of lading, tax forms, and more.
Requirements: Python 3.11+ / LLM endpoint (vLLM, Ollama, or OpenAI-compatible)
| Schema | Document Type | Key Validations |
|---|---|---|
invoice | Commercial invoices | Line item sums, tax ID checkdigit, date order |
receipt | Retail/restaurant receipts | Total = subtotal + tax + tip |
bill_of_lading | Ocean/air B/L | Container weight sums, ISO 6346, HS code format |
purchase_order | Purchase orders | PO total = line items, delivery date order |
kr_tax_invoice | Korean e-tax invoice (μΈκΈκ³μ°μ) | Business number checkdigit (x2), supply/tax/total sums |
bank_statement | Bank statements | IBAN mod97, period date order |
id_document | Passport/ID (ICAO 9303) | MRZ, ISO 3166 country codes, date ranges |
certificate_of_origin | Certificate of Origin | ISO 3166 alpha-2 country codes |
Define your own schema with Pydantic:
Or use a JSON Schema file:
| Algorithm | Use Case |
|---|---|
kr_business_number | Korean business registration number (10 digits) |
luhn | Credit card numbers |
iso_6346 | Shipping container numbers |
iban_mod97 | International bank account numbers |
awb_mod7 | Air waybill numbers |
mrz | Machine Readable Zone (passport/ID) |
| Rule | Description |
|---|---|
SumEqualsRule | Sum of fields equals target (with tolerance) |
DateBeforeRule | Date A must precede Date B |
RequiredFieldRule | Field must be non-null and non-empty |
FieldEqualsRule | Two fields must be equal |
RangeRule | Numeric field within min/max bounds |
RegexRule | Field matches regex pattern |
Validate consistency across related documents (e.g., Invoice + B/L + Packing List):
| Engine | Type | GPU | Languages | Best For |
|---|---|---|---|---|
| PaddleOCR | Traditional OCR | Optional | 111 | General documents (default) |
| EasyOCR | Traditional OCR | Optional | 80+ | Korean text |
| GOT-OCR2.0 | Vision-Language | Required | Multi | Complex layouts |
| VLM | Vision-Language | Required | Multi | Direct image β JSON |
The default auto engine uses confidence-based fallback:
If Tier 1 average confidence falls below threshold (default 0.7), automatically escalates to Tier 2.
| Provider | Endpoint | Default Model |
|---|---|---|
| vLLM | http://localhost:8000/v1 | Qwen/Qwen3.5-32B-AWQ |
| Ollama | http://localhost:11434 | qwen3.5:7b |
Configure via CLI or YAML:
The pipeline is designed to be resilient:
result.errorsProcess entire directories with parallel workers:
Apache 2.0 β all dependencies are Apache 2.0 or MIT licensed.
Part of the QuartzUnit ecosystem β composable Python libraries for data collection, extraction, search, and AI agent safety.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/docpick)<a href="https://allmcps.com/mcp/docpick"><img src="https://allmcps.com/api/badge/docpick?style=directory" alt="Docpick on AllMCPs" /></a>