MCP — ask your model
Nabu’s MCP server is read-only: a model can search, read, align, and look things up in the library, quote what it finds, and cite it, but nothing it does can change the collection. This page runs the demo, a public image (release 1.0.0) with an open slice of the library baked in. Worked research examples and wiring the server to your own full library are on the Tools page: Ask your model.
The tools
The server answers tools/list with these 14 tools, every
one read-only and every payload stamped with the license class of the text
it carries. Each tool’s full input schema and usage notes come back from
tools/list itself.
| Tool | What it does |
|---|---|
nabu_search |
Search the corpus |
nabu_show |
Read passages by URN |
nabu_concord |
Concordance (keyword in context) |
nabu_align |
Cross-source alignment |
nabu_define |
Dictionary lookup |
nabu_etym |
Reconstruction walk |
nabu_parallels |
Intertext parallels |
nabu_cognates |
Cognates in parallel |
nabu_links |
Mined links graph |
nabu_char |
Character card |
nabu_place |
Place desk |
nabu_signs |
Cuneiform sign desk |
nabu_clarify |
Reference normalizer |
nabu_status |
Corpus coverage status |
A sample call
One tools/call against the demo image (the protocol is JSON-RPC 2.0,
one object per line on stdin and stdout). The request:
{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"nabu_show","arguments":{"urn":"urn:nabu:sblgnt:john:1.1"}}}
The reply’s content[0].text is a JSON document. Unwrapped, it reads
as follows (the provenance load record is trimmed here):
{
"type": "passage",
"urn": "urn:nabu:sblgnt:john:1.1",
"language": "grc",
"license_class": "attribution",
"source": "sblgnt",
"document_urn": "urn:nabu:sblgnt:john",
"document_title": "ΚΑΤΑ ΙΩΑΝΝΗΝ",
"text": "Ἐν ἀρχῇ ἦν ὁ λόγος, καὶ ὁ λόγος ἦν πρὸς τὸν θεόν, καὶ θεὸς ἦν ὁ λόγος.",
"sequence": 0,
"revision": 1,
"withdrawn": false,
"provenance": [ … ]
}
Run the demo
The public image ghcr.io/arvicco/nabu-demo:1.0.0 serves the Greek New Testament, Hebrew
Bible, Latin Vulgate, World English Bible, LSJ and Lewis & Short through
the read-only MCP server. There is nothing to clone and no sync to run.
Every source in the image and its license are listed in
the license table below. The full library is a
local build (Quickstart).
Docker (stdio):
docker run -i --rm ghcr.io/arvicco/nabu-demo:1.0.0
Claude Code:
claude mcp add nabu -- docker run -i --rm ghcr.io/arvicco/nabu-demo:1.0.0
Any MCP client that reads the standard mcpServers configuration
(Claude Desktop’s claude_desktop_config.json, Cursor’s mcp.json, and
others):
{
"mcpServers": {
"nabu": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"ghcr.io/arvicco/nabu-demo:1.0.0"
]
}
}
}
Check that it answers: pipe the protocol handshake into the image. The
second line of output is the tools/list reply, naming all
14 tools:
printf '%s\n' \
'{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-11-25","capabilities":{},"clientInfo":{"name":"check","version":"1"}}}' \
'{"jsonrpc":"2.0","method":"notifications/initialized"}' \
'{"jsonrpc":"2.0","id":2,"method":"tools/list"}' \
| docker run -i --rm ghcr.io/arvicco/nabu-demo:1.0.0
Editors, one click (both need Docker installed locally):
- Install in VS Code (or through the vscode.dev redirect)
- Add to Cursor (or through the cursor.com redirect)
Docker Desktop’s MCP Toolkit: a one-entry custom catalog (docker-mcp-catalog.yaml):
docker mcp catalog import https://arvicco.github.io/nabu/docker-mcp-catalog.yaml
# current Toolkit CLIs, which replaced `import`:
docker mcp catalog create nabu --from-legacy-catalog https://arvicco.github.io/nabu/docker-mcp-catalog.yaml
Over HTTP (streamable HTTP; PORT sets the port, default 8080):
docker run --rm -p 8080:8080 ghcr.io/arvicco/nabu-demo:1.0.0 bin/nabu mcp --http
# endpoint: POST http://localhost:8080/mcp
Hosted, one click
Both buttons deploy the same prebuilt image, release 1.0.0, as
an HTTP endpoint at https://<your-service>/mcp. The demo answers
comfortably within a 512 MB free instance.
- Deploy to Render.
Render reads the repository’s
render.yaml, a Blueprint that names the prebuilt image by its release tag, then pulls that image and starts it in HTTP mode. It does not compile anything from the repository. Render’s free instances sleep after about fifteen minutes idle, and the first request after that waits roughly a minute while the instance wakes. - Deploy to Koyeb. Koyeb pulls the same tagged image directly. Its free instance scales to zero when idle, so the first request after a quiet spell pays a cold start of several seconds.
Access control over HTTP. Local stdio is the default: the client
starts the container itself and talks to it over a pipe, so nothing
listens on the network. HTTP mode is different. The server has no
authentication and no TLS of its own, and inside the image it binds every
interface, so anyone who can reach /mcp can call every tool. The tools
are read-only and the demo data is openly licensed, but a hosted endpoint
you don’t mean to be public needs its own access control in front of it
(a reverse proxy that authenticates, a private network, or your platform’s
access rules), with TLS terminated there. Browser requests from origins
other than loopback are refused unless listed in
NABU_MCP_ALLOWED_ORIGINS.
What the demo carries
The demo is built only from sources whose license class is open or
attribution, and the build refuses anything else. The demo set is the
texts and dictionaries in the image; the instruments are the registries
and gazetteers the tools read. The image’s /demo/demo-census.json lists the
same sources with their document and passage counts.
| Source | Role | Class | License |
|---|---|---|---|
SBL Greek New Testament (SBLGNT) (sblgnt) |
demo set | attribution | CC BY 4.0 |
Biblia Sacra Vulgata Clementina (Tweedale/eBible.org, via open-bibles) (vulgate) |
demo set | open | Public Domain |
World English Bible (eBible.org, via open-bibles) (eng-web) |
demo set | open | Public Domain |
Open Scriptures Hebrew Bible (Westminster Leningrad Codex + OSHM morphology) (oshb) |
demo set | open | WLC text: Public Domain (“This work is based on The Westminster Leningrad Codex, which is in the public domain.” — LICENSE.md). Lemma/morphology layer: CC BY 4.0 (“Lemma and morphology data are licensed under a Creative Commons Attribution 4.0 International license. For attribution purposes, credit the Open Scriptures Hebrew Bible Project.” — README.md) |
Perseus Lexica — LSJ + Lewis & Short (lexica) |
demo set | attribution | CC BY-SA 4.0 (credit Perseus Digital Library; data from github.com/PerseusDL/lexica) |
CIGS — Cuneiform Inscriptions Geographical Site Index (gazetteer instrument) (cigs) |
instrument | attribution | CC BY 4.0 (Zenodo record verbatim: “Creative Commons Attribution 4.0 International”) |
nabu-lects — the lect registry (anchor x stage x variety x orthography resolver) (nabu-lects) |
instrument | attribution | CC BY 4.0 (repo LICENSE verbatim: “This work — the lect registry (lects.yml), the code mapping (codemap.yml), the documentation, and the validation tooling in this repository — is licensed under the Creative Commons Attribution 4.0 International License”) |
nabu-places — the place-matching decisions registry (nabu-places) |
instrument | attribution | CC BY 4.0 (repo LICENSE verbatim: “Creative Commons Attribution 4.0 International (CC BY 4.0)”) |
Pleiades — ancient-world gazetteer (place resolver instrument) (pleiades) |
instrument | attribution | CC BY 3.0 (downloads page verbatim: “Creative Commons Attribution 3.0 License (cc-by)”) |
Trismegistos Geo — places database (gazetteer instrument) (trismegistos-geo) |
instrument | attribution | CC BY-SA 4.0 (dataservices page verbatim: “We offer you open access to our data on a CC BY-SA 4.0 license.”) |