API and MCP tools

Two transports over one read-only engine: a GET-only JSON API, and twelve MCP tools for an AI assistant. Both return the same shapes, so a client that knows one knows the other.

Every response is complete or it is an error. Nothing is truncated, sampled, or summarized. A query matching more than the cap is refused outright, with the exact count, rather than returning a partial list.

The response shape

Every endpoint that returns text returns the same envelope: the rows, a per-edition provenance map added once (not repeated per row), and the engine build that produced it.

{ "citations": [ { "ref": { "book": "MAT", "chapter": 26, "verse": 28 }, "edition": "TAGNT", "text": "ἄφεσιν", "locator": "Mat.26.28#16=NKO", "lemma": "ἄφεσις", "translit": "aphesin", "dstrong": "G0859", "grammar": "N-ASF", "attestation": "NKO", "manuscripts": "NA28+NA27+Tyn+SBL+WH+Treg+TR+Byz", "confidence": "High" } ], "sources": { "TAGNT": { "file": "STEPBible-Data/…/TAGNT*.txt", "license": "CC BY 4.0", "attribution": "STEPBible.org / Tyndale House Cambridge" } }, "engine": "0.3.0" }
locatorWhere the row lives in its own source file - the receipt for the citation.
confidenceHigh for a direct row; Flagged when the result was reached through cross-edition alignment or a gap. A Flagged row always carries a caveat.
caveatPresent only when something must be said out loud - a renumbering, a recension divergence, or an absence. Never silent.
engineThe build that produced the result, so a citation stays re-derivable.
HTTP API

All endpoints are GET. There is no mutation surface of any kind. A book may be a USFM code or a full English name, in any case (MAT, mat, Matthew).

EndpointParametersReturns
/verse book chapter verse editions Verbatim text for one reference, one citation per requested edition. Also reports prev_ref and next_ref for verse-by-verse reading; either is omitted when there is no neighbour.
/passage book start_chapter start_verse end_chapter end_verse editions The same, for a contiguous range within one book. Verse boundaries preserved, never concatenated.
/concord query corpus by phrase window Every occurrence of a lemma, dStrong, or surface form - or of a phrase, with window words allowed between tokens (0 = adjacent). Results are returned in canonical order: book, then chapter, verse, and word position.
/parse book chapter verse word corpus dStrong and expanded morphology for every word in a verse, or one word if word is given.
/attest book chapter verse word corpus Manuscript attestation as neutral data - the Type code and the editions that carry each word.
/interlinear book chapter verse word corpus Row-aligned original text, transliteration, lemma, gloss, grammar, and manuscript attestation - the complete word row. Also reports prev_ref and next_ref, scoped to the requested corpus, so stepping never lands on a verse the corpus carries no words for. Returns words rather than citations.
/define dstrong One lexicon entry: lemma, transliteration, gloss, and definition where licensing permits.
/books none The canonical 66-book registry with every accepted name variant.
editionsComma-separated verse-text editions: KJV, ASV, WEB, BSB, Brenton.
corpusOne word-tagged corpus: TAGNT (Greek NT), TAHOT (Hebrew OT), Swete (LXX surface), OSS-LXX-lemma (LXX lemma).
byMatch column override: lemma, dstrong, or surface. Omit to auto-detect. surface is never guessed - ask for it explicitly.
word1-based word number within the verse. Omit for every word.
Example
curl "https://orthotomeo.app/concord?query=G0859&corpus=TAGNT"
MCP tools

Twelve tools over the same engine. Connect a client to https://orthotomeo.app/mcp - see the setup steps.

ToolExpectsDoes
resolve_refbook chapter verseReports where one canonical reference lives in every edition, and where it does not exist. Absence is data, not an error.
get_versebook chapter verse editions[]Verbatim text with provenance, one citation per requested edition.
get_passagebook start_chapter start_verse end_chapter end_verse editions[]The same across a contiguous single-book range.
concord_lemmaquery corpus byComplete-or-fail concordance for a lemma or Strong's number. Route lookups here rather than recalling occurrences.
concord_phrasetokens[] corpus windowEvery verse where the ordered lemmas co-occur within window words.
countquery corpusOccurrence tally, total and per book, for the identical query concord_lemma would match. Never capped.
parsebook chapter verse word corpusdStrong plus expanded morphology. LXX corpora carry no morphology and are always flagged.
lemmatizebook chapter verse corpusThe ordered lemma list for a verse. Words with no lemma are omitted, never invented.
attestationbook chapter verse word corpusManuscript attestation as neutral text-critical data.
interlinearbook chapter verse word corpusRow-aligned original, transliteration, gloss, grammar, and manuscript attestation.
lexicon_lookupdstrongOne lexicon entry.
citecitations[]Renders citations as fully-attributed Markdown for pasting into notes.
Limits on the public instance

The hosted instance is public and unauthenticated, so it runs with these bounds. Run it yourself and there are none - see below.

60engine queries per hour, per IP
2,000per day, all callers
2,000occurrences in one concordance result

A query over the result cap is refused with the exact match count - never silently truncated, which would break complete-or-fail. Call count first for a broad query; it is never capped, because it returns numbers rather than citations.

A refusal
{ "error": "that query matches 20705 occurrences, more than this instance returns at once (limit 2000) - narrow it to a more specific lemma, or search a smaller range.", "matched": 20705, "limit": 2000 }
Run it yourself

The engine is open source and builds from one repository. A local build reads the same corpus with no rate limit and no result cap, so a study that genuinely needs every occurrence of a common word belongs there.

Command line

Look up verses, run concordances, parse, and check attestation from a terminal. Every subcommand also takes --json for the same envelope the API returns.

Desktop app

A native launcher that starts the engine locally and opens this same interface in your browser. Nothing leaves your machine.

MCP server

Run the twelve tools locally against your own database instead of the hosted instance.

Go library

Import the engine package directly and embed it in your own program.

You supply the corpus files yourself - each is separately licensed, and the repository documents exactly what is needed and where it goes. Build instructions are on GitHub.

A personal project by Justin Rainsberger Email Substack LinkedIn GitHub
orthotomeo 0.3.0 · MIT License · corpus editions keep their own licenses