Runs locally · Open source · MCP ready
Not a converter — a query interface for your documents
PDF, Word, Excel, PowerPoint, HTML and images go in. Markdown and JSON come out, carrying heading levels, table structure and the page every line came from. Your agent asks for the outline first, then pulls only the section it needs.
only this section enters the context — or search across documents
Local only
Not one network request in the whole pipeline
The parsing engine runs on your own machine — pull the network cable and it keeps working. Contracts, medical records, financial statements, unpublished drafts: none of it should be leaving your machine in the first place.
UPLOADED 0 bytes ENGINE local LICENSE Apache-2.0
Structure & provenance
It reads structure, not just text
Heading levels, table dimensions, the page a paragraph came from — all of it lands in the output. Turn on the quality check and it marks its own results back onto the original, so you can see exactly where it got things wrong.
These three colours aren't a designer's pick. They're the colours the quality check already uses when it annotates a PDF.
In / out
Six formats in, five out
Mix them in one folder and convert the lot; scanned pages are detected and routed to OCR. Three derived products on top: RAG chunks (with page and heading path), table CSV, and a quality-check report.
Input
Output
To get text out of images and scans, install the OCR service once — one command, a few GB of dependencies, still entirely local. Skip it and everything else still works; scans just come out without text.
For agents
Let the agent go look it up
A built-in MCP server: one line to register, eight tools. Documents stay on your machine; the agent takes only what it needs.
# register (Claude Code) $ claude mcp add aimorsel -- morsel mcp # what the agent then does on its own get_outline("annual-report.pdf") get_section("annual-report.pdf", "Financial summary") search_documents("gross margin")
| Tool | What it does |
|---|---|
| get_outline | Returns the heading tree with page ranges and token estimates — the first move on a long document |
| get_section | Pulls one section by heading, matched loosely |
| search_documents | Searches across converted documents; hits carry page number and heading path |
| read_pdf_markdown | Returns the whole body for short documents |
| extract_tables | Returns every table as CSV text |
| get_chunks | RAG chunks as JSONL, each with page range and heading path |
| qa_check | Per-page counts, flagging blank, scanned-looking and thin pages |
| convert_pdf | Converts and lists the output files; unchanged files hit the cache |
Batch
A thousand documents, unattended
Power cut, a late addition, picking it up the next morning — it carries on where it left off.
- Resumable
- Converts only what's new or changed; a different output format re-runs everything
- Parallel workers
- Noticeably faster past a few dozen files; one bad file doesn't stop the batch
- Watched folder
- Drop a file in and it converts; still-copying files are left alone until they settle
- Run report
- One CSV per batch: status, pages, duration, reason for failure. Opens in Excel
- A floor under failure
- Files the engine can't parse fall back to plain text extraction rather than an empty folder
Benchmark
All 731 files converted, fidelity on par with the specialist engines
731 public documents across 8 formats, run side by side with four open-source tools: docling, pymupdf4llm, markitdown and pdfplumber. The scoring is public and identical for every engine: ground truth comes straight from the source files (LaTeX sources, HTML originals, the known structure of generated files), with no human scoring.
AImorseldoclingpymupdf4llmmarkitdownpdfplumber
Coverage Files converted out of 731
Text fidelity Pairwise, on documents both engines succeeded on · other vs AImorsel
Median time Seconds per file · shorter is better
- Coverage counts unsupported formats as failures: drop a mixed folder in, how many come out. docling takes about 11 s per file and ran a 300-file stratified subset only.
- Fidelity on par with docling and pymupdf4llm, an order of magnitude faster, and lighter: AImorsel peaks at 620 MB, docling at 2.0 GB.
- markitdown and pdfplumber emit 10 Arabic documents in visual order — no characters lost, but search and tokenization break; AImorsel and docling don't have this problem.
Two things need saying. On the small 77-file intersection where all five engines succeed, docling and pymupdf4llm score higher than AImorsel on text similarity (0.92 vs 0.82); that subset skews to standard single-column PDFs, and AImorsel still leads on structure there. The weakest link is scans and images: digit fidelity 0.716 (0.891 with a text layer) — numbers from scans need a human second check.
Full result tables and methodology →
Corpus, scripts, ground-truth generators and metric code are in bench/; a re-run reproduces the numbers within 1%.
Download
Unzip. That's the whole install.
A trimmed Java runtime ships inside, so there's no Java and no Python to install.
One package holds the command line, the desktop app, the web service and the MCP server, sharing a single set
of dependencies. Developers can pip install aimorsel or install from source instead — see the
download page.
The open-source core stays free, complete and local. Always. Formula → LaTeX and handwriting recognition are being built as an optional local model pack — also offline.