For agents · MCP
MCP server.
Model Context Protocol lets a model call tools. This server exposes the harness as eight of them. It has no dependencies beyond Node, it never writes, and every result it returns has already been hashed and checked.
Install
// ~/Library/Application Support/Claude/claude_desktop_config.json
{
"mcpServers": {
"harness": {
"command": "npx",
"args": ["-y", "https://harness.talk/downloads/harness-talk.tgz", "mcp"],
"env": { "HARNESS_BASE_URL": "https://harness.talk" }
}
}
}Environment: HARNESS_BASE_URL (default https://harness.talk), HARNESS_LOCAL=0 to skip the loopback daemon probe.
Tools
Generated from the same manifest as the REST API and the client. Names and schemas are identical to /agents/tools.json.
| tool | does |
|---|---|
getVerse | Fetch one verse (or a verse range) by reference. Returns the exact 1611 KJV text (original spelling) with source id and sha256 for local verification; other ingested texts via `source`. |
getPassage | Fetch a whole chapter with prev/next navigation, Psalm superscription, and Psalm 119 headings. |
search | Search the 1611 KJV in modern spelling: 'loved' finds 'loued', 'believe' finds 'beleeue' (shared normaliser, 96.6% measured bridge). Plain words: verses with every word, ranked closest-together first; if no verse has all of them, mode becomes 'idea' and verses are ranked by how many they carry. A "quoted phrase" matches exact order (spelling-insensitive). A reference resolves it. 'unmatched' lists words that occur nowhere in the text — do not infer they exist. |
searchDocs | Search the harness DOCUMENTATION — a separate layer from Scripture, never mixed with it. Covers every doc page by section (protocol, addressing, hashes, errors, covenant, licence, MCP, harness, storage, translations), the tool manifest, and the corpus build reports. Use this to learn how harness.talk works; use 'search' for the Word itself. Hits carry the page, section heading, anchor URL, and a snippet. |
getAnnotations | Annotation layer for a chapter or verse: the Geneva Bible's chapter arguments, marginal notes, cross-references (source 'geneva-notes'). Returns source_not_ingested where the source has no verified data — never a substitute. For the Geneva verse TEXT use getVerse with source=geneva-1599. |
getWords | Original-language text with word-level tagging for a verse, range, or chapter. OT → Hebrew (WLC/OSHB: word, Strong's, morphology; Aramaic verses flagged). NT → Greek (SBLGNT/MorphGNT: word, lemma, morphology, POS). SBLGNT is a critical text, NOT the Textus Receptus behind the KJV; versification follows the original and is never remapped — verses the KJV has but the original lacks are listed in `missing`. |
resolveQuartet | Resolve a fabric address 127.{book}.{chapter}.{verse} to its verse, chapter, or book — or a span like 127.43.3.16-21 / 127.43.3.16-4.2 (max 500 verses, one Merkle root over the span). Identical to what harnessd serves on loopback port 1611. Try local first, fall back here. |
followLinks | Cross references of one verse as fabric addresses, strongest first (OpenBible.info, CC-BY, ranked by reader votes). Each link has the target's 127.b.c.v address and the SHA-256 of its first verse: pass the address to resolveQuartet to walk the thread, and compare hashes to confirm the text. Verse addresses only (last octet above 0). |
The verified flag
For getVerse, getChapter and resolveQuartet the server recomputes each verse's SHA-256 before returning and sets structuredContent.verified. A model can be told, in one line of system prompt, to refuse to quote anything where verified is false. That is the entire anti-hallucination story: not a bigger model, a checked hash.
Prompts that work
- "Quote John 3:16 from the harness and tell me whether it verified."
- "Find every verse in Psalms containing 'shepherd' and list the references."
- "What is at 127.19.23.1? Resolve it and show the text."
- "Give me Romans 8 as a chapter, then summarise it, keeping verse numbers in your summary."
- "Which sources are ingested versus only declared? Do not guess — call listSources."
Hosts
Tested by hand with the stdio transport against JSON-RPC 2.0 messages for initialize, tools/list and tools/call. Any host that speaks MCP over stdio should work. An HTTP/SSE transport is specified but not shipped.