Nabu
Nabu
A personal, local, license-honest library of the ancient world — that your AI tools can read.
Project site: arvicco.github.io/nabu — the library, tools, and sources presented in full, without the README compression.
Nabu pulls the world's openly licensed digital corpora of antiquity — Homer and the Greek canon, the Latin classics, documentary papyri from Egypt, the Sanskrit epics, cuneiform tablets, the Bible in fifteen parallel witnesses, Beowulf — into one library on your own disk. Everything is plain files plus SQLite: searchable by word or by dictionary lemma, citable to the exact verse or tablet line, honest about every text's license, and rebuildable from scratch at any time. And because it ships a read-only MCP server, the AI assistants you already use can search, quote, and cite the whole library — while structurally unable to change a letter of it.
Named for the Mesopotamian god of scribes, patron of the tablet house and divine custodian of Ashurbanipal's library. It is not a website and not a reader app: it is a pipeline plus a database, operated from the command line, designed to outlive the services it draws from.
As of 2026-11-09 the shelves hold 2,873,127 documents / 130,175,120 passages in 282 language codes — from proto-cuneiform tablets of the late 4th millennium BCE to Meiji-era Japanese. The summer waves built the core: EEBO-TCP Phase I brought the early-modern English print library whole (24.1M passages — the corpus's second language) under the maintainer's written grant, the Old Mandarin desk arrived as a connected series of rhyme books (the Guangyun, Wang Renxu's Qieyun, the 'Phags-pa 蒙古字韻, the 中原音韻 of 1324), and the historical slice of the Open Korean Historical Corpus more than doubled the document count in a day (1,198,779 documents from the Samguk sagi of 1145 through the Ilseongnok court diaries, each record carrying its own license). The autumn arc then opened whole regions: the Southeast Asia desk (the DHARMA epigraphic corpora with the first digital Old Mon text anywhere, the kakawin library, Bagan's Old Burmese — then 1,252 Balinese palm-leaf lontars transcribed manuscript-direct, Jawi-script Malay manuscripts, the Thai Collected Chronicles), the Central Asia corridor (Khotanese, Sogdian, Bactrian, Chagatai, the Secret History of the Mongols), the Slavic shelves end to end (nine Wikisource cones, the 1488 Prague Bible, the Ipatiev chronicle), a first American wing (colonial Zapotec testaments, Guaman Poma's chronicle), and South Asia in force: the DHARMA Tamil-country and Deccan epigraphy, Siddham's Gupta pillars, the printed South Indian Inscriptions volumes, Project Madurai's classical Tamil e-texts at 1.2M lines, the Gurmukhī scriptural canon at line grain — and TAMILEX, whose per-word gold wordsplit layer (262,093 rows) exists nowhere else for Old Tamil. Behind TITUS's members-only gate, personal grants opened the Middle Iranian books and the whole Tocharian corpus — all 4,250 West Tocharian documents of the Berlin, London and Paris collections, plus two leaves Maue's handlist identifies as Tumshuqese. OpenITI's Classical Arabic remains the largest language at 33.3 million passages, ahead of English (28.8M) and Literary Chinese (20.7M). Plus 5,281,593 dictionary entries across 956 dictionary shelves and 25.5 million gold lemma annotations (a further 36.2 million ride an honestly labelled silver tier). (All numbers in this README are read from the live catalog, never estimated.)
Quickstart
git clone https://github.com/arvicco/nabu && cd nabu
bundle install # Ruby 3.3+; deliberately small dependency set
bin/nabu quickstart # the starter shelf: 4 sources, ~690 MB, minutes — then:
bin/nabu align "MARK 2.3" # one verse, seven witnesses
bin/nabu search --lemma λέγω # dictionary-form search: λέγουσι, εἶπας, εἰπεῖν…
bin/nabu define λόγος # the whole LSJ entry, citations resolvedA fresh checkout works with zero configuration. The long form — prerequisites, honest sizes and timings, growing the library, MCP registration — is the site's Quickstart page (kept in-repo as docs/quickstart.md).
Related MCP server: theosis-mcp
Run the demo
No clone, no sync: the public ghcr.io/arvicco/nabu-demo:1.0.0 image
(amd64 + arm64) bakes an open demo slice of the library (Greek New
Testament, Hebrew Bible, Latin Vulgate, World English Bible, LSJ and
Lewis & Short — sources and per-source licenses in
/demo/demo-census.json inside the image) behind the read-only MCP
server. The full library is a local build (Quickstart above). Every
launcher below pins the released demo tag, never :latest.
docker run -i --rm ghcr.io/arvicco/nabu-demo:1.0.0 # MCP over stdio
claude mcp add nabu -- docker run -i --rm ghcr.io/arvicco/nabu-demo:1.0.0 # Claude Code
docker mcp catalog import https://arvicco.github.io/nabu/docker-mcp-catalog.yaml # Docker MCP Toolkit(Current Docker MCP Toolkit CLIs replaced import with
docker mcp catalog create nabu --from-legacy-catalog <the same URL>.)
Editors, one click — both need Docker installed locally, and both
start the same docker run -i --rm ghcr.io/arvicco/nabu-demo:1.0.0:
(GitHub strips custom-scheme links, so the badges go through the editors'
https redirects to vscode:mcp/install?… and
cursor://anysphere.cursor-deeplink/mcp/install?….)
Hosted, one click — the same tagged image as a streamable-HTTP
endpoint at https://<your-service>/mcp, on your own account (the
deployer's plan pays; the free tiers suffice, as the demo runs within
512 MB):
Render reads this repository's
render.yaml, a Blueprint that names the prebuilt image by its release tag (nothing is compiled from the repository), and pulls that image. A free Render instance sleeps after 15 minutes without traffic, and the first request after that waits about a minute while it wakes.Koyeb pulls the tagged image directly. A free Koyeb instance scales to zero after an hour without traffic, and the next request pays a cold start of a few seconds.
The HTTP endpoint carries no authentication of its own: put access
control in front of it unless it is meant to be public. Details, and
the plain bin/nabu mcp --http mode, are on the site's
MCP page.
Show me
Real commands, real output, pasted from live runs on 2026-07-11/12 (trims marked with …).
One verse of Mark across the aligned witnesses — Greek, Latin, Gothic, Old Church Slavonic, Old English, and more — each with its license label (this run predates the Sahidic and Bohairic Coptic witnesses that joined 2026-07-13, making fifteen registered):
$ bin/nabu align "MARK 2.3"
MARK 2.3 — New Testament (parallel witnesses)
13 of 13 witnesses attest this ref
greek-nt — The Greek New Testament [grc] license: nc
urn:nabu:proiel:greek-nt:6563
καὶ ἔρχονται φέροντες πρὸς αὐτὸν παραλυτικὸν αἰρόμενον ὑπὸ τεσσάρων.
latin-nt — Jerome's Vulgate [lat] license: nc
urn:nabu:proiel:latin-nt:10368
et venerunt ferentes ad eum paralyticum qui a quattuor portabatur
gothic-nt — The Gothic Bible [got] license: nc
urn:nabu:proiel:gothic-nt:37435
jah qemun at imma usliþan bairandans, hafanana fram fidworim.
marianus — Codex Marianus [chu] license: nc
urn:nabu:proiel:marianus:36421
Ꙇ придѫ къ немоу носѧште ослабленъ жилами. носимъ четꙑрьми.
wscp — West-Saxon Gospels [ang] license: nc
urn:nabu:proiel:wscp:102359
& hi comon anne laman to him berende, þone feower men bæron.
WEB (English) — Mark [eng] license: open
urn:nabu:eng-web:mrk:2.3
Four people came, carrying a paralytic to him.
… (Armenian, SBLGNT, Clementine Vulgate, and the four CCMH OCS witnesses trimmed)Look up the first word of Western literature — with the dictionary's citations resolved to live passages in your own catalog:
$ bin/nabu define μῆνις
μῆνις — A Greek-English Lexicon (Liddell-Scott-Jones) [attribution] urn:nabu:dict:lsj:n67485
gloss: wrath
μῆνις, Dor. and Aeol. μᾶν-, ἡ, gen.
A. μήνιος Pl. R. 390e , later μήνιδος Ael. Fr. 80 , … —wrath; from Hom.
downwds. freq. of the wrath of the gods, Il. 5.34 , al., A. Ag. 701 (lyr.),
… but also, generally, of the wrath of Achilles, Il. 1.1 , al. …
resolved citations (in this corpus — nabu show <urn>):
Il. 1.1 → urn:cts:greekLit:tlg0012.tlg001.perseus-grc2:1.1
Il. 5.34 → urn:cts:greekLit:tlg0012.tlg001.perseus-grc2:5.34
A. Ag. 701 → urn:cts:greekLit:tlg0085.tlg005.1st1K-grc1:701
…Search by dictionary form, not surface string — suppletion and all:
$ bin/nabu search --lemma λέγω --limit 3
urn:nabu:proiel:chron:108755 [grc] λέγω → ῥηθέντος (lay)
ὅ περ ἦν καὶ αἴτιον τοῦ μὴ ἐλθεῖν τὸν γενήσαντά με εἰς τὸν Μορέαν μετὰ τοῦ αὐθεντοπούλου κὺρ Θωμᾶ εἰ…
urn:nabu:proiel:chron:121080 [grc] λέγω → εἶπον, εἰπὲ (lay)
Πολλῶν οὖν λόγων δαπανηθέντων, τέλος ἐστάλησαν πρὸς τὸν ἄνθρωπον δύο τῶν κελλιωτῶν καὶ συντρόφων μου…
urn:nabu:proiel:chron:121083 [grc] λέγω → εἴπω (lay)
Ἐγὼ δὲ νὰ ἀκούω παρὰ μὲν τῶν, ὅτι καλή ἐστι, παρὰ δὲ τῶν, ὅτι οὐ καλή, διὰ τὶ νὰ μηδὲν εἴπω·
3 hits (exact lemma match; text is pristine)Pull a random tablet off the cuneiform shelf:
$ bin/nabu show --random --source oracc
urn:nabu:oracc:rinap-rinap1:Q003443:1 [akk]
a-di {KUR}sa-u₂-e KUR-e ša ina {KUR}lab-na-na-ma it-tak-ki-pu-u₂-ni
document: urn:nabu:oracc:rinap-rinap1:Q003443 — Tiglath-pileser III 30
source: oracc license: open sequence: 0 revision: 1
provenance:
2026-07-10 18:36:28 +0200 loaded nabu-loader— a royal inscription of Tiglath-pileser III, "as far as Mount Saue, which abuts Lebanon."
Who this is for
Classicists. The Perseus Greek and Latin canons plus First1KGreek — 2,209 Greek and Latin editions with 872 aligned English translations (
show <urn> --parallelpairs Vergil line by line). TLG-style proximity search, lemma-aware:$ bin/nabu search λόγος --near θεός --window 5 --lang grc urn:nabu:ddbdp:p.oxy:8:1151:18 [θεοσ] ην ο [λογοσ]. ← a papyrus amulet… urn:cts:…:tlg0031.tlg004…:1.1 …και [θεοσ] ην ο [λογοσ]. ← …quoting John 1:1Biblical scholars. The New Testament in up to fifteen registered witnesses (
align "MARK 2.3"→ Greek ×2, Latin ×2, Gothic, Armenian, five OCS manuscript editions incl. Assemanianus and both Marianus editions side by side, Old English, English, and — live since 2026-07-13 — Sahidic and Bohairic Coptic), the Old Testament on the Septuagint ↔ Vulgate ↔ English axis with the Greek/Hebrew Psalm numbering mapped honestly (align "PSA 22.1"shows WEB's 23.1 labeled).Slavists & textual critics. The OCS canon complete — Marianus, Zographensis, Assemanianus, Savvina kniga, Suprasliensis (folio-line cited, hyphen-split words searchable whole) — plus Old East Slavic from birchbark to Ruthenian chancery texts, and the ~1000 CE Freising Manuscripts in three aligned transcription layers.
align REF --collateturns the aligned witnesses into an apparatus: a raw-token diff per script family (the four Helsinki-ASCII CCMH codices collated against each other; the Cyrillic Marianus set beside them, honestly not collated because the fold cannot bridge the two transcription systems).Comparativists. The reconstruction shelf walks attested words to their proto-forms and cognates, with corpus attestation counts:
$ bin/nabu etym богъ --lang chu богъ [chu] → *bogъ [sla-pro] — gloss: god ← *bʰeh₂g- [ine-pro] — gloss: to divide, distribute, allot reflexes: [grc] ἔφᾰγον, [sa] भक्ष (bhakṣá), …Pure-ASCII input works (
etym bhewgh);--longexpands every reflex. Andcognatescrosses that crosswalk with the alignment hub — verses where the witnesses use reflexes of the same root, found blind:$ bin/nabu cognates "LUKE 14.34" --langs got,chu LUKE 14.34 *sḗh₂l [ine-pro · attribution] chu соль — attested as солъ got saltThe whole Gothic × OCS NT yields ~300 such verses across 30 roots in under a second (hlaifs ~ хлѣбъ, malan ~ млѣти, menoþs ~ мѣсѧць), each hit labeled with its meet shelf — a gem-pro meet for a Slavic word is flagged reading matter: likely a borrowing, not common descent.
Indologists. 780 GRETIL editions, 703k passages: Rāmāyaṇa, purāṇas, kāvya, dharmaśāstra, the Ṛgveda with Vedic accents preserved; commentary layers separately citable (kārikā vs. vṛtti).
Papyrologists. 61k DDbDP documents, and fragment search that reads like an edition: type the damaged line brackets and all, and
--fuzzymatches it INSIDE words (trigram index over papyri + ORACC + EDH, sub-10 ms):$ bin/nabu search --fuzzy ']ανδρα μοι εν[' urn:nabu:ddbdp:bgu:6:1470:ctr:6 [grc] μαρτυροι. [ανδρα μοι εν]νεπε μουσα πολυτρο 1 hit (fuzzy substring; highlights are diacritic-folded) fuzzy index covers: oracc, papyri-ddbdp— BGU 6.1470, a Hellenistic writing exercise breaking off mid-word through the Odyssey's opening line (…Μοῦσα πολύτρο[πον). (Live output of 2026-07-13; the EDH inscriptions joined the index's scope later that day — it now covers 1.71M passages.)
Epigraphists. 81,881 Latin inscriptions from the Epigraphic Database Heidelberg (CC BY-SA; a preservation snapshot of the archived upstream) — 81,416 of them dated (2026-07-14 census), with the library's first genre facets:
search manibus --type epitaph --province Britanniacomposes the genre facets with the date and place filters, and the stones are in the--fuzzyindex. Since 2026-07-17 the epigraphic shelves speak Celtic too: 428 Gaulish inscriptions (RIIG, with per-editor readings and French translations) and ~500 Irish ogham stones in real Ogham codepoints with aligned transliteration layers.Celticists. The CorPH corpus (ERC ChronHib) brings 7th–10th-century Early Irish with gold lemmatization — the Annals of Ulster, Vita Columbae, Blathmac, and the Milan/St Gall/Würzburg gloss corpora — joined by two Old Irish UD treebanks, the Gaulish and ogham epigraphy above, and Old/Middle Irish and Middle Welsh dictionary extracts on the reference shelf.
Assyriologists. 21,692 ORACC documents (CC0) across 33 projects — 12,781 tablets and inscriptions, the complete State Archives of Assyria among them, plus 8,911 aligned English translations — with gold lemmatization in
search --lemmaand the running English translations aligned per line:$ bin/nabu show urn:nabu:oracc:saao-saa01:P224395:o.1-o.3 --parallel :o.1 akk a-na LUGAL EN-ia :o.2 akk ARAD-ka {1}10-ha-ti … eng To the king, my lord: Your servant Adda-hati. …Medievalists. The complete Anglo-Saxon Poetic Records (Beowulf cited by its real line numbers:
show urn:nabu:aspr:A4.1:1→ Hwæt! We Gardena in geardagum), the ISWOC treebank with West-Saxon Mark as an alignment-hub witness, and Bosworth-Toller on the dictionary shelf —define aethele --lang angfinds æþele through the æ/þ/ð folding.Germanicists. All three branches on one desk since 2026-07-22: Wulfila's Gothic (gold-lemmatized in PROIEL), the Old English shelves, Menotec's seven Old Norwegian treebanks with the Poetic Edda of Codex Regius, the Heliand parsed to the token, ReM's 355k gold-annotated Middle High German manuscript lines (long ſ folded, so
swertfindsſwert), and the runestones of Rundata — each inscription with its transliteration, Old-West-Norse and runic-Swedish normalisations, and English/Swedish translations as--parallellanes.Linguists & digital humanists. 21.9M gold lemma rows in 45 languages (2026-08-31 census) with morphology facets (
search --lemma cyning --morph case=gen --lang ang), distinctive-vocabulary profiles (vocab urn:nabu:proiel:cic-off→ officium, honestas, decorum), andexport --format jsonlstreaming the corpus to your own tooling with license filters.AI-tooling builders. A hand-rolled, dependency-free MCP server over stdio (
bin/nabu mcp,.mcp.jsonships in-repo) exposes fourteen read-only tools — search, show, concord, align, define, etym, parallels, cognates, links, place, char, signs, clarify, status — every passage carrying its license class, so a model can quote and cite responsibly. See docs/mcp.md.
What's on the shelves
A representative slice, not the whole registry (151 corpus sources as of 2026-09-02); each row carries the date its counts were read. The full shelf map with research uses per shelf is docs/library.md. Rows below without a date are the 2026-07-14 census.
Shelf | What's on it | Size | License |
Classical Greek | Perseus: Homer, the tragedians, Herodotus, Plato, Galen… + 650 aligned English translations | 1,418 docs / 394,706 passages | CC BY-SA |
Post-classical Greek | First1KGreek: Athenaeus, Philo, church fathers, Swete's Septuagint | 1,129 / 256,480 | CC BY-SA |
Classical Latin | Perseus: Vergil, Ovid, Cicero, Livy, Tacitus… + 181 English translations | 534 / 391,799 | CC BY-SA |
Documentary papyri | Papyri.info DDbDP: contracts, letters, tax receipts from a millennium of Egypt (Greek, Coptic, Latin, Arabic) | 61,414 / 921,611 | CC BY |
Latin inscriptions | Epigraphic Database Heidelberg: epitaphs, dedications, milestones from the whole empire — 81,416 dated (2026-07-14 census), genre/province/material facets | 81,881 / 406,306 | CC BY-SA |
Coptic | Coptic Scriptorium: the complete Sahidic + Bohairic NT, monastic and patristic prose — gold-lemmatized (233k rows) | 482 / 74,169 | CC BY per doc (source class nc) |
Sanskrit | GRETIL: Rāmāyaṇa, purāṇas, kāvya, śāstra, Ṛgveda with Vedic accents | 780 / 703,068 | CC BY-NC-SA |
Treebanks | PROIEL, TOROT, UD, ISWOC: gold lemma/morphology/syntax — parallel NT ×5, OCS→Middle Russian, Old English, Old Irish glosses | 80 / 178,278 | mostly CC BY-NC-SA |
Cuneiform | ORACC ×33 projects: the complete State Archives of Assyria, royal inscriptions, lexical lists, proto-cuneiform — with 8,911 aligned English translations | 21,692 / 385,243 | CC0 |
Biblical editions | Clementine Vulgate (73 books), SBL Greek NT, WEB English | 184 / 81,372 | PD / CC BY |
Old English poetry | The complete ASPR: Beowulf, the Exeter Book, Dream of the Rood… | 349 / 30,550 | CC BY-SA |
Slavic & Slovenian | CCMH OCS gospel codices, the ~1000 CE Freising Manuscripts, goo300k + IMP Early Modern Slovenian (1584–1899), the damaskini Balkan Slavic witnesses (15th–19th c., with English siblings) | 839 / 456,189 | CC BY (Freising BY-ND) |
Celtic | CorPH Early Irish (gold-lemmatized: Annals of Ulster, the great gloss corpora), RIIG Gaulish inscriptions (with French siblings), the Ogham in 3D stones (real Ogham codepoints + transliteration layers) | 1,387 / 20,318 | CC BY / MIT (ogham |
Chinese library | Kanripo classical Chinese + the CBETA Buddhist canon (Taishō + Xuzangjing) — 13.2M | 13.2M passages | mostly CC BY-NC / CC BY |
Japanese reading desk | Aozora Bunko: the Japanese public-domain library, Meiji core with a classical tail — ruby readings as annotations, kyūjitai reachable via the reform fold (2026-07-22) | 17,195 / 2,991,807 | open (PD grant) |
Germanic wave | Menotec Old Norwegian treebanks + Poetic Edda, the Old Saxon Heliand (HeliPaD), ReM Middle High German (355k gold manuscript lines), Rundata runic inscriptions in five text lanes (2026-07-22) | 31,057 / 409,947 | nc / CC BY / CC BY-SA / odbl |
Southeast Asia desk | The DHARMA corpora (Old Khmer, Campā, Nusantara, Pyu — with the first digital Old Mon anywhere), the Bagan Old Burmese inscriptions, the kakawin critical editions, the Old Javanese Wordnet (2026-09-02) | 2,985 docs / 130,761 passages + 3,632 entries | CC BY / BY-SA |
Korean desk | The Veritable Records of Joseon (sillok) in the original hanmun, the Goryeosa family, and since 2026-09-01 the OKHC historical slice: the Samguk sagi (1145), the Ilseongnok, the ITKC munjip mass, the AKS/Kyujanggak/NHM old-literature dbs | 1,198,779 / 3,542,662 (okhc alone) | per-record PD/KOGL/nc (source CC BY-NC 4.0) |
Reference shelf | LSJ + Lewis & Short + Bosworth-Toller + Monier-Williams + Wiktionary OCS + ten Wiktionary reconstruction/Celtic shelves + the IE-CoR / LIV / de Vaan etymological witnesses + the five StarLing bases (Pokorny, PIET, Vasmer, Germanic, Baltic) + three Slovenian historical dictionaries incl. Pleteršnik + the Hebrew/Egyptian/Slovene desks and the Sino-Japanese lexicography (Unihan, KANJIDIC2/JMdict, HDIC, Guangyun) ( | 1,310,763 entries / 56 shelves (2026-07-22) | CC BY-SA / CC BY / CC BY-NC-SA / grant |
The registry holds 215 corpus sources + 5 local shelves + 25 feature
modules (the kind-split census, 2026-10-13 — sources.yml
distinguishes what a row IS: a corpus that mints catalog rows, an
owner-authored local memory shelf, or machinery like osl (the Oracc
Sign List behind nabu signs), nabu-data (Nabu's own published
datasets, consumed back) and pedecerto/bridging that fetches
reference data but mints no documents of its own). All corpus
sources are wired — adapter built and first sync verified —
except KorBa (the Baroque Polish corpus: adapter ready, the
IJP's download server answering 502 since early October); the
newest arrivals are the October South Asia slice (tamilex,
sii-clean, madurai, shabados), the whole members-area
Tocharian B chain behind the new credentials seam, the
SEA/Gujarat Wikisource cones (ban/gu/ms/th), and the TITUS
Middle Iranian books — behind them the StarLing etymology
bases (Pokorny, Vasmer, the branch comparative shelves and the
LEXSTAT wordlists), the
Southeast Asia seven (the five DHARMA corpora, the Bagan
inscriptions, and the Old Javanese Wordnet — the desk opened whole
in one phase), okhc — the historical slice of
the Open Korean Historical Corpus, 1,198,779 documents that more
than doubled the library's document count in a day —
titus-osco-umbrian (the complete Iguvine Tables with the Oscan
inscriptions, 386 documents at line grain under a personal grant)
and seal (Sources of Early Akkadian Literature, 408 compositions,
the editors' written personal-research grant), after the August wave
(the Old Mandarin rhyme books, the Classical↔Modern Chinese parallel
corpus, the Monlam Tibetan lexicon, DACON's Newar, EEBO-TCP,
the Corpus of Middle English, Menota, and the INT Dutch corpora)
and the granted sources (2026-07-31): cantigas, the
complete secular Galician-Portuguese lyric (1,682 cantigas at verse
grain under the coordinator's written any-use grant) and rsti, the
Ras Shamra Tablet Inventory (5,075 inventory cards with KTU/CTA
concordances, published editions at line grain, under Prosser's NC-SA
grant) — the same day Sefaria's classical midrash (Rabbah + Midrash
Halakhah) joined wave 2 and ACTib became nabu-data's first
re-published source. Before them came the P46 wave's edr, ren, the Geʿez trio, wold and
clics, after the Romance wave's openmgh (the MGH critical editions),
digiliblt (late-antique Latin, silver-annotated) and bfm (Old
French), joining glaux (~20M-token silver-annotated Ancient Greek)
and croala (Croatian Latin) from the day before.
The Arabic library landed 2026-07-23: openiti's
owner-fired first sync brought 9,079 Islamicate text versions —
34.6M passages of premodern Arabic and Persian. Before it, the
Germanic four (menotec, helipad, rem, rundata) joined
2026-07-22 with their owner-verified first syncs, a day after aozora
(16,004 public-domain works, 2.98M passages) — the upstream corpora
plus four local shelves (the language
dossiers and source dossiers live, the owner's library shelf holding its
first 20 ingested documents, the notes shelf awaiting its first
annotation). The etymology desk now hears
from three tiers of witnesses: the Wiktionary-derived chains, the
expert-curated trio synced 2026-07-14 — IE-CoR (4,981 cognate sets /
26,325 reflex rows, 2,308 loan-flagged), LIV-LOD (305 PIE verbal
etymons), de Vaan's Etymological Dictionary of Latin (2,860
etymons) — and, since 2026-07-17, the five StarLing / Tower of Babel
bases under a written grant: Pokorny's complete IEW (2,222 roots),
Nikolayev's PIE database (3,291 etymologies), Vasmer's etymological
dictionary of Russian (18,239 entries), and the Common Germanic and
Baltic databases. The same sync wave landed the Slovenian historical
dictionary shelf (Pleteršnik 1894–95, the Svetokriški Baroque lexicon,
and the complete 16th-century word inventory — 139,405 entries), the
damaskini Balkan Slavic corpus, and the library's Celtic axis:
CorPH's gold-lemmatized Early Irish, the RIIG Gaulish inscriptions, the
Ogham in 3D stones, three attested-Celtic Wiktionary extracts, and two
Old Irish UD treebanks.
A local language-dossier shelf holds the library's language curation
as 199 plain-Markdown files (local/shelves/local-language/ — edit in any
editor, nabu sync local-language re-derives the nabu language cards),
and a source-dossier shelf carries a curated description of every
registered source, served on nabu list and gate-checked against the
shelf map by rake site:check.
Ranked expansion candidates live in the per-axis surveys (Old English,
Slavic, PIE, …) — private planning material under gitignored
.docs/surveys/; their license-checked verdicts land in
docs/02-sources.md.
There is also a shelf for your own PDFs, scans and articles
(local/shelves/local-library/ — manifest-catalogued, research_private by
default so nothing you scanned is ever served or redistributed,
page-cited where a text layer exists). nabu ingest FILE... is its front
door — and it takes http(s) URLs too, downloading first (redirects
followed) and recording the URL you gave in the manifest's source_url:
lane: it copies the file in (never moves your original), derives metadata
candidates mechanically (PDF metadata, filename, sha256), walks you
through confirming them — interactively, AI-assisted (--assist script/ingest-assist-claude prefills the prompts with a model's
suggestion), or scripted (--yes plus flags) — then syncs the shelf and
prints the minted urn:
bin/nabu ingest ~/scans/vaillant-1950-manuel.pdf --collection slavisticsAfter that the manual is show-able by page, searchable where it carries
text, and links-wired to the passages its manifest entry names as
related:.
Feature tour
| FTS5 full-text search, bm25-ranked, diacritic-insensitive with per-language folding: |
| Dictionary-form search over 21.9M gold lemma rows in 45 languages (2026-08-31 census) — inflections, suppletion and all; hits carry glosses where the reference shelf knows the lemma. Add |
| The language-contact facet (Coptic Scriptorium today): keep only passages carrying loanwords from a donor language — |
| Proximity search: keep only hits where |
| Damaged-text fragment search: substring matching ANYWHERE in a passage, mid-word included — |
| Search the DECLARED annotation layers beside the text itself — the editor's standardized spellings (Cantus: |
| Search the TEXT of upstream word glosses, one hit per passage: each passage's token glosses read in order as its interlinear gloss line — |
| A passage, a whole document, or a citation range ( |
| Passage-anchored intertext: point at one passage and find where the corpus quotes or echoes it — reception discovery, not translation alignment. Query-time over the FTS index (no new schema): the anchor's 4-word grams are phrase-probed, candidates ranked by shared-gram count weighted by rarity, elision folded across editions (so Matthew 4:4 finds LXX Deuteronomy 8:3). One hit per document (duplicate witnesses grouped, loci counted), the shared phrase shown as evidence; a gold-lemmatized anchor also gets rare-lemma "echoes" (re-inflected allusion). |
| The oral-formulaic reader's mirror of |
| The mined cross-reference graph, read back: every batch-produced edge touching a urn, both directions, grouped by kind (parallel, formula, cognate), counterparts resolved to title/language, each kind's evidence rendered natively (a parallel's score, a formula's |
| One citation across every witness of a registered work ( |
| Dictionary-shelf lookup — LSJ, Lewis & Short, Bosworth-Toller, Monier-Williams (193,890 entries live: SLP1 transcoded to IAST, so |
| The comparativist's walk: an attested lemma (богъ, guþ) → every reconstruction whose Wiktionary descendants name it → one hop up the proto-to-proto chain, each with cognates and corpus attestation counts. Multi-hop closure (PIE *per- → PBS → *pьrstъ → chu/orv in one walk) and per-edge "(loan)" flags are live, and so — since their 2026-07-14 first syncs — are the three independent expert-curated witnesses: IE-CoR's cognate sets ride the same walk ( |
| The code desk reference: any language code the library surfaces — corpus tags ( |
| The dossier front door: one command answering "what is this?" across the three desk namespaces, dispatching to the existing cards byte-identically — a single character or Gardiner-style sign code → the |
| The research-axis desk reference (config/axes.yml) in the |
| The character desk card: one Han character composed from every shelf the library holds — the join no dictionary site offers. Header (glyph · total strokes · KangXi radical number+name, from Unihan) → IDS decomposition with each component's follow-up commands (BabelStone IDS) → the component index (KRADFILE) → variants (trad/simp/z-variant, Unihan) → readings (kun/on + meanings from KANJIDIC2; Mandarin/Korean/Vietnamese from Unihan) → pedagogy (Jōyō grade · JLPT · frequency) → desk-reference codes (Unicode always; four-corner/SKIP/JIS/dic where KANJIDIC2 holds them) → the diachronic column no online dictionary carries (Baxter-Sagart Old Chinese · Qieyun Middle Chinese · the Heian hanzi dictionaries · TLS senses with classical attestation counts) → corpus attestation → the |
| The cuneiform sign desk: ATF transliteration — a passage/document urn from the ATF shelves (cdli/oracc/ebl/etcsl) or raw pasted text — resolved token by token through the local Oracc Sign List ( |
| Cognates in parallel: verses of an alignment work where witnesses in ≥2 languages use reflexes of the same reconstruction root — the hub × crosswalk join ( |
| Classic KWIC concordance: keyword column-aligned in pristine text, corpus order — for scanning usage, not relevance. |
| The document-kind axis (the fourth axis beside dates, places, and lects): what KIND of document is each text — funerary, administrative, legal, letter, divination, historiography… Thirteen collections' own genre vocabularies (sepulcralis / epitaph / funerary / Inscription funéraire) fold onto ~26 ruled cross-corpus classes, multi-label (an ode to a ruler is poetry AND royal), every upstream label preserved verbatim. |
| Lemma-frequency profile of a document, range, or passage against the gold-lemma corpus: total tokens, distinct lemmas, the most distinctive vocabulary (log-odds vs corpus — Caesar surfaces legio/proelium, Cicero's De officiis surfaces officium/honestas), and the in-document hapax legomena. Gold shelves only; a document without gold lemmas says so and names the annotated languages. |
| A lemma's attestation profile from the precompiled lemma rollup: first and last attested century, each with its date basis (artifact vs composition dating), a per-century table and sparkline with gold (verified annotation) and silver (automatic lemmatization) kept apart, undated attestations listed last, the top sources, and the dictionary shelves carrying the form. A document counts at the midpoint of its date envelope. Companions on the language desk: |
| Stream the corpus out, with |
| The intake front door for your own material: copies a PDF/scan/article into the local-library shelf ( |
| Owner annotations — scholia of one's own — on any urn the corpus knows (documents, passages, ranges, dictionary entries), resolution-checked before any write, stored as plain YAML on the local-notes shelf. Bare |
| The first-time step before |
| Fetch and load a source (git, zip, or single-file HTTP — or re-scan a local shelf); idempotent, non-destructive, every run recorded. The name resolves slug-first-then-axis: |
| The what-is-held view ( |
| Per-source counts and run history, each row carrying an |
| The read-only MCP server — fourteen tools for Claude Code/Desktop and any MCP client. Recipes and the user-perspective walkthroughs in docs/mcp.md. |
Two more tastes. Facing translation, span-grouped, honest when the English is coarser than the Greek:
$ bin/nabu show urn:cts:greekLit:tlg0012.tlg001.perseus-grc2:1.1-1.5 --parallel
urn:cts:greekLit:tlg0012.tlg001.perseus-grc2 — Iliad [grc]
parallel: urn:cts:greekLit:tlg0012.tlg001.perseus-eng4 — Iliad [eng]
aligned by citation: 0 paired, 1 block covering 5 lines, 0 grc only, 0 eng only
:1.1
grc μῆνιν ἄειδε θεὰ Πηληϊάδεω Ἀχιλῆος
:1.2
grc οὐλομένην, ἣ μυρίʼ Ἀχαιοῖς ἄλγεʼ ἔθηκε,
…
eng [:1.1 — covers :1.1–:1.39; range shows :1.1–:1.5]
Sing, O goddess, the anger [mênis] of Achilles son of Peleus, that brought
countless ills upon the Achaeans. …And the concordance, here on Caesar's virtus:
$ bin/nabu concord --lemma virtus --width 30
…vetii quoque reliquos Gallos virtute praecedunt, quod fere cotidi… urn:nabu:proiel:caes-gal:52552 [lat]
…i populi Romani et pristinae virtutis Helvetiorum. urn:nabu:proiel:caes-gal:52635 [lat]
…b eam rem aut suae magnopere virtuti tribueret aut ipsos despicer… urn:nabu:proiel:caes-gal:52636 [lat]
…que suis didicisse, ut magis virtute contenderent quam dolo aut i… urn:nabu:proiel:caes-gal:52637 [lat]
…Your collection cannot rot
Upstream projects restructure, lose funding, and disappear. Nabu is built on the assumption that the library must outlive its sources:
Canonical vs. derived. Upstream text lives as plain files in a git-tracked canonical layer — the permanent asset. All SQLite is derived and rebuildable:
nabu rebuildregenerates the entire catalog from canonical data, proven byte-identical by test.The attic. Fetch is non-destructive: files an upstream deletes are copied to
canonical/<source>/.attic/before the merge and stay live, searchable, and exportable — honestly labeled "retired upstream", keeping the license they were fetched under. A mass-deletion breaker aborts any sync that would withdraw more than 20% of a source.The ledger. Run history, license baselines, and revision records live in
local/history.sqlite3— the instance ledger no rebuild touches, preserved by backup as part oflocal/(the P71 three-folder contract).Backup with a drill.
nabu backuprsyncs the three permanent folders (canonical/+config/+local/) — plus the derived dbs as a convenience — to a mounted external volume;rake ops:drillproves it (backup → fresh-root restore → rebuild → verify → RESTORABLE), andrake ops:drill_pureproves the derivability law itself: restore the three folders ONLY and re-derive every database from scratch.Standing verification.
nabu verifyre-parses every canonical file (attic included) and compares content hashes against the catalog;nabu healthwatches run-history trends and probes upstreams for drift. Every sync prints a discovery-accounting line (selected · skipped-by-rule · unrecognized), so silent ingestion gaps are structurally visible.Boring storage. Files, git, SQLite. Restorable from an rsync with zero services.
Nothing is ever hard-deleted: withdraw, revise, journal.
Status — honest
This is a young, personal, early-development project — built for one scholar's research needs first and shared because the approach may be useful to others.
Developed and tested on macOS (Apple Silicon), Ruby 3.3+. Nothing is known to be Mac-specific except the ops templates (launchd), but no other platform is exercised.
Versioned releases begin at v1.0.0 (cut at the Phase-19 gate; citation metadata ships in CITATION.cff); there is no gem and CLI flags may still change between releases. GitHub Actions CI runs the full suite plus rubocop (
rake test+rake lint, network-blocked, fast) on every push and pull request — the badge up top is the contract.Corpus numbers above are a snapshot of one live install, dated where they appear.
The enrichment layer of the original vision (embeddings/semantic search, machine glossing) is designed but not built — see docs/01-concept.md for where this is headed. Ad-hoc ingestion of your own material shipped as
nabu ingest(Phase 19); OCR/HTR for image-only scans still waits on local inference hardware.Expect rough edges; expect the docs to be more honest than polished.
The project family
Nabu has three public siblings:
nabu-data — the datasets Nabu itself publishes: form→lemma tables, orthography and script folds, metrical scansions, the Tibetan segmentation layer, the cuneiform value→sign table, the curated language and script dossiers, the corpus layers (stages, dates, places, signs), and the re-publications (the ACTib anchor layer, the complete secular Galician-Portuguese lyric) — twenty-three datasets as plain CSV with Frictionless Data Package manifests (CC BY 4.0, stated share-alike carve-outs), each carrying its full derivation provenance down to the input corpus shas, archived with a version DOI under concept 10.5281/zenodo.21757475. The loop runs both ways: Nabu re-ingests its own publication as an ordinary source (
nabu sync nabu-data), so the Sanskrit lookup lane, the Tibetan verb lane, and Tibetan word segmentation are all served from the published files.nabu-lects — the lect registry (repository, CC BY 4.0, pre-1.0): language varieties as genealogical anchor × historical stage × variety × orthography, with a universal mapping from standard codes onto them. Born from this library's holdings, universal by construction; Nabu consumes it (
nabu sync nabu-lects) for the stage ladders onnabu languagecards,search --lect, and registry-keyed reconstruction display (docs/languages.md, "The lect layer").Edubba — the scribal school: a downstream teaching project built on Nabu's library, named for the Sumerian é-dub-ba-a, the "tablet house". Where Nabu curates the texts, Edubba teaches the scripts; its reading panels consume Nabu's MCP and sign-list surfaces. The boundary is deliberate: the library adds identity, not curriculum.
Documentation
Doc | One line |
Zero to first search, copy-pasteable, honest about sizes and timings. | |
The shelf map: every corpus with contents, counts, licenses, and research uses. | |
the research axes: the twenty-four scholarly desks, their personas, and which sources each tags. | |
The vision: what Nabu is, workflows, principles, what success looks like. | |
The MCP server: twelve read-only tools, registration recipes, quoting etiquette. | |
Field notes for working with ancient-text corpora (Unicode/NFC, citations, editions, licensing) — start here if you're new to the domain. | |
The design: layer model, adapter contract, store schema, retention machinery. | |
The source inventory: every corpus scouted, scored, and license-checked. | |
Sources not ingestible today, with concrete unlock paths. | |
The runbook: maintenance cadence, launchd templates, what to do when a check goes red. | |
How this stays alive across years of intermittent attention — leads with the where-truth-lives map: which surface is authoritative for every aspect, and what merely projects it. |
How this is built
Nabu is developed by a model-tiered autonomous agent loop — work packets executed by Claude models under TDD ground rules, with owner-approved phase gates — documented in docs/dev-loop.md. This README is refreshed at every gate to reflect what actually works.
bundle exec rake test # full suite (network-blocked by WebMock; fast)
bundle exec rake lint # rubocop
bin/nabu --helpContributions: the project is early and personal; issues and conversation
are welcome, but expect the backlog to be driven by the owner's research
needs. The house rules for outside contributors — TDD, fixture discipline,
the DCO sign-off — and the issue templates for requesting sources and
features or reporting a wrong reading are in
CONTRIBUTING.md; if you want to add a source,
CLAUDE.md and
docs/maintenance-and-extension.md
describe the adapter checklist end to end.
License
Code: MIT.
Content: every ingested text keeps its upstream license, recorded per document as data (
open/attribution/nc), and every surface — search hits, exports, MCP responses — carries the label. Roughly 99% of documents are public-domain or attribution-class; thencshelves (GRETIL, most treebanks) are for non-commercial research use and are never redistributed by the tooling. Per-source terms: docs/02-sources.md.
Available Tools
14 toolsnabu_alignCross-source alignmentARead-only
Cross-source alignment over the local nabu corpus: one citation of a registered work rendered across EVERY witness the alignment registry names — e.g. the same New Testament verse in Greek, Latin, Gothic, Classical Armenian, and Old Church Slavonic at once. ref is a citation in the work's scheme ("MARK 2.3"; case/spacing/chapter:verse colons normalize) or a passage urn to pivot from a search/show hit. work picks the registry work when several exist (optional with one). Witnesses come in registry order; each carries its language and license_class (the NT witnesses are nc — PRESERVE the license fields when quoting), and every sentence row carries urn + language + license_class + source. Sentence≠verse: a sentence spanning a verse boundary lists every ref it covers. Honest absence: a witness lacking the verse reads status no_match; a registered-but-unsynced witness reads not_synced. ref may also be a whole CHAPTER ("JON 1") or an inclusive same-book verse RANGE ("JON 1.1-1.16"): the reply is a refs array, one entry per ref in document order (each with the same witness columns), capped at 200 with an honest truncation note. Witnesses absent from EVERY ref of a range are summarized once in absent_witnesses (reason not_attested|not_synced) and omitted from the per-ref columns, so a chapter stays readable. collate: true returns a witness DIFF instead: a raw-token apparatus per (language, script) cell (base reading + each witness's divergences), with cross-script witnesses rendered undiffed and labelled honestly — the fold cannot bridge e.g. the Cyrillic Marianus and the Helsinki-ASCII CCMH codices.
Inputs: ref (required), base, work, collate, +1 more.
nabu_charCharacter cardARead-only
The sign/character desk card (P65/P68): ONE glyph or sign identity in, the full held identity out — the same frozen contracts as nabu char --json. Dispatch by input: a CUNEIFORM glyph (𒊬, compounds included) or sign name/value/list number (SAR · szesz · idx — trailing x reads as ₓ · MZL535 · bare 852 across every held list) serves the Oracc Sign List card: name, @aka, MZL/LAK/ABZL/HZL/ŠL concordances, values by language, CDLI meaning glosses, Wiktionary senses, variant forms, corpus counts; an ambiguous value lists ALL candidate signs, never one silently. An EGYPTIAN HIEROGLYPH (𓅃) or Gardiner-style code (G5, N35) serves the Unikemet card: catalog code, description, function, phonetic value, JSesh/Hieroglyphica/IFAO concordances, aes attestation. The Han character card is CLI-only for now — answered with a note (nabu_define serves Han dictionary entries meanwhile). Absent data is null/[], never a placeholder. Every card names its reference spine — source, license_class, license (OSL CC0, Unikemet Unicode License) — and attribution lists every contributing dataset; PRESERVE them when quoting.
Inputs: query (required).
nabu_clarifyReference normalizerARead-only
The reference normalizer: give a partial, misspelled, or half-remembered work or passage reference — a title prefix ("Ilia"), a misspelling ("Illiad"), a title plus citation ("Iliad 1.1"), or a full/partial urn — and get an honest reading of it: is_ref (does it name held text: a urn, or an EXACT document title [+ citation]), resolved_urn ONLY when it parses UNIQUELY (open it with nabu_show), ref (passage · document · citation_prefix · range, with license fields), structure (what a deeper citation looks like there: passage count, first/last citation, depth, an example urn and a range example), and completions — typed CANDIDATES {title, key, type: document|source|lemma|place, is_primary (the matched name is the primary title, not an alias), match: exact|prefix|token|fuzzy (a misspelling guess, said so), source, language, license_class; present-only detail, ref_urn}. Never a silent guess: two editions sharing a title, or a citation several hold, resolve to NOTHING and list every reading (ref_urn each). Diacritics optional (οδυσσεια finds Ὀδύσσεια). Backed by a precompiled title index; when it is not built the note says so and urn input still resolves. Bounded (default 10, max 50).
Inputs: query (required), limit, include_restricted.
nabu_cognatesCognates in parallelARead-only
Cognates-in-parallel over the local nabu corpus: verses of a registered alignment work where witnesses in TWO OR MORE languages use reflexes of the SAME reconstruction root — Gothic salt ~ OCS соль under PIE *sḗh₂l in the salt saying (Luke 14:34). The alignment hub (nabu_align) supplies the verse columns; the Wiktionary reconstruction crosswalk (nabu_etym) supplies the lemma→root closure over the shelf-visited multi-hop walk (got→*saltą→*sḗh₂l←*solь←chu). target is a work id (batch the work) or a citation/chapter/book ref; langs restricts to ≥2 named languages (e.g. ["got","chu"]). Each group carries the verse ref, the root (headword, SHELF language, gloss, license — PRESERVE license fields when quoting), and per-language witness words (lemma, attested surface forms, attesting documents with licenses, and a borrowed flag: true = the crosswalk marks this witness's descent a loan — hlaifs ~ хлѣбъ(borrowed:true) at *hlaibaz; null = not yet flagged either way). READ THE SHELF for unflagged edges: a meet at gem-pro involving a Slavic witness is very possibly a BORROWING, not common descent; ine-pro meets are the inheritance signal. Corpus-common words are suppressed with an honest count (all lifts; frequency is a coarse proxy and some common words survive). Recall is bounded by Wiktionary coverage (~1/3 of Gothic, ~1/5 of OCS gold lemma types reach any proto entry) and by gold lemmatization (~10% of the corpus): no hit is absence of evidence, not evidence of unrelatedness. Bounded (default 10 groups, max 50) with honest totals.
Inputs: target (required), all, lect, work, +3 more.
nabu_concordConcordance (keyword in context)ARead-only
Concordance (KWIC — keyword-in-context) over the local nabu corpus: one row per hit as left context / matched keyword / right context, the keyword located in the PRISTINE edition text (accents intact). Give EXACTLY ONE of query (full-text, same syntax as nabu_search: words AND, "phrase", prefix*, diacritics optional) or lemma (exact dictionary form over the treebanks). Rows come in CORPUS order (urn/citation), not relevance — this is for scanning a word's usage, not ranking. Context is trimmed to width characters per side (default 40, max 120; … marks clipped context). Bounded (default 10, max 50) with an honest 'showing k' note; each row carries urn, language, license_class, and source — PRESERVE the license fields when quoting. Use nabu_show for a hit's full passage, nabu_search when you want ranked relevance rather than a scan.
Inputs: lang, lemma, limit, query, +3 more.
nabu_defineDictionary lookupARead-only
Look up a lemma (dictionary form) in the dictionary shelves nabu holds locally — hundreds of lexica across many languages (LSJ, Lewis & Short, Bosworth-Toller, the Wiktionary extracts, and far more; the lang enum in this schema is the LIVE set of shelf languages, nabu_status counts the entries). The Wiktionary RECONSTRUCTION shelves (*-pro codes) are included: a LEADING ASTERISK scopes to reconstructions (*bogъ), whose entries also list their descendant reflexes with corpus attestation counts (nabu_etym walks the same crosswalk from an attested lemma). Diacritics optional (μηνις finds μῆνις); lang picks a shelf language when the spelling is ambiguous. Each entry carries headword, dictionary, license fields (PRESERVE them when quoting), a short gloss, the entry body as structured plain text (senses labeled; bounded at 6000 chars with an honest note — the CLI nabu define is unbounded), and the entry's citations: where the cited work is in the local catalog the citation carries a resolved passage urn (open it with nabu_show); otherwise resolved_urn is null and the display text stands. A PRINT citation of a reference work (a BDB page, a Wb volume/page/line, a Holder AcS volume/column) may carry scan: status (anchored/held/uncalibrated/out_of_range/not_held/unconfigured), urn (the held scan's page passage or document — null when not held), leaf, pointer. Entries may carry crossrefs — pointers to other entries, usually of the same dictionary, sometimes of another (the Strong shelf's BDB ids) (kind, label verbatim, resolved_urn of the target entry or null — open it with nabu_show). Bounded (default 3 entries, max 10; homographs are separate entries). The owner's own notes on an entry ride along in notes — useful curatorial context.
Inputs: lemma (required), lang, lect, limit, +2 more.
nabu_etymReconstruction walkARead-only
Walk the reconstruction crosswalk (the comparativist's join): give an ATTESTED lemma (богъ, guþ, deus) and get every reconstructed ancestor whose Wiktionary descendants name it — Proto-Slavic, PIE, Proto-Germanic, Proto-Balto-Slavic, Proto-West Germanic, Proto-Italic, Proto-Indo-Iranian (kaikki.org extracts, CC-BY-SA + GFDL; PRESERVE license fields when quoting). Each entry carries the *headword, gloss, the reflex that matched (matched_via, incl. its borrowed loan flag), its COGNATES across languages with corpus attestation counts (attested_count = gold-lemma passages in this catalog; null = not attested here, an absence not a zero) and per-edge borrowed flags, and nested ancestors — the full chain up the proto shelves (прьстъ→*pьrstъ→*pírštan→*per-), bounded because each shelf enters a walk once; a loan edge carries edge_borrowed: true. Romanization bridges scripts: guþ reaches *gudą through Gothic 𐌲𐌿𐌸. lang scopes the match to one attested language; a leading asterisk (*bogъ) looks a reconstruction up directly. A lemma with NO crosswalk path falls back to the dictionary shelf (nabu_define's own lookup): the reply then carries dictionary_entries (the nabu_define payload shape — a prose etymological article like Vasmer's still answers) plus an explanatory note; a genuine total miss enumerates the crosswalk's live shelves. Cognate lists are bounded (attested first, 20 shown) with honest totals; nabu etym (CLI) is unbounded.
Inputs: lemma (required), lang, limit, include_restricted.
nabu_linksMined links graphARead-only
Batch-mined cross-reference edges touching a passage/document urn — the links journal (kind=parallel from nabu parallels --batch; kind=formula from formulas --batch, a star per refrain whose detail carries the gram and score its count; kind=cognate from cognates --batch, cross-language witness pairs whose detail carries the meet: ref · root [shelf] — a gem-pro shelf under a Slavic witness suggests a borrowing; kind=reuse from the KITAB text-reuse import, UPSTREAM-computed pairwise Arabic alignments whose detail carries the milestone/offset spans verbatim). READS ONLY what a batch run already persisted: for on-the-fly discovery use nabu_parallels; an empty result means no batch has covered this urn, NOT that no parallel exists. Edges come back grouped by kind, both directions (direction=out: this urn's anchor probe discovered the counterpart; in: another anchor found this urn), each counterpart resolved to document title/language/license_class/source (null when no longer in the catalog — edges are urn-keyed and outlive rebuilds). runs cites the producer run(s): producer, scope, params, code_version, date — every edge's provenance. Bounded per kind (default 20, max 100) with an honest note; PRESERVE the license fields when quoting.
Inputs: urn (required), limit, include_restricted.
nabu_parallelsIntertext parallelsARead-only
Passage-anchored intertext over the local nabu corpus: give ONE passage urn and get the passages that QUOTE or ECHO it — reception discovery, not translation alignment (that is nabu_align). Query-time over the same FTS index as nabu_search: the anchor is folded, cut into overlapping 4-word grams, each probed as an exact phrase; passages sharing grams are ranked by shared-gram count WEIGHTED BY RARITY (a rare shared phrase outweighs common function-word grams). Elision is folded across editions (SBLGNT ἐπʼ ≡ Swete ἐπ’), which is what lets Matthew 4:4 find LXX Deuteronomy 8:3. Each hits entry is one DOCUMENT (duplicate witnesses grouped; loci = how many of its passages matched) with its best passage urn, score, shared_grams, and the shared PHRASE spans (diacritic-folded — WHAT matched; nabu_show gives pristine text). Only the anchor's OWN document is excluded; translations self-exclude (no shared folded tokens). When the anchor carries gold treebank lemmas, lemma_echoes adds passages sharing ≥2 of its RARE lemmas (re-inflected/reordered allusion verbatim grams miss). Bounded (default 10, max 50) with an honest note; every hit carries urn, language, license_class, and source — PRESERVE the license fields when quoting. lang/license scope candidates. explain: true adds each hit's per-gram score decomposition (gram → df → weight → contribution; rows sum to the score exactly, non-contributing grams as zero rows).
Inputs: urn (required), lang, lect, limit, +3 more.
nabu_placePlace deskARead-only
The place desk (P44-2; v2 P66-2): one ancient place — resolved through the LOCAL Pleiades gazetteer dump or the derived multi-gazetteer place index — plus the library's holdings AT that place, per source. query is a Pleiades numeric id, a pleiades.stoa.org/places URL, a NAMESPACED ref (tm:2810, cigs:GIR — the tm/cigs gazetteers), or an EXACT place title (case-insensitive; "Segesta" works, "Seges" does not — no fuzzy matching anywhere, by design; homonym titles return one card each). Holdings count live documents whose parsers captured that upstream-asserted Pleiades id (the epigraphic sources: isicily, edh, iip, itant) — aggregate counts only; read the texts with nabu_search/nabu_show. An honest labelled unlinked tail counts id-LESS documents whose captured findspot TEXT mentions the name (exact substring) — never merged into the id-matched holdings. Degrades honestly when the gazetteer dump is not on this box: a numeric id still counts holdings (the catalog side needs no dump, the card is just fact-less); a NAME lookup needs the dump and says so. Coordinates are display facts — no maps, no coordinate math. A card serving gazetteer facts carries attribution (the gazetteer's source slug, license_class, verbatim license, and the place's upstream uri) — PRESERVE it when quoting the facts (Pleiades is CC BY 3.0).
Inputs: query (required).
nabu_searchSearch the corpusARead-only
Search nabu, a local corpus of ancient texts (polytonic Greek, Latin, Old Church Slavonic, Gothic, and more: literary editions, documentary papyri, gold treebanks, parallel English translations). Give EXACTLY ONE of: query — full-text FTS5 (words AND by default, "quoted phrase", prefix*; diacritics optional, μηνιν finds μῆνιν) — or lemma — exact dictionary form over the lemma index, every tier it holds: gold treebank annotation unlabeled, silver/equivalence hits labeled by a tier field (λέγω finds εἶπας, εἰπεῖν, every inflection; add morph — e.g. "case=dat,number=pl" — to keep only attestations with that morphology, each hit showing the decoded evidence). Add near for PROXIMITY — keep only hits where that term sits within window words (default 10, 0=adjacent) of query (or lemma, expanded to its surface forms) in the SAME passage, order-independent; both matched terms are bracketed in the snippet (near does not compose with morph). Hits are relevance-ranked and bounded (default 10, max 50) with an honest 'showing k' note; each carries urn, language, license_class, and source — PRESERVE the license fields when quoting. meter/meter_pattern (text search only) restrict hits to metrically SCANNED passages — the pedecerto (Latin) / hypotactic (Greek) meter enrichment layer; the note names that layer or explains an empty one. words (text search only) is the Tibetan word-grain filter: keep only hits whose match aligns with word boundaries per the nabu-data segmentation dataset (degrades honestly for non-Tibetan queries or an unsynced module). Four further LANES replace the ranked text search (each composes with the args its schema line names, nothing else): fuzzy: true — substring/fragment search over the documentary trigram index (]μηνιν αει[, the CLI's --fuzzy); translations: true — the query matched against the translations held in passage annotations, hits being the ORIGINAL passages with the matched layer (the CLI's --translations); annotations: true — the query matched against the DECLARED annotation layers (standardized/regularized spellings, readings, margin notes, footnotes, editors' notes), hits being the passages with the matched layer (the CLI's --annotations); sense — the word-sense desk (a DCS WordSem id or sense name → the passages whose tokens cite it, each with its citing tokens; the CLI's nabu sense). betacode: true reads query/lemma/near as TLG Beta Code (mh=nin → μῆνιν). Use nabu_show with a hit's urn for the full passage, nabu_status for what the corpus covers.
Inputs: to, from, kind, lang, +25 more.
nabu_showRead passages by URNARead-only
Read the nabu corpus by urn: one passage, a whole document, an inclusive range, or a parallel-aligned translation. urn shapes — passage: urn:cts:greekLit:tlg0012.tlg001.perseus-grc2:1.1 · document: urn:cts:greekLit:tlg0012.tlg001.perseus-grc2 · range: :1.1-1.10 (inclusive slice) · papyrus: urn:nabu:ddbdp:aegyptus:89:240:b2:5 · treebank sentence: urn:nabu:proiel:afnik:194690. A shortened CITATION PREFIX between document and passage grain (…:avest020:Y.19.1 over passages Y.19.1.a/b) lists everything below it, boundary-exact — term-less browsing needs no search hit first. parallel: true aligns the same work's parallel_lang (default eng) edition line by line. Passage lists are bounded by max_passages (default 50, cap 200) with an honest truncation note. Every passage carries urn, language, and license_class — preserve them when quoting. Withdrawn/retired items appear, flagged. The owner's own notes on the urn ride along in notes (documents also count passage-note children) — useful curatorial context. A metrically scanned passage carries meter (code, foot pattern, producer); an epigraphic document whose parse-captured Pleiades findspot id resolves through the local gazetteer dump carries findspot (both keys absent otherwise — absence of the dump or of the enrichment, not a claimed absence of fact). segmented: true adds a word-segmented rendering of Tibetan (xct/bod/otb) passages as a present-only segmented key per passage record; a not-applicable call carries segmentation_note instead. senses: true adds each shown passage's token senses (DCS WordSem ids — the CLI's show --senses): a present-only senses list per passage record plus a sense_entries map resolving the ids against the sense shelf; a source with no ruled token senses answers senses_note instead. The findspot block carries the gazetteer's attribution (source, license, the place's upstream URI) — preserve it when quoting the place facts.
Inputs: urn (required), senses, parallel, segmented, +3 more.
nabu_signsCuneiform sign deskARead-only
The cuneiform sign desk (P53-2): ATF transliteration resolved token by token through the local Oracc Sign List into sign identities — value → sign name → Unicode codepoint(s). Give EXACTLY ONE of: urn — a passage or document urn from the ATF corpora (cdli/oracc/ebl/etcsl; e.g. urn:nabu:cdli:p469841 — language read from the row, the catalog opened read-only) — or text — raw ATF transliteration (lang optional). C-ATF ASCII folds apply (sz→š, s,→ṣ, t,→ṭ, u2→u₂); dialect: "etcsl" adds the ETCSL romanization (c→š, j→ŋ), auto-selected for etcsl urns. Every token carries ONE honest status: deterministic · qualified (valueₓ(SIGN), the explicit sign resolved) · ambiguous (ALL candidate signs listed, never one silently) · no-codepoint (sign resolved, honestly unencoded upstream) · broken (x, [...]) · unknown (not in the OSL — said plainly). Determinatives are unbraced and flagged. The sign list adds IDENTITY, not curriculum. Bounded (default 40 lines, max 200); the restricted-exclusion stance applies to urn mode. sign_list carries the OSL license envelope; urn mode also carries the text's license_class.
Inputs: urn, lang, text, dialect, +2 more.
nabu_statusCorpus coverage statusARead-only
Coverage of the local nabu corpus: per-source document/passage counts and last-sync recency, passage counts by language and by license class, index state, and what is excluded by default (research_private/restricted). Call this to interpret an empty search — is the language, source, or period even ingested here? — before concluding a text is unattested. Takes no arguments.
Inputs: no named parameters.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 14 tools
Each tool targets a clearly distinct operation on the corpus (ranked search vs. KWIC scan vs. passage read vs. dictionary vs. etymology vs. alignment vs. intertext vs. gazetteer vs. sign/char desks), and the descriptions explicitly cross-reference each other to say which tool to use instead. The closest pairs — nabu_search/nabu_concord, nabu_align/nabu_parallels/nabu_links, nabu_define/nabu_etym, nabu_char/nabu_signs — are separated by explicit stated differences (relevance vs. corpus order, translation vs. reception vs. persisted batch edges, fallback lookup, glyph card vs. ATF tokenization). Some residual overlap remains, but boundaries are well drawn.
All 14 tools use the same namespace-prefixed snake_case noun convention: nabu_search, nabu_show, nabu_concord, nabu_align, nabu_define, nabu_etym, nabu_parallels, nabu_links, nabu_char, nabu_signs, nabu_place, nabu_clarify, nabu_status, nabu_cognates. No mixed casing or verb/noun style drift; names are short, predictable, and domain-meaningful.
14 tools sits squarely in the well-scoped range and each maps to a distinct research substrate or workflow stage (discovery, reading, lexicon, comparativist, alignment, epigraphy/signs, normalization, coverage). Nothing looks like a redundant wrapper or a trivial one-off; the surface is broad but not bloated.
Coverage is unusually thorough end-to-end: search/scan → show/browse → define/etym → align/parallels/links → place/sign/char → clarify/status, plus honest degradation notes for missing modules. Minor gaps exist only at the edges — the Han character card is CLI-only, there is no explicit bulk document/collection listing or citation-formatting/export tool, and writes/annotations are absent (consistent with a read-only corpus).
Maintenance
Related MCP Connectors
Bible corpus MCP server: scripture, Greek/Hebrew interlinear data, cross-refs, semantic search.
MCP server for classical Chinese texts: sentence lookup, source attribution and full-text search
Personal knowledge base MCP server with semantic search, auto-categorization, metadata extraction
Read-only scripture-study engine: complete-or-fail concordance over Greek NT, Hebrew OT, LXX.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceBiblical text analysis with textual criticism support. An MCP server for morphological analysis, manuscript variants, and concordance searches across Hebrew and Greek biblical texts.MIT
- AlicenseNot gradedqualityBmaintenancePostgreSQL-backed MCP server for deep Bible study, integrating 140+ translations, Greek/Hebrew lexicons, cross-references, and semantic search.MIT
- AlicenseBqualityDmaintenanceProvides Hebrew & Greek word study, full morphological parsing, cross-references, LXX alignment, and more from open-licensed data sources, usable by any MCP-compatible client.9MIT
- AlicenseNot gradedqualityCmaintenanceSemantic search and comparative retrieval over a multi-tradition corpus of sacred and foundational texts, exposed as an MCP server.MIT