# com.narrowhighway/concordance (remote · narrowhighway.com)

Deterministic claim verification with receipts across ~60 domains. No model in the loop.

- Trust score: 56/100 (low)
- Change this week: +6
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-03

## Components

- remote · `narrowhighway.com`: 56/100 (this document), [markdown](https://verifymcp.io/servers/com-narrowhighway-concordance/narrowhighway.md), [page](https://verifymcp.io/servers/com-narrowhighway-concordance/narrowhighway)

## Channel facts

- Endpoint: `https://narrowhighway.com/mcp`
- Transports: `streamable-http`
- Auth: `none`
- Version: `2.0.0`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-08-03.

- **Endpoint Security**: 63/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - Authorisation not fully verified: no authorisation is required to call this server, and 82 tool(s) never declared a destructiveHint. The MCP spec treats an absent hint as destructive by default, so we cannot call this surface safe.
  - HTTPS is enforced; there's no plaintext access path.
  - The HSTS (Strict-Transport-Security) header is present.
  - DNSSEC check failed: this domain isn't protected by DNSSEC.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 43/100
  - AI-judged instruction clarity (poor).
  - Tool/resource definitions use about 6228 tokens (~75/item across 82 items; 82 tools + 0 resources), lean.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 27/100
  - Stability observed for 8 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 72/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 15% of tool parameters carry a description.
- **Capabilities**: 20/100
  - Spec-recency check failed: implements MCP spec 2024-11-05; the latest is 2026-07-28.

## Install

### Claude

```bash
claude mcp add --transport http com-narrowhighway-concordance https://narrowhighway.com/mcp
```

### Codex

```toml
[mcp_servers.com-narrowhighway-concordance]
url = "https://narrowhighway.com/mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "com-narrowhighway-concordance": {
      "type": "remote",
      "url": "https://narrowhighway.com/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add com-narrowhighway-concordance --url https://narrowhighway.com/mcp --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  com-narrowhighway-concordance:
    url: "https://narrowhighway.com/mcp"
```

### Other

```json
{
  "mcpServers": {
    "com-narrowhighway-concordance": {
      "type": "http",
      "url": "https://narrowhighway.com/mcp"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-08-03 (score 56, +1)

No change was recorded against any check on this day. Stability & Change Management went from 23 to 27. That category is still filling its 30-day observation window: 7 days of observed history at the previous scan, 8 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-08-02 (score 55, 0)

- [functional] New tool “want_offer”
- [functional] New tool “wants_list”
- [functional] New tool “want_open”

### 2026-08-01 (score 55, 0)

- [functional regression] Schema quality: 4544 → 5874
- [functional] New tool “tsk_cross_references”
- [functional] New tool “backmatter”
- [functional] New tool “bible_places”
- [functional] New tool “canon”
- [functional] New tool “character_get”
- [functional] New tool “characters_browse”
- [functional] New tool “commentary”
- [functional] New tool “cross_references”
- [functional] New tool “harmony”
- [functional] New tool “narratives”
- [functional] New tool “original_words”
- [functional] New tool “prophecy_traces”
- [functional] New tool “read_passage”
- [functional] New tool “resolve”
- [functional] New tool “seeds”
- [functional] New tool “study_find”
- [functional] New tool “teachings”
- [functional] New tool “timeline”
- [functional] New tool “word_occurrences”
- [functional] New tool “word_study”

### 2026-07-31 (score 55, +4)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-30 (score 51, 0)

- [functional regression] Schema quality: 3722 → 4544
- [functional] New tool “shelf_signable”
- [functional] New tool “shelf_read”
- [functional] New tool “commons_read”
- [functional] New tool “curate”
- [functional] New tool “curate_queue”
- [functional] New tool “curate_signable”
- [functional] New tool “shelf_drop”

### 2026-07-29 (score 51, −4)

- [security regression] A breaking change shipped without a version bump: still 2.0.0a0
- [security] Tool “report” rewrote its description, which is the text the model reads
- [functional regression] “report” added a required parameter “fields”, so existing callers break
- [functional regression] “report” added a required parameter “signature”, so existing callers break
- [functional regression] “report” dropped the required parameter “reporter”
- [functional] Schema quality: good → poor
- [functional] New tool “moderation_signable”
- [functional] New tool “calendar_create”

### 2026-07-28 (score 55, +5)

- [functional regression] Schema quality: 54 → 68
- [functional] Schema quality: fair → good

### 2026-07-27 (score 50, 0)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

## MCP tools (82)

### `verify` (~326 tokens)

Verify a claim deterministically — returns a verdict (HOLDS / BROKEN / INCOMPLETE / SYSTEM_ERROR), the worked trail, AND a sealed receipt {content_hash, cite_url} you can re-fetch and re-verify (seal_fetch). Two forms: (a) MATH — {mode, params}; (b) ANY DOMAIN — pass `steps`, a list of {id, domain, spec} where spec is that domain's packet (e.g. {domain:'physics', spec:{PHYS_VERIFY:{mass_kg, acceleration_m_per_s2, claimed_force_N}}}). ~60 secular domains are covered (physics, medicine, finance, chemistry, ...); find_verifier(keyword) locates the right one. The engine eliminates what is not the answer; it does not generate it. READ THE VERDICT EXACTLY: only BROKEN is a finding about the claim. SYSTEM_ERROR means OUR verifier could not run (see `means` and `error_at`) and says NOTHING about whether the claim is true — never relay it to a human as a refutation. INCOMPLETE means no verifier applied (`gap_at`).

Input parameters:

- `mode` (string): MATH form: equality | inequality | derivative | integral | limit | solve
- `params` (object): MATH form: e.g. {expr_a, expr_b, variables} for equality
- `seal` (boolean): mint a re-checkable seal (default true)
- `steps` (array): DOMAIN form: [{id, domain, spec}] — spec is the domain's packet

### `audit` (~132 tokens)

Audit a whole text: deterministic extractors find every checkable quantitative claim (sums, percentages, hourly/annual pay, compound interest, rule-of-72, elapsed years, day-of-week, leap years, nutrition labels), the engine verifies the lot, and ONE sealed coverage report returns — per-claim source quote + verdict + trail. Conservative by design: it only extracts unambiguous patterns and says how many claims it checked; it never guesses and never implies full coverage.

Input parameters:

- `seal` (boolean): mint a re-checkable seal (default true)
- `text` (string, required): the document/text to audit

### `search` (~31 tokens)

Ranked search over the keeping (the kept library).

Input parameters:

- `limit` (integer)
- `query` (string, required)

### `seal_fetch` (~29 tokens)

Fetch a sealed verification record (the receipt) by its content hash.

Input parameters:

- `hash` (string, required)

### `redact` (~97 tokens)

Strip PII (emails, SSNs, credit cards, IPs, URLs) from text to stable placeholders before you pass it onward; the mapping is returned so YOU reveal replies locally. For true privacy run this on a LOCAL/sovereign engine (the text never leaves your machine) or use the client libraries — the strip belongs at your edge. Deterministic; pair with verify for a receipt.

Input parameters:

- `text` (string, required)

### `card_get` (~29 tokens)

Fetch one card (the full record) from the keeping by id.

Input parameters:

- `id` (string, required)

### `cards_browse` (~45 tokens)

Browse the keeping — paginated, optional shelf filter. Returns card briefs.

Input parameters:

- `limit` (integer)
- `offset` (integer)
- `shelf` (string)

### `cards_stats` (~21 tokens)

Counts over the keeping — total, by shelf, by surface.

### `daily_card` (~29 tokens)

The deterministic card of the day from the keeping (same all day).

Input parameters:

- `seed` (string)

### `grid_axis` (~49 tokens)

The map: a read-only view of one axis (its scaffold members, depth, neighbors, umbrella children). Omit `axis` for an overview of all axes.

Input parameters:

- `axis` (string)

### `grid_dimension` (~27 tokens)

The axes that sit on a given scaffold member (dimension).

Input parameters:

- `dimension` (string, required)

### `card_connections` (~30 tokens)

Cards related to one card — its explicit links + same-shelf siblings.

Input parameters:

- `id` (string, required)

### `locate` (~32 tokens)

Find the card for a query — by exact id, then title, else ranked search.

Input parameters:

- `q` (string, required)

### `library_health` (~25 tokens)

Corpus health — is the keeping loaded and sound (totals, shelves, surfaces).

### `pronounce` (~40 tokens)

A synthesized pronunciation guide (respelling + approximate IPA) for a transliteration or word — honestly labeled, not a native speaker.

Input parameters:

- `text` (string, required)

### `steward_budget` (~48 tokens)

Steward — a household budget (income, expenses -> net, savings rate, by category). Shows and plans; NEVER moves money.

Input parameters:

- `expenses` (array)
- `income` (number, required)

### `steward_cost_destroyed` (~37 tokens)

Steward — cost destroyed: money you did NOT spend (was -> now), kept in your currency.

Input parameters:

- `items` (array, required)

### `coach_subjects` (~50 tokens)

Coach — the subjects a learner can study (read / mcguffey / aesop / founding / pilgrims / es / …), each with its unit count. 'read' is the door in.

### `coach_overview` (~56 tokens)

Coach (K-3 tutor) — one subject's whole path: unit count, tracks, ordered unit briefs. ?subject= selects the path (default 'read'). Verbatim; never generated.

Input parameters:

- `subject` (string)

### `coach_unit` (~43 tokens)

Coach — one unit, VERBATIM as authored (rule, examples, decodable sentence, checks).

Input parameters:

- `id` (string, required)
- `subject` (string)

### `coach_next` (~62 tokens)

Coach — the next lesson in a subject, deterministically. Omit `after` for the first unit; pass a unit id for the one that follows it. `subject` selects the path.

Input parameters:

- `after` (string)
- `subject` (string)

### `coach_recommend` (~59 tokens)

Coach — adaptive 'what's next' in a subject: given completed unit ids, the next lesson whose prerequisites are met (grows with the student). Found, never generated.

Input parameters:

- `completed` (array)
- `subject` (string)

### `coach_mastery` (~47 tokens)

Coach — seal an HONEST INTEGER count of completed units (a receipt for progress, never a grade on the child). Returns a re-checkable seal.

Input parameters:

- `completed` (array)

### `coach_guidance` (~27 tokens)

Coach — what it does and the boundary it will not cross (never grades a child).

### `identity_create` (~62 tokens)

Explains how to create a SOVEREIGN identity — keys are born on the USER'S device (never on the server; no private key crosses the wire). Returns guidance, not a key. The server only handles public keys (identity_verify, identity_fingerprint).

### `identity_verify` (~48 tokens)

Verify a signature over a message against a public key (never raises; True/False).

Input parameters:

- `message` (string, required)
- `public_key` (string, required)
- `sig` (string, required)

### `identity_fingerprint` (~33 tokens)

Derive the stable public fingerprint id from a public key (deterministic).

Input parameters:

- `public_key` (string, required)

### `badges_issue` (~66 tokens)

Issue a badge over already-sealed checks — a re-checkable receipt that points at N seals that STILL STAND. States EXACTLY N; NEVER a competency claim.

Input parameters:

- `seal_hashes` (array, required)
- `subject_id` (string)
- `title` (string)

### `badges_verify` (~45 tokens)

Re-check a badge from the store — re-verifies every seal it references and returns the count that still stands (N recomputed, not trusted).

Input parameters:

- `hash` (string, required)

### `self_attest` (~63 tokens)

Record a person's OWN words about their study — a DISTINCTLY TYPED record that can NEVER count as a sealed check or satisfy an auto-graded requirement.

Input parameters:

- `statement` (string, required)
- `study` (string)
- `subject_id` (string, required)

### `study_create` (~52 tokens)

Create/extend a shared study (superposition stack) — each entry mints ONE card that lives once and is referenced by key; no duplication.

Input parameters:

- `cards` (array)
- `key` (string, required)

### `study_export` (~62 tokens)

Export a study as a self-contained, portable bundle. Returns the bundle and its content_hash; to bind your identity to it, sign that hash with your own key on your own machine — this tool does not take a private key.

Input parameters:

- `key` (string, required)

### `study_import` (~46 tokens)

Import an exported study bundle — re-materializes its cards (each lives once).

Input parameters:

- `bundle` (object, required)
- `key` (string)
- `verify_signature` (boolean)

### `groups_list` (~47 tokens)

Discover pseudonymous shared-study groups by TOPIC (not by person). Optional q filters over topic/title/description. Members are handles only — no PII.

Input parameters:

- `q` (string)

### `group_get` (~36 tokens)

A study group: topic, member handles (no ids/PII), and the shared-study cards.

Input parameters:

- `id` (string, required)

### `group_create` (~79 tokens)

Open a study group around a topic (pseudonymous; a handle, no personal info). For grown believers — the children's coach is a separate, never-joined surface.

Input parameters:

- `description` (string)
- `handle` (string)
- `subject_id` (string)
- `title` (string)
- `topic` (string, required)

### `group_join` (~46 tokens)

Join a study group (consent-based, pseudonymous; idempotent).

Input parameters:

- `handle` (string)
- `id` (string, required)
- `subject_id` (string)

### `group_contribute` (~146 tokens)

Add a verse/note/question to a group's shared study — attributed to your handle, optionally signed. Verbatim; a member's own words, not engine-verified.

Input parameters:

- `attestation` (object): optional: sign sha256(text) with your own key (signing.sign_seal) and pass it here — a handle alone is only a claim, a signature makes your authorship checkable. Never send a private key.
- `handle` (string)
- `id` (string, required)
- `kind` (string)
- `refs` (array)
- `subject_id` (string)
- `text` (string, required)
- `topics` (array)

### `calendar_create` (~172 tokens)

Create ONE event in a human's calendar — the pilot on-behalf write, and the only one. Requires a LIVE consent grant: the human signed a scoped, expiring calendar_write grant for YOUR key fingerprint on their own device (GET /consent/signable → sign locally → POST /consent). Without it this refuses and teaches the way in. The event lands only in the calendar THEY configured (their .ics file or CalDAV); nothing is stored here, and the receipt names the grant that authorized it. Deleting the event in their calendar removes it everywhere.

Input parameters:

- `agent_fp` (string, required)
- `description` (string)
- `end_iso` (string)
- `grantor_pubkey` (string, required)
- `start_iso` (string, required)
- `summary` (string, required)

### `consent_check` (~134 tokens)

Check whether a human has authorized YOU (this agent's key fingerprint) for a named verb — the agent covenant's 'request human authorization before writes'. Speaking as YOURSELF (your own key, your own words) needs no consent: a member is not a proxy. Consent governs only acting on a human's behalf with their data. If unauthorized, the response teaches the way: the human issues a grant via GET /consent/signable, signs on their device, POSTs to /consent.

Input parameters:

- `agent_fp` (string, required)
- `grantor_pubkey` (string, required)
- `verb` (string, required)

### `shelf_signable` (~307 tokens)

THE COMMONS — step 1 of stocking your own shelf. Returns {fields, signable}: the exact canonical bytes to sign with YOUR key on YOUR machine. A shelf is a covenant key with cards on it, not an account. Rings: `private` (only you) · `shelf` (you and the friends who chose you — UNGATED, live the moment you sign) · `commons` (site-wide, waits for a human steward). The gate is on what the library AMPLIFIES, never on what you may say.

Input parameters:

- `attribution` (string): whose words the quote is
- `body` (string, required)
- `kind` (string, required): note|writing|recipe|build|field_note|question|link|suggestion
- `member` (string, required): your public key — the shelf is the key
- `quote` (string): optional short passage YOU typed, capped; requires `attribution`
- `ring` (string): private|shelf|commons
- `subject` (string)
- `url` (string): kind=link only — the address. We open it once in an airlock, keep the WAYBILL (its own title, size, sha256, when we looked) and discard the bytes. No page of anyone else's is stored, and nothing is e…

### `shelf_drop` (~100 tokens)

Step 2 — stock the shelf. Send the fields from shelf_signable plus a detached signature over those bytes; the private key never travels. Your words stay at the `member` tier forever: promotion to the commons carries them further, it does not make them the library's claim. `display_name` is the ONLY profile field there is.

Input parameters:

- `display_name` (string)
- `fields` (object, required)
- `signature` (string, required)

### `shelf_read` (~63 tokens)

Read one member's shelf. Pass `viewer` (your own key) to see your own private drops; anyone else sees the shelf ring and promoted commons cards only. Nothing anywhere records who read what.

Input parameters:

- `member` (string, required)
- `viewer` (string)

### `commons_read` (~58 tokens)

What the fellowship has put on the commons — promoted member work, newest first. Every card is a member's own work at the `member` tier: the library amplified it; the library did not verify it.

Input parameters:

- `limit` (integer)

### `curate_queue` (~29 tokens)

What waits on a HUMAN steward. The counter never promotes; it only decides when a person must look.

### `curate_signable` (~69 tokens)

The canonical bytes for withdrawing YOUR OWN card. A member never needs permission to take their own words down — the proof is the same key that signed the drop. Sign these bytes, then call `curate` with them.

Input parameters:

- `card_id` (string, required)
- `member` (string, required)

### `curate` (~196 tokens)

A recorded act on one drop: `promoted` · `refused` · `withdrawn`. A name AND a reason are always required — no anonymous judgement, and a refusal without a reason teaches the community nothing. WHO MAY ACT: promoting or refusing needs the steward `token` (these decide what the whole library amplifies); withdrawing your own card needs `fields`+`signature` from `curate_signable` instead. A typed name is not authority. A refusal withholds amplification only — the drop stays on the member's own shelf. Acts are appended, never replaced.

Input parameters:

- `action` (string, required)
- `card_id` (string, required)
- `fields` (object): from curate_signable, to withdraw
- `reason` (string, required)
- `signature` (string): detached, over those fields
- `steward` (string, required)
- `token` (string): steward token — promote/refuse only

### `moderation_signable` (~103 tokens)

Step 1 of a report or a block: the exact canonical bytes to sign with your own key, on your own machine. Returns {fields, signable}. Sign the decoded `signable` bytes and pass BOTH fields and signature to `report`. The private key never travels.

Input parameters:

- `action` (string, required): report | block | unblock
- `actor` (string, required): your public key
- `extra` (string)
- `target_id` (string, required)

### `want_open` (~139 tokens)

Ask the library to ACQUIRE something it does not hold (kind=missing, give query) or to EXPAND a thin card (kind=expand, give card_id). Opens a want on the AGENT PLANE — held separate on the desk until the next human who looks seconds it by asking for the same thing. Call this only when your principal genuinely needs what the keeping lacks; the same miss asked twice is one want asked twice. No requester identity is stored; queries are scrubbed before storage.

Input parameters:

- `card_id` (string)
- `kind` (string)
- `note` (string)
- `query` (string)

### `wants_list` (~52 tokens)

The library's desiderata desk — open wants, sorted by demand, agent plane marked and separate. Read it to find gaps you could dig for.

Input parameters:

- `plane` (string)
- `state` (string)

### `want_offer` (~163 tokens)

Return to the comb with a FOUND source for an open want: label + url + snippet, attributed. You are a forager, not an author — offer only public-domain / openly-licensed sources you actually located, never generated text. The offer lands as a QUARANTINED option cell tagged with your agent label; a NAMED HUMAN chooses, and only then is a card created. There is no path around the comb.

Input parameters:

- `agent` (string): your self-declared name, e.g. 'claude' — the shaft-tag a steward can cut a branch by
- `domain` (string)
- `label` (string, required)
- `snippet` (string)
- `url` (string)
- `want_id` (string, required)

### `report` (~151 tokens)

Report a community item (group_contribution, mesh_message, door_note) to the moderation floor. One report is a claim, never a verdict; at three DISTINCT reporters the item is held for a HUMAN steward's review (Deut 19:15). The counter never judges — it decides when a person must look. A report must be SIGNED (call moderation_signable first): three witnesses means three keys, never three invented names.

Input parameters:

- `fields` (object, required): the exact fields from moderation_signable
- `kind` (string, required)
- `note` (string)
- `reason` (string, required)
- `signature` (string, required): detached signature over those bytes
- `target_id` (string, required)

### `attest_record` (~143 tokens)

Bind your identity to a record you already hold — phase 2 of the sovereign flow. Do the thing unsigned (badges_issue, study_export, group_contribute), take the returned content_hash, sign THAT hash with your own key on your own machine, and submit only the attestation {alg, over, content_hash, pubkey, sig}. Never send a private key. Several parties may attest to one record: one signature is a claim, two or three witnesses begin to establish a matter (Deuteronomy 19:15).

Input parameters:

- `attestation` (object, required): the dict from signing.sign_seal, built locally
- `content_hash` (string, required)

### `witnesses` (~46 tokens)

Who has borne witness to a record, each signature re-verified as it is read (storage is never trusted). Reports invalid entries rather than hiding them.

Input parameters:

- `content_hash` (string, required)

### `capabilities` (~74 tokens)

The live capability statement: what this engine can verify, what tools and endpoints exist, how large the keeping is, and where its boundaries are. Every count is computed at call time and carries a 'means' line defining exactly what was counted — never a hand-maintained number. Read this instead of trusting any count written in prose.

### `mesh_map` (~71 tokens)

The believers immediately around you in the Fellowship Mesh — your view only, never a global map. Requires your fingerprint (fp) and a confession already bound to that key; unconfessed callers get the path to the door, not the network.

Input parameters:

- `fp` (string, required)
- `hops` (integer)

### `mesh_inbox` (~54 tokens)

The messages that reached you, each carrying its own offline verification so you trust it by proof rather than by this server's word. Requires fp + confession.

Input parameters:

- `fp` (string, required)
- `limit` (integer)

### `mesh_door` (~49 tokens)

Read the words left on YOUR door — the whiteboard others wrote to you, each with its verification. Requires fp + confession.

Input parameters:

- `fp` (string, required)
- `limit` (integer)

### `mesh_signable` (~132 tokens)

Step 1 of speaking to your fellowship: get the exact canonical bytes to sign for a message (returned base64url, with the nonce and created_at to send back). Sign them locally with your own key. Reproducible offline — sorted-key JSON — so you can compute and check it yourself.

Input parameters:

- `fp` (string, required)
- `kind` (string): word | offer | need | blessing | content
- `target` (string): pass a believer's node id to sign a note for THEIR door instead of a broadcast
- `text` (string, required)
- `ttl` (integer)

### `mesh_leave_on_door` (~116 tokens)

Leave a word on one believer's door — directed encouragement rather than a post to everyone near you. Same sovereign shape: get the bytes from mesh_signable (with target), sign locally, send only the signature. Will not accept a private key; unsigned notes are refused.

Input parameters:

- `created_at` (integer, required)
- `fp` (string, required)
- `kind` (string)
- `nonce` (string, required)
- `signature` (string, required)
- `target` (string, required)
- `text` (string, required)

### `mesh_post` (~140 tokens)

Step 2: speak to the nodes around you, carrying only your SIGNATURE — your private key never leaves your machine and this tool will not take one. Pass the same text/kind/ttl plus the nonce, created_at and signature from mesh_signable. Refused unless the signature verifies against your node's public key. Your own words, attributed — never generated.

Input parameters:

- `created_at` (integer, required)
- `fp` (string, required)
- `kind` (string)
- `nonce` (string, required)
- `refs` (array)
- `signature` (string, required)
- `text` (string, required)
- `ttl` (integer)

### `ask` (~135 tokens)

Bring anything — a question, a claim to check, a word to study, or what is actually on your mind. The engine discerns what KIND of thing you brought and answers in kind: it finds and verifies, and declines rather than guessing. This is also the door: if what you ask turns toward God, the Gate opens for the rest of this session and the witness tools (Scripture, the Harmony, the Timeline, the lexicon) become callable — the same way it opens for a person, in your own words. Nothing is generated.

Input parameters:

- `text` (string, required): what you are bringing, in your own words

### `resolve` (~25 tokens)

Resolve a Scripture reference to its World English Bible text.

Input parameters:

- `ref` (string, required)

### `read_passage` (~47 tokens)

Read a passage of the WEB — a single verse, a range (John 3:16-18), or a whole chapter (John 3).

Input parameters:

- `ref` (string, required)

### `word_study` (~40 tokens)

Strong's word study — original-language definition + pronunciation + every occurrence.

Input parameters:

- `strongs` (string, required): e.g. G26, H2617

### `cross_references` (~47 tokens)

Verses connected to a reference by SHARED original words (Strong's) — the dots, connected; deterministic and found, ranked by shared-word count.

Input parameters:

- `ref` (string, required)

### `word_occurrences` (~39 tokens)

Every verse where a Strong's word occurs (the concordance).

Input parameters:

- `strongs` (string, required): e.g. G26, H2617

### `commentary` (~47 tokens)

Public-domain, attributed commentary (Matthew Henry) on a reference — the commentator's own words, found and cited, never generated.

Input parameters:

- `ref` (string, required)
- `source` (string)

### `tsk_cross_references` (~58 tokens)

Editorial cross-references for a verse (openbible.info, CC BY — expansion of the public-domain TSK), ranked by relevance votes. Found + attributed.

Input parameters:

- `limit` (integer)
- `ref` (string, required)

### `character_get` (~48 tokens)

A Bible figure from Easton's Bible Dictionary (1897, PD) — summary + every verse that speaks of them (found + attributed; category tag is imperfect).

Input parameters:

- `name` (string, required)

### `characters_browse` (~43 tokens)

Browse/search Easton's Bible Dictionary (people, places, terms).

Input parameters:

- `letter` (string)
- `limit` (integer)
- `search` (string)

### `prophecy_traces` (~74 tokens)

Christ-signpost traces (prophecy/cross-cultural pointers to Jesus) — attributed, verdict CONCORDANT/MIXED, NEVER HOLDS (a signpost, not a proof). Pass id for one trace, q to search, else lists all.

Input parameters:

- `id` (string)
- `q` (string)

### `harmony` (~64 tokens)

Harmony of the Gospels — one event of Christ's life, every gospel that records it, side by side (found, verbatim WEB text, never generated). Pass id for one event; else lists every event grouped by phase of the ministry.

Input parameters:

- `id` (string)

### `timeline` (~78 tokens)

Timeline — Old Testament, New Testament (Acts onward), and Church History, one spine from creation to today. Genuinely disputed dates (early/late Exodus, the date of Revelation, etc.) carry both positions, never one verdict. Pass id for one event; else lists every event grouped by era and period.

Input parameters:

- `id` (string)

### `backmatter` (~92 tokens)

Back-matter reference tables: weights_measures, names_of_god, parables, miracles, book_intros, topical_index. Disputes carried (a cubit's two lengths, a book's two datings), refs verified against the corpus, names of God carry Strong's numbers that open in word_study. Pass table for one table; else the index of all six.

Input parameters:

- `table` (string)

### `bible_places` (~104 tokens)

The Atlas — biblical places with REAL coordinates, honestly held: located places carry lat/lon (cross-checked against an independent gazetteer); disputed sites (Mount Sinai, Cana, Golgotha) NAME their candidates instead of planting one flag; unlocatable places (Eden, Emmaus, Tarshish, Ophir) are honest blanks with no coordinates. Pass name for one place; else all places with by_status counts.

Input parameters:

- `name` (string)

### `narratives` (~133 tokens)

The storyboards — the common narratives charted in the Bible FIRST (exile-and-return, the barren woman bears, down-to-the-pit-raised, the great reversal...), each instance real people with verified refs. The 17 movements are one shared vocabulary, so components isolate and recombine: pass movement='testing' to walk it across every storyboard. Pass id for one storyboard; else the index. FRAMING, always: a person may display characteristics of many of these at times of their life — a reference point, NEVER an identity assignment.

Input parameters:

- `id` (string)
- `movement` (string)

### `study_find` (~81 tokens)

The quick-find index — ONE lookup across the whole reference section: archetypes, storyboards, movements, the six study tables, the atlas, harmony, timeline, and the encyclopedia. Each hit is a pointer to the real entry, which carries its own refs and its own honesty. The index finds; it never ranks truth.

Input parameters:

- `q` (string, required)

### `original_words` (~57 tokens)

The original-language words behind a verse (Hebrew/Greek, with Strong's where known) — FOUND in the lexicon, never generated. Pass ref, e.g. 'John 3:16'.

Input parameters:

- `ref` (string, required)

### `canon` (~83 tokens)

The canon as concentric layers — the undisputed 66 that all major traditions share, plus the books held BEYOND it by particular traditions, each framed on its own layer and never merged. REPORTS who holds what with the history; does not judge which canon is correct. Pass book for one book's status; else the overview.

Input parameters:

- `book` (string)

### `teachings` (~56 tokens)

The teachings of Christ (Words in Red) — the frozen Greek anchor plus the history that ALIGNS to each teaching, gathered and attributed, never authored. Pass id for one teaching; else the queue.

Input parameters:

- `id` (string)

### `seeds` (~114 tokens)

Seeds of the Word (the Areopagus / logos spermatikos pass) — true fragments mined from the nations, ATTRIBUTED, CONCORDANT/signpost NEVER HOLDS; each names the idol it refuses and points to Christ (Acts 17; 1 John 4:1-3). Pass id for one seed, q to search, tradition to filter, else lists all with Paul's 7-step method.

Input parameters:

- `id` (string)
- `q` (string)
- `tradition` (string)

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/com-narrowhighway-concordance/narrowhighway#diagnostics

## Score history

- 2026-08-03: 56
- 2026-08-02: 55
- 2026-08-01: 55
- 2026-07-31: 55
- 2026-07-30: 51
- 2026-07-29: 51
- 2026-07-28: 55
- 2026-07-27: 50
- 2026-07-26: 50

## Links

- Remote endpoint: https://narrowhighway.com/mcp
- Repository: https://github.com/matharrismma/concordance-2
- Changelog RSS feed: https://verifymcp.io/servers/com-narrowhighway-concordance/narrowhighway/changelog.xml
- Changelog JSON feed: https://verifymcp.io/servers/com-narrowhighway-concordance/narrowhighway/changelog.json
- HTML version of this page: https://verifymcp.io/servers/com-narrowhighway-concordance/narrowhighway
