omniseek_read
Read text from any URL or document file, auto-routing to the right extractor. Returns structured content with outline and media info.
Instructions
Read text from any URL OR document FILE — OmniSeek's single "read this deep" verb. AUTO-ROUTES.
Fully-qualified MCP name: mcp__omniseek__omniseek_read (server name is omniseek; there is no omniseek-eye server).
ROUTING: if target is a local filesystem path OR ends with a document extension
(.pdf / .pptx / .docx / .xlsx / .txt / .md / .csv, case-insensitive, a ?query is tolerated) it
routes to the DOCUMENT reader (below); otherwise it routes to the URL reader. A LOCAL path
ending in .html / .htm also routes to the document reader, which returns the page's extracted
text; an http(s) .html URL stays on the URL branch, where the adapters live. start_char /
max_chars window the body on BOTH branches (see below); export_media / ocr apply only
to the document branch (a URL read has no image-extraction path) and are IGNORED on the URL branch.
URL BRANCH: fetch + normalize ONE URL. Tries each registered adapter until one claims it — a
specific article link (a Reddit post, an arXiv paper, a Bluesky post) as a normalized document.
arXiv is two-tier by design: an /abs/<id> URL returns abstract-level metadata (title / authors
/ abstract, a fast lookup), while an /pdf/<id> URL routes to the PDF extractor and returns the
WHOLE body (e.g. 2203.02155v1 → 68 pages of full text). Pass the URL whose depth you want.
vs the open web: reads ONE specific URL you already have; to FIND open-web pages use WebSearch
first, then omniseek_read to normalize the page (a common pairing).
The normalized body is WINDOWED by start_char / max_chars (default 24000), exactly like the
document branch: a big page (a SEC 10-K/20-F is ~2 MB → ~200k chars, a long article) would otherwise
return one blob that overflows the tool channel and is unreadable. When truncated is true, re-call
with start_char bumped by returned_chars to page through the rest. A small page (< max_chars)
returns whole, truncated=false — unchanged from before.
URL branch returns: {"url", "matched": bool, "document": Document as dict | None,
"total_chars", "returned_chars", "start_char", "truncated"} (the last four only when matched). On
matched:false a reason is added: walled (anti-bot challenge -> retry the source via CDP, e.g.
omniseek_search(sources=[...], raw=True, full=True)) vs empty vs blocked, so you can tell "gated, drill it
another way" from "genuinely nothing there".
DOCUMENT BRANCH (pptx / docx / xlsx / pdf / txt / md / csv): read the FILE into readable, structured text — the document counterpart of omniseek_transcribe (speech). Free, keyless, cached. WHERE THE FILE LIVES:
the operator's machine: scp it to OmniSeek host inbox first — scp "" :omniseek-inbox/ then call with "omniseek-inbox/".
Anywhere on the web: just pass the URL (conference slide decks, a shared docx, a PDF). WHAT COMES BACK:
outline= per slide/sheet/page {label, chars, media} — the MAP of the whole document, always complete and tiny;text= the readable content ("## Slide 3" / "## Sheet: budget" / "## Page 5" headers), windowed by start_char/max_chars for big docs (truncated=true + total_chars tell you to re-call with start_char to continue);media/media_total= the image inventory per section. THE IMAGE HALF (be honest about it): a figure deck or scanned doc carries its meaning in IMAGES — text extraction alone is NOT the document. Two ways to read it: omniseek_view delivers the figures to your OWN vision in-band (judging the figure is yours); ocr=True here runs OCR over every embedded image and folds the recognized text-in-pixels (scanned page body, chart labels, palette HEX/RGB codes) into the body under a '图中文字 (OCR)' section — mechanical text transcription, NOT figure interpretation, and labeled as possibly imperfect. Use ocr for text-bearing images (scans, labels); use omniseek_view to SEE the figure. Document branch returns: {source, format, title, outline, text, total_chars, returned_chars, start_char, truncated, media_total, media, media_dir, ocr_images?, cached} — or {source, error, inbox_files?}.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| ocr | No | ||
| target | Yes | ||
| max_chars | No | ||
| start_char | No | ||
| export_media | No |