Oort

Click the word to reassemble

Search infrastructure for agents

Ranked page content instead of links — with character offsets, so every quote can be checked against its source.

Scroll
Real offsets. Checkable quotes.
/v1/searchone call
1.000containment
15msp50 warm
2.06facts / 1k tok
$0per query
3MCP tools

Search meets provenance

Most search APIs hand a model ten links and hope. Oort returns ranked page content inside a token budget — and every passage carries character offsets, so a quote can be traced back to the exact words it came from.

ranked contentcitable offsetsinjection fenced self hostedmcp readydeterministic
Model Context Protocol

One command to connect

The MCP server imports nothing outside the standard library. Pick a client, paste a key if you want it personalised, copy.

01

oort_search

A question in, ranked passages out — each with offsets, heading breadcrumbs and a token count.

02

oort_extract

URLs to clean markdown. HTML, PDF, JSON and RSS, plus screenshots and scripted browser actions.

03

oort_map

Enumerate a site's URLs without fetching a page body. Sitemap first, local index as fallback.

Live

Query this instance

This form calls the same /v1/search the docs describe, on the server serving this page. Same origin, no proxy, no fixtures.

oort · search
results · tokens · ms
The pipeline

Query in, passages out

  1. Plan

    Classify the question without an LLM. Intent decides how fresh an answer has to be — a realtime query will not be served from a week-old page.

  2. Ask our own index

    If the local index already covers every term of the query inside one document, the external providers are skipped entirely.

  3. Fetch in tiers

    Plain HTTP first, about 85% of pages. Escalate to TLS impersonation, then a real browser — each tier rate-limited and deadline-gated.

  4. Extract and chunk

    Restricted markdown with heading breadcrumbs and byte offsets. Code fences and tables stay whole — half a code block is not an answer.

  5. Rank and pack

    BM25 into a rerank cascade, then maximal marginal relevance, packed to the token budget you asked for.

no LLM
on the
critical path
intent in ~0 ms
answered
without
the network
l0_preflight · 24 ms
85%
never reach
a browser
tier 1 → 2 → 3
offsets
survive every
transformation
char_start · char_end
1,182
tokens
returned
2.06 facts / 1k
Provenance

Every quote has an address

A result is not just text — it is a span. The offsets index into the extracted markdown of that exact document, so you can re-read the passage yourself and confirm the model quoted what it claims to have quoted.

…configure a liveness probe. The kubelet uses liveness probes to know when to restart a container. For example, liveness probes could catch a deadlock…
char_start 595 heading_path Configure Probes char_end 2491
Why it is different

Own the pipeline, own the answer

Provenance you can check

Every passage carries char_start and char_end into the extracted markdown — so a quote is verifiable, not a claim.

Injection fencing

Content arrives inside nonce-bearing untrusted delimiters. A page saying "ignore your instructions" is labelled as data.

An index that is yours

Crawl and extract feed one searchable store. A URL pulled today answers a query tomorrow with no second fetch.

Deadline contract

Slow requests return partial results, never a timeout error — and degraded_reasons says what was given up.

Reproducible

/v1/replay reconstructs a past request. Deterministic extraction is what makes that reproduce rather than approximate.

Honest about limits

Benchmarks cover four crawled documentation domains. It does not claim open-web parity, and says so.

Point it at your docs

Crawl the corpus you care about, and repeat questions stop costing an API call.

Start in five minutes How it works