MCP server
Connect an AI assistant straight to the knowledge graph. It can then look up passages, trace cross references and walk relationships itself, rather than guessing from memory.
Connecting
Two kinds of client ask for two different things. An MCP client speaks a protocol: it posts to one endpoint and asks it what tools exist. An OpenAPI client wants a document: it appends /openapi.json to whatever base you give it and reads the tools out of the file. Both are served here, at different addresses. Handing one the other’s address is the mistake worth anticipating, because it surfaces as a 404 rather than as an explanation.
MCP clients
Claude Desktop, Cursor, VS Code, Zed — anything that speaks the protocol.
{
"mcpServers": {
"vineverse": {
"type": "http",
"url": "https://vineverse.bible/api/mcp"
}
}
}
Claude Code can add it in one command instead:
claude mcp add --transport http vineverse https://vineverse.bible/api/mcp
type is redundant for clients that work the transport out from url, and required by the ones that do not. Stating it costs a line and removes a class of silent failure.
OpenAPI tool servers
Open WebUI, and anything that asks you for a schema URL.
- URL
https://vineverse.bible/api/v1- Auth
None
Auth is the field you have to change. Several clients — Open WebUI among them — default to expecting a bearer token and will ask you for a key; there is none to give, and left at that default it is the difference between the whole toolset appearing and nothing appearing. The document declares security: [], meaning no scheme is required rather than unstated, but that is a statement a client is free to ignore.
If yours wants the schema URL itself rather than a base to append to, it is at /api/v1/openapi.json, also served from /openapi.json. Every operation is named to match its MCP tool, so the same capabilities arrive under the same names whichever way you come in.
Anything else
Plain HTTP, from a shell or from any language.
curl https://vineverse.bible/api/v1/passage/John.3.16
Every endpoint is a GET and needs no key. The JSON API lists them all.
Stateless Streamable HTTP. No key, no account, nothing to install. Every protocol revision from 2024-10-07 through 2025-11-25 is served from the same endpoint, and a client that asks for something newer is negotiated down to 2025-11-25 rather than refused.
Tools
get_stats- The catalogue: every collection, its size and what it holds.
list_documents- Page through any collection — events, epochs, themes, commandments, lexemes.
search- Find concepts by name, description, tag or path, filtered by type.
search_scripture- Full-text search across all 31,102 verses.
get_passage- A verse, range or chapter — the people, places and themes it touches, and what is recorded there.
get_interlinear- The Hebrew, Aramaic or Greek behind the English, word by word, with morphology and Strong’s numbers.
find_cross_references- Cross references ranked by crowd support — the 20-votes-and-up subset.
get_entity- Any document, with typed relations in both directions — and its full text on request.
get_family- A person’s parents, children, siblings and spouses.
find_places_near- Biblical places within a radius, nearest first, with distances.
get_connections- The cross-reference corpus in aggregate — hub chapters, book-to-book flows.
get_graph_neighborhood- Everything within N hops of a document, with the edges.
get_vocabulary- What each relation predicate means, and the 66-book canon table.
get_tags- The tag vocabulary, with document counts.
get_changelog- When the data was last ingested, and what changed.
If it does not connect
404 on /api/mcp/openapi.json- An OpenAPI client pointed at the MCP endpoint. MCP has no schema document — tools are discovered by asking the endpoint — so there is nothing to serve there. Use the v1 base above instead.
- The client asks for an API key
- Set its auth type to None. There is no key to issue and no account to hold one, so any value you invent will be ignored and any prompt you cannot dismiss is the client’s own default rather than a requirement from here.
405 on GET /api/mcp- Correct, and not a fault. The endpoint answers POST; opening it in a browser will always show this. Nothing needs fixing.
- Nothing appears, and no error either
- Check for a trailing slash.
/api/mcp/ answers with a 308 to the unslashed path, which most clients follow and a few quietly do not.
Two things worth telling your assistant
Cross references record that two passages are connected, never why. The corpus carries no relationship type, so a model should not present a connection as a claim about meaning that the data does not make.
Relations are stored one-directional, and the one that catches people is family. There is no child-of edge anywhere in the corpus — not a rare one, none — so a person’s own parent-of relations are their children. Read them as parents and the family tree comes out upside down. get_family exists to do that inversion; a model reading raw relations off get_entity will not do it on its own.
Two collections also carry the assumptions of the sources they came from. Epoch dates are Ussher’s chronology — one seventeenth-century reckoning, not a scholarly consensus — and themes are Nave’s Topical Bible of 1897, whose groupings are Nave’s own editorial judgement. Both are served as bare structured data, so a model has nothing in the payload to tell it either is interpretive.
The server says the first two of these in its own instructions, but a client that ignores instructions will never show them to the model.
Most of what comes back is CC BY 4.0 — but the 450 events under /sa/, and the source record describing the dataset they came from, are CC BY-SA 4.0, which is viral. A response about one document carries licence.document naming the licence that actually applies; a listing or a search covers many documents at once, so there each share-alike entry is flagged shareAlike: true instead. Trust either over the blanket line beside it. See attribution. There is a plain JSON API too if you would rather call it directly.