Skip to main content
Glama
getbible

GetBible MCP

Official
by getbible

GetBible MCP

test PyPI License: GPL v2+

Project and API documentation: getBible.net · MCP usage guide: getBible.net/mcp.

Read-only Model Context Protocol access to all nine GetBible API contracts over both standard MCP transports:

  • Streamable HTTP at the official endpoint https://mcp.getbible.net/, or another host's MCP URL

  • stdio for developers who install the package and let an AI client launch it locally

Both transports expose exactly the same tools, resources, prompts, validation, and scripture-cache integrity rules. Scripture tools default to upstream v3; select api_version: "v2" explicitly for upstream v2. Dictionary, commentary and bookmark operations use v1.

Connect to the official endpoint

GetBible's official MCP endpoint is https://mcp.getbible.net/. Add that exact URL to your AI application's remote MCP connections and select Streamable HTTP. The domain root is the protocol endpoint; do not append /mcp or an API version. The MCP usage page explains how to connect and use the service.

One connection provides Bible retrieval, reference lookup, full-text search, dictionaries, commentaries and public bookmarks across all supported API versions. Your client can discover tools, read the complete API contracts and use the integration-planning prompt. All operations are read-only; select upstream versions through tool arguments.

Public access is free and needs no account or token. It uses the same default anonymous traffic limits as GetBible search. Excess traffic receives HTTP 429; honor Retry-After and reduce your request rate. To request a token for MCP or another GetBible endpoint, contact the GetBible administrators. See the access policy for limits and client guide for connection and token instructions.

You can also connect to a privately operated instance using the URL supplied by its operator. The Python library supports configurable endpoint URLs and local stdio clients.

For ChatGPT and Codex, the plugin package includes GetBible branding and the official connection configuration. The publishing handoff contains listing text, client tests and the steps for the person submitting it. The package is prepared for review; this repository does not claim that the public directory listing is already approved.

For definitions and study material, follow the dictionary and commentary guide. It explains module discovery, entry identifiers, related entries, introductions and verse ranges.

Related MCP server: Bible MCP Server

API coverage

Service

Versions

Capabilities

Upstream contracts

api

v2, v3

Translation, book and chapter data; catalogs; checksums; v2 text indexes

v2, v3

query

v2, v3

Resolve individual, ranged and grouped scripture references

v2, v3

search

v2, v3

Full-text search, filters, ranking, pagination and reference lookup; GET and read-only POST

v2, v3

dictionaries

v1

Catalogs, metadata, word indexes, definitions, Strong's entries and checksums

v1

commentaries

v1

Catalogs, metadata, book/chapter commentary, introductions and checksums

v1

bookmarks

v1

Public topics, verse associations, localized names and checksums

v1

The package includes the complete upstream OpenAPI documents. Agents can discover services, inspect an operation's exact parameters and response schemas, then execute that operation. This covers the whole API surface without requiring a separate MCP tool for every HTTP route. Native upstream JSON is preserved, including v3 verse tokens, spans, paragraph markers and additional fields.

What the two transports mean

Transport

Who runs the server?

How a client connects

Best use

Streamable HTTP

GetBible or another service operator

https://mcp.getbible.net/ or the operator's MCP URL

Remote MCP clients

stdio

The developer installs this package locally

Client launches getbible-mcp --transport stdio

Desktop tools, private environments, local process control

stdio does not create a public endpoint. The MCP host starts the command as a child process and exchanges JSON-RPC messages over standard input and output. That local process still reads scripture from the public GetBible API.

Streamable HTTP connects to a remote MCP service using the same package and tool contract. The host chooses its endpoint path, including / or a named path such as /mcp. Use the supplied URL exactly; upstream API versions remain tool arguments.

Public API access and translation rights

Public access requires no account or token by default. Traffic limits, HTTP errors and upstream availability still apply; an integration must handle them instead of assuming every request succeeds. Administrators issue tokens for approved access to individual endpoints.

Use the translation catalog for copyright and rich translation metadata; query/search and chapter results carry compact metadata. Preserve and honor each translation's rights, and each study module's provenance and license. This repository's GPL license applies to the MCP software and does not relicense upstream content.

Correct API use is conditioned on honoring the hash-validation cycle described below. An integration that keeps cached scripture without revalidating its hashes is not complying with the GetBible API usage agreement.

MCP capabilities

Tools

Tool

Purpose

list_translations

Discover translations, copyright information, metadata, scope, and catalog hashes.

list_books

Discover numbered and localized book names and hashes.

list_chapters

Discover chapters and chapter hashes.

get_scripture

Retrieve a complete translation, book, or chapter with a consistency-checked hash.

query_verses

Resolve selected/grouped verses, retaining native version-specific data.

search_verses

Search scripture with the upstream filters and pagination.

search_dictionary_entries

Find a bounded page of dictionary entry IDs by key, alias or index search text; fetch definitions through the documented entry operation.

get_hash

Read one translation, book, or chapter .sha value.

get_hash_manifest

Read bulk checksum data for scheduled cache sweeps.

check_for_updates

Compare stored hashes and receive exact invalidation actions.

discover_apis

Discover services, supported versions and authoritative contracts.

describe_api_operation

List operations or inspect exact inputs, outputs and documented errors.

call_api_operation

Execute any operation in the supported contracts, including text, checksums and read-only search POST.

All tools are read-only, non-destructive, and idempotent. Scripture tools default to api_version: "v3"; use "v2" explicitly for v2 data. Generic operation tools require a service and version, because operation IDs and parameter names differ across contracts. HTTP POST search is a read operation and does not change server data.

For check_for_updates, specify api_version in each watched item so one batch can safely check several versions.

Resources

  • getbible://docs/api — complete integration guide

  • getbible://docs/cache-policy

  • getbible://docs/usage-policy

  • getbible://docs/study-workflows — dictionary entries, relationships and commentary coverage

  • getbible://openapi/{service}/{version} — complete contracts, for example getbible://openapi/search/v3

Prompt

  • design_getbible_integration

Mandatory scripture-cache integrity

The MCP server keeps no upstream result cache and recommends using query and search results directly. A downstream application choosing to cache an eligible response must:

  1. Include service, API version and all request inputs in the cache key; retain source HTTP freshness.

  2. Never retain data beyond 30 days (2,592,000 seconds); honor shorter HTTP freshness, Age, Expires, no-cache and no-store. An unchanged hash does not grant an indefinite lifetime.

  3. Invalidate the changed scope and every cached descendant.

  4. Validate the published checksum where available and fetch replacements into temporary storage.

  5. Atomically replace the stale record.

get_scripture checks the matching .sha value before and after retrieving JSON. If a build changes mid-request, it retries once instead of returning mismatched data and hash. Scripture .sha files contain SHA-1 values; dictionary, commentary and bookmark manifests use SHA-256. Query results have no chapter-hash envelope. Search query.sha describes the source translation, not the result payload. Query/search TTL comes from HTTP headers, not a promised JSON field.

See site/v2/cache-policy.md.

Quick local stdio setup

Clone the repository and build an isolated environment:

git clone https://github.com/getbible/mcp.git getbible-mcp
cd getbible-mcp
python3 -m venv .venv
.venv/bin/python -m pip install --upgrade pip
.venv/bin/python -m pip install -r requirements.txt
.venv/bin/python -m pip install --no-deps .

Configure the MCP client with the absolute executable path:

{
  "mcpServers": {
    "getbible": {
      "command": "/absolute/path/getbible-mcp/.venv/bin/getbible-mcp",
      "args": ["--transport", "stdio"]
    }
  }
}

Do not wrap or embed Python inside a shell configuration. The client launches the installed Python entry point directly.

See docs/CLIENTS.md for stdio, remote, and Inspector examples.

Python, JavaScript and PHP applications can connect to the same MCP endpoint using a compatible client. This project ships one Python server package; npm/Composer server packages are not required. Ordinary applications can also call the existing REST endpoints directly. The MCP endpoint uses versioned JSON-RPC discovery and tool requests. The documentation under site/v2/ describes MCP package 2.x and covers every supported upstream API version.

Python library interface

getbible_mcp.create_app(settings=None, api_client=None, *, path="/mcp") returns a standalone ASGI application. getbible_mcp.create_runtime(..., streamable_http_path="/mcp") returns the application, MCP server, client and settings for consumers needing the individual components. Importing the package does not create a default client or server.

The factory default is /mcp; the host can select / or another supported exact path. Clients use the complete endpoint URL published by that host, without appending an API version or assuming a suffix.

The embedding application owns the ASGI lifespan. If mounting the returned application in a parent, the parent must enter the child's app.router.lifespan_context(app) so MCP startup and HTTP client cleanup run correctly. See architecture for package boundaries and configuration for settings. API infrastructure setup is outside this package.

Downloadable packages, TestPyPI, and PyPI

Every successful test workflow run builds and smoke-tests one wheel and one source distribution. GitHub keeps them for 30 days in the run's Artifacts section under the name python-package-distributions. This includes runs started manually from Actions → test → Run workflow, so a package can be downloaded and tested without publishing anything.

The separate publish-testpypi workflow is manually triggered and publishes validated artifacts to TestPyPI. Production publishing runs only after a pull request is merged into main. GitHub must confirm that the triggering commit is that PR's final merge commit before the workflow validates and publishes the package and creates its GitHub tag/release. Open pull requests, direct pushes and manual dispatch cannot publish to production. Retry an incomplete release by rerunning its original post-merge workflow; matching existing PyPI files are not uploaded again.

TestPyPI uses Trusted Publishing. Production PyPI reads the project or account token only from the PYPI_MCP_TOKEN GitHub Actions secret in the protected pypi environment. See docs/PUBLISHING.md for the download, TestPyPI, secret setup, and production release procedures.

sync-openapi checks all nine upstream contracts daily and on demand. Changed contracts receive a coordinated patch-version bump and full validation before the workflow creates or updates one pull request. Review and merge that PR to release the update automatically. Unchanged contracts do nothing. The generic tools gain newly described API operations and schemas from the contracts; unsupported semantics fail validation and require a reviewed implementation change. The workflow does not auto-merge or rewrite curated convenience tools.

Development

python3 -m venv .venv
.venv/bin/python -m pip install -r requirements-dev.txt
.venv/bin/python -m pip install --no-deps -e .
chmod +x scripts/check
./scripts/check

The suite covers all bundled contracts, request validation and serialization, version-preserving responses, HTTP freshness, hash-consistent reads, MCP schema discovery, both transports, static documents, CLI behavior and release packaging. Tests use local fixtures and mock HTTP transports.

To test the official service explicitly, run .venv/bin/python scripts/check_endpoint.py. Add --upstreams to perform representative read-only requests across all nine API contracts, and --expect-version 2.1.1 when checking this release after deployment. The probe bounds requests, response sizes and timeouts; it never runs automatically in CI. A successful health response alone does not establish that API lookups work. See client testing.

Repository layout

src/getbible_mcp/       Python MCP implementation
site/                   Guides and all nine exact OpenAPI snapshots
docs/                   Package architecture, clients, configuration and publishing
tests/                  Unit and protocol integration tests

Documentation

Versioning

Package release 2.0.2 uses the stable official Python MCP SDK 2.2.0 and a host-selected HTTP endpoint. Package versions and upstream API versions are independent. Scripture tools default to v3; v2 remains fully available through explicit version selection. Never mix upstream v2 and v3 payloads under one cache key.

The nine packaged contracts and static snapshots are reviewed release inputs. Use .venv/bin/python scripts/refresh_contracts.py --check to check upstream drift, or --write to refresh the packaged and static copies together. Run the full checks before committing an API contract update. Do not handwrite reduced OpenAPI substitutes. The nine files under site/contracts/ are the complete static API catalog.

License

The GetBible MCP software is licensed under the GNU General Public License, version 2 or later. Scripture translations remain governed by the copyright information returned for each translation; the software license does not relicense scripture content.

Available Tools

13 tools
call_api_operationCall a documented GetBible operationA
Read-onlyIdempotent

Execute any operation discovered with describe_api_operation using its exact input schema.

Only reviewed routes and read-only methods are accepted. parameters holds named path/query inputs; body is only for documented search POST JSON. Native JSON/text is returned in data, with source/status/headers and cache advice. Redirects are reported without following them.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyNo
serviceYes
parametersNo
api_versionYes
operation_idYes

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnly/idempotent annotations, the description adds concrete behavior: response envelope with data/source/status/headers/cache advice, and redirects being reported without following them. No annotation contradiction exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is four focused sentences: purpose first, then constraints, then response behavior. Every sentence earns its place and there is no filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having no output schema and no schema descriptions, the description provides a complete enough picture for invocation: how to discover operations, what input containers to use, what response shape to expect, and how redirects are handled. The readOnly/idempotent annotations cover the safety profile.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 0% parameter description coverage, so the description must compensate. It clarifies that parameters holds named path/query inputs and body is only for documented search POST JSON, and it ties operation_id to discovery. However, it does not explain the semantics of service or api_version beyond what the enums show, leaving notable gaps.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Execute any operation discovered with describe_api_operation using its exact input schema.' This clearly differentiates the tool from the discovery-oriented siblings describe_api_operation and discover_apis.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context: use this only for operations discovered via describe_api_operation, only reviewed routes and read-only methods, and body only for documented search POST JSON. It does not explicitly name sibling tools as alternatives, but the constraints are strong enough to guide correct routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

check_for_updatesCheck cached scopes for updatesB
Read-onlyIdempotent

Compare stored Bible hashes, each pinned to its own API version. This does not renew TTL.

ParametersJSON Schema
NameRequiredDescriptionDefault
itemsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
policyYes
resultsYes
checked_atYes
changed_countYes
unchanged_countYes

TDQS

B3.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint false, so the safety profile is covered. The description adds genuinely useful behavioral context beyond annotations: hashes are pinned to API versions and TTL is not renewed. This is meaningful extra information for an agent deciding whether to call the tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two short sentences with no filler. The core operation is front-loaded, and the important TTL caveat is given its own sentence. Every word contributes.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description plus schema covers the input shape and the non-renewal of TTL, but it lacks guidance on what 'compare' returns or how this tool relates to hash-related siblings. Given the nested HashWatch schema and the presence of an output schema, this is adequate but not complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description only vaguely refers to 'stored Bible hashes, each pinned to its own API version.' It hints at the api_version and current_hash relationship but does not explain the items array, kind, translation, book, or chapter fields, leaving the agent without enough semantic grounding for the required input.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Compare') and names the resource ('stored Bible hashes'), and the title clarifies that this is about checking cached scopes for updates. It does not explicitly differentiate from sibling tools such as get_hash or get_hash_manifest, so it falls just short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives like get_hash_manifest or get_hash. The only caveat, 'This does not renew TTL,' is an exclusion but not a usage direction.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

describe_api_operationDescribe GetBible API operationsA
Read-onlyIdempotent

List operations, or inspect one exact input schema, response schema and parameter meanings.

Use the returned input_schema for call_api_operation. Names are scoped by service/version.

ParametersJSON Schema
NameRequiredDescriptionDefault
serviceYes
api_versionYes
operation_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint false, so safety is covered. The description adds helpful context about service/version scoping and the call_api_operation relationship, but no deeper behavior such as pagination, auth, or error handling is disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, each earning its place: the primary action, the follow-up workflow, and the scoping constraint. No redundant boilerplate; key information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only introspection tool with a rich output schema and safety annotations, the description is sufficient to invoke correctly. The required service and api_version are visible in the schema, operation_id's optional list-vs-inspect behavior is implied, and the returned schema's use is explained.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description carries the burden. It compensates by implying operation_id null lists operations while a value inspects one exact operation, and it clarifies that names are scoped by service/version. It stops short of explaining each enum's meaning, so it's not a 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a concrete verb and object: 'List operations, or inspect one exact input schema, response schema and parameter meanings.' This clearly differentiates the tool's introspection role from downstream execution via call_api_operation, and the service/version scoping is stated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly connects the returned input_schema to call_api_operation, telling the agent what to do with the output. It does not name alternatives like discover_apis or spell out when not to use this tool, but the workflow context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

discover_apisDiscover GetBible APIsA
Read-onlyIdempotent

Discover supported service/version contracts and their OpenAPI resources. Start here.

ParametersJSON Schema
NameRequiredDescriptionDefault
serviceNo
api_versionNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds no additional behavioral context such as pagination, rate limits, or filtering semantics, but it also does not contradict the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two short sentences, front-loaded with the tool's purpose, and contains no filler. 'Start here' earns its place by giving workflow context without bloating the description.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only, optional-parameter discovery tool with an output schema, the description is nearly complete. It identifies the tool's role, positions it as an entry point, and the annotations cover safety. The main omission is a brief note on how service and api_version filter the discovery result, though the schema enum values partially compensate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description should carry the burden of explaining the optional service and api_version parameters, but it only vaguely references 'service/version contracts' without clarifying that these are filters, their defaults, or how null values behave. The schema's enum values are helpful, but the description does not compensate for the lack of parameter documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific resource ('supported service/version contracts and their OpenAPI resources') and a clear entry-point verb ('Discover'). It is clearly distinguished from siblings like call_api_operation or get_scripture by positioning this tool as metadata discovery rather than data access or operation execution.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Start here' gives an explicit usage instruction: this tool is the intended first step in the workflow. It does not name alternatives or exclusions, but the entry-point context is clear enough for an agent to select it before more specific sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_hashGet one scope hashB
Read-onlyIdempotent

Fetch a Bible SHA-1 sidecar. A changed scope invalidates its cached descendants.

ParametersJSON Schema
NameRequiredDescriptionDefault
bookNo
kindYes
chapterNo
api_versionNov3
translationYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
hashYes
cacheNo
scopeYes
sourceYes
meaningNo

TDQS

B3.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds value by explaining that a changed scope invalidates cached descendants, which is a behavioral consequence beyond what annotations provide. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with the core action and a key consequence. No filler, every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite the output schema covering return format, the 5 parameters (2 required) are completely undocumented. An agent cannot correctly determine how to construct a valid request without additional knowledge. The description is far too sparse for a tool with this parameter complexity and no schema descriptions.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the description provides zero explanation of the parameters. It doesn't clarify what 'kind', 'translation', 'book', 'chapter', or 'api_version' mean, how they relate, or which combinations are valid. The description fails entirely to compensate for the schema's lack of descriptive text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Fetch) and resource (Bible SHA-1 sidecar), and adds invalidation semantics. It is clear what the tool does, though it doesn't explicitly contrast with the sibling get_hash_manifest, leaving slight ambiguity about the difference between a single hash and a manifest.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives. It doesn't mention that get_hash_manifest exists or when to prefer one over the other, nor does it specify any prerequisites like needing a translation or book. Usage context is left entirely implicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_hash_manifestGet a bulk hash manifestB
Read-onlyIdempotent

Return Bible checksums at translation/book/chapter scope for efficient bulk checks.

ParametersJSON Schema
NameRequiredDescriptionDefault
bookNo
kindYes
api_versionNov3
translationNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
bookYes
dataYes
kindYes
cacheNo
sourceYes
translationYes
cache_policyYes

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the description doesn't need to cover safety. It adds the scoping detail (translation/book/chapter) which is useful, but it doesn't disclose any behavioral nuances like result aggregation, pagination limits, or performance expectations, which would be valuable for a bulk operation. With annotations covering safety, a 3 is appropriate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single concise sentence that front-loads the action and scope. There is no unnecessary verbiage, and it conveys the core purpose efficiently. It earns a 5 for conciseness even though it costs some completeness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 4 parameters with zero schema description coverage, an output schema, and no guidance on parameter construction, the description is far from complete. It doesn't explain how to specify translation/book correctly, what 'kind' values mean, or how api_version affects results. This leaves an agent guessing about valid argument combinations, so a 2 is appropriate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries the full burden for parameter explanation. It only hints at scopes ('translation/book/chapter') but doesn't map these to the actual parameters (kind, book, translation, api_version). The mention of 'chapter' is confusing since 'kind' enum has no 'chapter' option. This is insufficient for a 4-parameter tool with zero schema descriptions, so 2 is warranted.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Return' and the resource 'Bible checksums' with scope levels (translation/book/chapter). It distinguishes from sibling 'get_hash' by emphasizing 'bulk checks', making the purpose reasonably specific. However, it does not explicitly contrast with any sibling, so it's not a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'for efficient bulk checks' implies when to use this tool, but there is no explicit comparison to alternatives like 'get_hash' or 'check_for_updates'. It offers general context but lacks clear when-to-use vs when-not-to-use guidance, so it's serviceable but not explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_scriptureGet complete scripture scopeA
Read-onlyIdempotent

Read a whole chapter, book or translation with before/after .sha consistency checks.

Omit chapter for a book, omit both for a translation. Native verse data is preserved, including v3 tokens and spans. Use query_verses for selected references.

ParametersJSON Schema
NameRequiredDescriptionDefault
bookNo
chapterNo
api_versionNov3
translationNokjv

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
hashYes
cacheNo
scopeYes
sourceYes
cache_policyYes
hash_source_urlYes
consistency_checkedYes
consistency_retriesYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, and non-destructive hints. The description adds valuable behavioral context: 'before/after .sha consistency checks' and 'Native verse data is preserved, including v3 tokens and spans.' These describe internal checks and output fidelity beyond the annotations, which is exactly what the description should provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two short sentences and a clause. The primary purpose is front-loaded, and every sentence adds value: the scope options, the consistency checks, the preservation detail, and the pointer to the alternative. No fluff or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity and that an output schema exists, the description covers the essential decision points: how to request different scopes, what behavioral guarantees exist (consistency checks, data preservation), and when to use a sibling tool. It does not mention return format, but that is likely in the output schema. It could mention that translation is a parameter, but it's implied by 'book or translation.' Overall, it's complete for an agent to call correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It does explain the relationship between book and chapter parameters via omission rules, but it does not explain api_version or translation parameters at all. The translation parameter has a default but its meaning is not clarified; api_version has an enum but the description doesn't mention what v2 vs v3 mean. Since the description only covers two of four parameters, it partially compensates for the schema gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Read' and the resource 'scripture' with scope options: chapter, book, or translation. It also distinguishes from sibling query_verses by explicitly pointing to that tool for selected references. This is a specific and differentiating purpose statement.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit instructions on how to select scope: 'Omit chapter for a book, omit both for a translation.' It also names the alternative tool (query_verses) and the condition for using it (selected references). This is strong usage guidance with clear when-to-use and when-not-to-use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_booksList books in a translationB
Read-onlyIdempotent

Discover book numbers, localized names and hashes in the selected API version.

ParametersJSON Schema
NameRequiredDescriptionDefault
api_versionNov3
translationNokjv

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
cacheNo
sourceYes
hash_guidanceYes

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is fully covered. The description adds the behavioral context that the tool returns book numbers, localized names, and hashes, which is useful but not deeply behavioral. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence that conveys the tool's purpose without waste. It could add a bit more detail about parameters, but it earns its place as concise and structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has an output schema, the return values are already documented. The description is adequate for a simple read-only list tool with two optional parameters, but it lacks explicit guidance on when to use it versus siblings like list_chapters or get_hash. The annotations cover safety, so the main gap is usage routing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It mentions 'selected API version' and 'translation' implicitly via 'book numbers, localized names and hashes in the selected API version', but it does not explain the meaning or format of api_version or translation beyond what the schema's enum and default provide. Baseline 3 is appropriate because the description adds minimal semantic value over the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Discover') and resource ('book numbers, localized names and hashes') in the selected API version. It clearly distinguishes the tool's purpose from siblings like list_translations or list_chapters, though it doesn't explicitly name a sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage context: it is for discovering book-level metadata in a translation. It does not explicitly state when to use this tool versus alternatives like list_chapters or get_hash, nor does it mention exclusions. The context is clear enough for basic selection but lacks explicit routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_chaptersList chapters in a bookB
Read-onlyIdempotent

Return chapter mappings and hashes; discover identifiers before retrieving scripture.

ParametersJSON Schema
NameRequiredDescriptionDefault
bookYes
api_versionNov3
translationYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
cacheNo
sourceYes
hash_guidanceYes

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so the safety profile is covered. The description adds that it returns 'chapter mappings and hashes' and that it is for discovering identifiers, which is useful. It does not disclose details like pagination or whether hashes are content hashes, but with annotations covering the main behavioral traits, a 3 is appropriate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence, front-loaded with the main action and result. It is concise and every word earns its place. It could be slightly more structured, but it is appropriately sized.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has an output schema, so return values are documented elsewhere. The description explains the purpose and the discovery workflow. However, with 0% parameter coverage and no mention of required parameters or how to use the output, an agent might not know what 'translation' and 'book' values are expected. The output schema helps, but the description is incomplete for a tool with 3 params and no param docs.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It mentions 'translation' and 'book' implicitly via 'in a book' but does not explain the meaning of 'translation', 'book', or 'api_version'. The description adds no parameter-level detail beyond the schema's field names and types. With 0% coverage and 3 params, this is a significant gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Return') and resource ('chapter mappings and hashes'), and the title clarifies it lists chapters in a book. It does not explicitly differentiate from siblings like list_books or get_scripture, but the mention of 'discover identifiers before retrieving scripture' gives some context. It is clear enough but not a full sibling differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage: use this to discover identifiers before retrieving scripture, which is a clear context. It does not explicitly name alternatives or exclusions, but the phrase 'before retrieving scripture' signals when to use it. Given the sibling list includes get_scripture and query_verses, this is adequate but not explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_translationsList GetBible translationsA
Read-onlyIdempotent

Discover translation abbreviations, languages, publisher metadata and catalog hashes.

ParametersJSON Schema
NameRequiredDescriptionDefault
api_versionNov3

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
cacheNo
sourceYes
hash_guidanceYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior. The description adds value beyond those by specifying the output scope—abbreviations, languages, publisher metadata, and catalog hashes—helping the agent know what to expect. There is no contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, tightly worded sentence with no filler. The action and resource are front-loaded, and every word contributes to understanding the tool's purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple list tool with one optional parameter, strong annotations, and an output schema, the description is sufficient. It names the content categories returned, while the schema handles the api_version default and choices.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The only parameter, api_version, has no description and is not mentioned in the tool description. However, the schema provides an enum of v2/v3 and a default of v3, making the parameter mostly self-explanatory. The description adds no extra meaning about version implications.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific action ('Discover') and a precise resource ('translation abbreviations, languages, publisher metadata and catalog hashes'), clearly stating what the tool returns. This also distinguishes it from sibling tools like list_books, list_chapters, and get_hash.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'Discover translation abbreviations...' gives an implicit use case: use this tool when you need translation metadata. However, it does not explicitly say when to prefer this over siblings such as get_hash or list_books, nor does it state any exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

query_versesQuery selected or grouped versesA
Read-onlyIdempotent

Fetch native reference results without caching or inferred chapter hashes.

Invalid/unresolved references return errors, never fallback scripture. Translation defaults to kjv. Use v3 for richer verse data. TTL metadata is available in source response headers.

ParametersJSON Schema
NameRequiredDescriptionDefault
referencesYesReference, e.g. 'John 3:16-19; 1 John 3:16-19,22'.
api_versionNov3
translationNokjv

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
cacheYes
sourceYes
referencesYes
translationYes

TDQS

A3.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark this read-only, idempotent, and non-destructive. The description adds substantial behavior beyond that: no caching/inferred hashes, error instead of fallback for invalid references, translation default, v3 recommendation, and TTL metadata in response headers.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact, front-loads the purpose, and every sentence adds relevant behavioral or selection detail. There is no filler or repetition of schema/annotation content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema available, the description does not need to explain return values, and it covers error behavior, caching behavior, defaults, version choice, and TTL metadata. The only notable gap is the lack of explicit routing guidance relative to sibling tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is low (33%), and the description adds only minimal parameter guidance: 'Translation defaults to kjv' and 'Use v3 for richer verse data,' with the default already present in the schema. It does not explain accepted translation values or API-version behaviors beyond the v3 recommendation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names the operation ('Fetch native reference results') and the title clarifies the resource ('selected or grouped verses'), so an agent can tell it is a verse-querying tool. It does not explicitly name sibling tools like search_verses or get_scripture, but 'without caching or inferred chapter hashes' suggests a differentiator.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description conveys that the tool works on exact native references, that unresolved references error instead of falling back, and that v3 should be preferred, which gives some contextual guidance. It does not explicitly state when to use query_verses versus sibling tools such as search_verses, get_scripture, or list_chapters.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_dictionary_entriesFind dictionary entry identifiersA
Read-onlyIdempotent

Find entry IDs by key, alias, search text or ID in a discovered dictionary module.

Discover modules with dictionaries/v1/listDictionaries first. Fetches the current index and filters it locally, returning a bounded page of unchanged records. Key, search and alias matching ignores case and combining accents using Unicode NFD; IDs match exactly, including case. This is not definition full-text search. Exact is the default; use prefix or contains explicitly if needed. Follow next_offset with the same inputs. Fetch definitions with dictionaries/v1/getDictionaryEntry and the returned exact ID; see_also and backlinks are directed links, not guaranteed synonyms.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
matchNoexact
queryYes
offsetNo
dictionaryYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
cacheYes
countYes
matchYes
queryYes
totalYes
offsetYes
sourceYes
entriesYes
dictionaryYes
next_offsetNo

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=true, and destructiveHint=false. The description adds behavioral detail beyond these: it explains the operation mechanism ('Fetches the current index and filters it locally, returning a bounded page of unchanged records'), details matching semantics (case and accent insensitivity via Unicode NFD, exact case-sensitive ID matching), and clarifies that see_also and backlinks are directed links, not synonyms. No contradictions with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with purpose and prerequisites, then provides essential behavioral details. Each sentence adds value: the first sentence defines the scope, the second gives discovery prerequisite, the third explains the filtering behavior, and subsequent sentences cover matching semantics, exclusions, pagination, and follow-up actions. There is no redundancy or fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with pagination, multiple match modes, and a dependency on dictionary discovery, the description covers all critical aspects: discovery step, search criteria, matching behavior, pagination, and how to use results. It also addresses potential misinterpretations (not full-text search, see_also not synonyms). Since an output schema exists, return format details are not required in the description.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description must compensate for the lack of parameter documentation. It does so by explaining the query parameter (matching semantics), the match parameter (exact/prefix/contains with default), pagination (offset/limit via next_offset), and the dictionary parameter (discovered modules). However, it does not explicitly enumerate each parameter name, leaving some inference to the agent. This is a minor gap given the clarity provided.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the purpose: 'Find entry IDs by key, alias, search text or ID in a discovered dictionary module.' It also distinguishes from siblings by explicitly noting 'This is not definition full-text search.' This differentiates it from search_verses or query_verses, making the tool's scope unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit usage guidance: it instructs to 'Discover modules with dictionaries/v1/listDictionaries first,' explains when not to use it ('This is not definition full-text search'), and directs next steps ('Fetch definitions with dictionaries/v1/getDictionaryEntry and the returned exact ID'). It also clarifies pagination ('Follow next_offset with the same inputs') and default vs explicit match modes ('Exact is the default; use prefix or contains explicitly if needed').

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_versesSearch Bible textB
Read-onlyIdempotent

Search text with all native filters and pagination; results are never cached by MCP.

book/exclude repeat query keys; books is comma-separated. proximity requires words=all. A search recognized as a reference may bypass filters. Inspect native pagination metadata. Use describe_api_operation for the equivalent read-only JSON POST and aliases.

ParametersJSON Schema
NameRequiredDescriptionDefault
bookNo
sortNocanonical
booksNo
limitNo
matchNowhole_word
scopeNobible
wordsNoall
offsetNo
searchYes
excludeNo
proximityNo
diacriticsNofold
api_versionNov3
translationNokjv
case_sensitiveNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
cacheYes
sourceYes
operation_idYes

TDQS

B3.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish readOnly, idempotent, and non-destructive behavior, so the description adds valuable non-obvious details: results are never cached, searches recognized as references may bypass filters, and pagination metadata should be inspected. These are genuine gotchas beyond the structured annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the core purpose, using fragmented notes to pack in edge cases. It avoids fluff, though phrases like 'book/exclude repeat query keys' are terse enough to be cryptic.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the high complexity (15 parameters, 6 enums) and 0% schema coverage, the description covers only a few quirks. It omits guidance on major query controls like limit/offset, sort, matching mode, scope, translation, and case sensitivity, leaving an agent under-equipped for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, but it only mentions book/exclude/books/proximity and words=all. Most of the 15 parameters—search, sort, limit, offset, scope, match, diacritics, api_version, translation, case_sensitive—receive no semantic guidance in either the schema or the description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Search text' with 'all native filters and pagination', which clearly indicates a text search operation. However, it does not explicitly differentiate this tool from sibling query_verses, though the title 'Search Bible text' anchors the subject.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description offers usage constraints such as 'proximity requires words=all', 'books is comma-separated', and warns that a reference-recognized search may bypass filters. It also directs users to describe_api_operation for the equivalent JSON POST, but it does not clearly state when to choose search_verses over query_verses or other siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 13 tool updatesv2.1.1
    • Addedcall_api_operation
    • Changedcheck_for_updates7 fields changed
      • addedInput schema / $defs / HashWatch / properties / api_version
        Added value: +{
        +  "default": "v3",
        +  "enum": [
        +    "v2",
        +    "v3"
        +  ],
        +  "title": "Api Version",
        +  "type": "string"
        +}
      • changedInput schema / $defs / HashWatch / properties / book / anyOf
        Previous value: -[
        -  {
        -    "maximum": 200,
        -    "minimum": 1,
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maximum": 281474977710655,
        +    "minimum": 1,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / $defs / HashWatch / properties / chapter / anyOf
        Previous value: -[
        -  {
        -    "maximum": 300,
        -    "minimum": 1,
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "minimum": 1,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedInput schema / properties / items / description
        Removed value: -"Cached scopes and stored hashes."
      • addedOutput schema / $defs / ScopeSpec / properties / api_version
        Added value: +{
        +  "default": "v3",
        +  "enum": [
        +    "v2",
        +    "v3"
        +  ],
        +  "title": "Api Version",
        +  "type": "string"
        +}
      • changedOutput schema / $defs / ScopeSpec / properties / book / anyOf
        Previous value: -[
        -  {
        -    "maximum": 200,
        -    "minimum": 1,
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maximum": 281474977710655,
        +    "minimum": 1,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedOutput schema / $defs / ScopeSpec / properties / chapter / anyOf
        Previous value: -[
        -  {
        -    "maximum": 300,
        -    "minimum": 1,
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "minimum": 1,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Addeddescribe_api_operation
    • Addeddiscover_apis
    • Changedget_hash18 fields changed
      • addedInput schema / properties / api_version
        Added value: +{
        +  "default": "v3",
        +  "enum": [
        +    "v2",
        +    "v3"
        +  ],
        +  "title": "Api Version",
        +  "type": "string"
        +}
      • changedInput schema / properties / book / anyOf
        Previous value: -[
        -  {
        -    "maximum": 200,
        -    "minimum": 1,
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "minimum": 1,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / chapter / anyOf
        Previous value: -[
        -  {
        -    "maximum": 300,
        -    "minimum": 1,
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "minimum": 1,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedInput schema / properties / kind / description
        Removed value: -"Exact cached scope to validate."
      • removedInput schema / properties / translation / description
        Removed value: -"Translation abbreviation."
      • addedOutput schema / $defs / CacheAdvice
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Consumer guidance only: this MCP never stores upstream responses.",
        +  "properties": {
        +    "cacheable": {
        +      "title": "Cacheable",
        +      "type": "boolean"
        +    },
        +    "expires_at": {
        +      "format": "date-time",
        +      "title": "Expires At",
        +      "type": "string"
        +    },
        +    "hash_validation_required": {
        +      "title": "Hash Validation Required",
        +      "type": "boolean"
        +    },
        +    "max_retention_seconds": {
        +      "default": 2592000,
        +      "title": "Max Retention Seconds",
        +      "type": "integer"
        +    },
        +    "policy": {
        +      "title": "Policy",
        +      "type": "string"
        +    },
        +    "recommended": {
        +      "title": "Recommended",
        +      "type": "boolean"
        +    },
        +    "remaining_ttl_seconds": {
        +      "minimum": 0,
        +      "title": "Remaining Ttl Seconds",
        +      "type": "integer"
        +    }
        +  },
        +  "required": [
        +    "cacheable",
        +    "recommended",
        +    "remaining_ttl_seconds",
        +    "expires_at",
        +    "hash_validation_required",
        +    "policy"
        +  ],
        +  "title": "CacheAdvice",
        +  "type": "object"
        +}
      • addedOutput schema / $defs / ScopeSpec / properties / api_version
        Added value: +{
        +  "default": "v3",
        +  "enum": [
        +    "v2",
        +    "v3"
        +  ],
        +  "title": "Api Version",
        +  "type": "string"
        +}
      • changedOutput schema / $defs / ScopeSpec / properties / book / anyOf
        Previous value: -[
        -  {
        -    "maximum": 200,
        -    "minimum": 1,
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maximum": 281474977710655,
        +    "minimum": 1,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedOutput schema / $defs / ScopeSpec / properties / chapter / anyOf
        Previous value: -[
        -  {
        -    "maximum": 300,
        -    "minimum": 1,
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "minimum": 1,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedOutput schema / $defs / SourceInfo / properties / api_version / const
        Removed value: -"v2"
      • removedOutput schema / $defs / SourceInfo / properties / api_version / default
        Removed value: -"v2"
      • addedOutput schema / $defs / SourceInfo / properties / api_version / enum
        Added value: +[
        +  "v1",
        +  "v2",
        +  "v3"
        +]
      • addedOutput schema / $defs / SourceInfo / properties / headers
        Added value: +{
        +  "additionalProperties": {
        +    "type": "string"
        +  },
        +  "title": "Headers",
        +  "type": "object"
        +}
      • addedOutput schema / $defs / SourceInfo / properties / service
        Added value: +{
        +  "enum": [
        +    "api",
        +    "query",
        +    "search",
        +    "dictionaries",
        +    "commentaries",
        +    "bookmarks"
        +  ],
        +  "title": "Service",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / SourceInfo / properties / status_code
        Added value: +{
        +  "default": 200,
        +  "maximum": 599,
        +  "minimum": 100,
        +  "title": "Status Code",
        +  "type": "integer"
        +}
      • changedOutput schema / $defs / SourceInfo / required
        Previous value: -[
        -  "url",
        -  "fetched_at"
        -]New value: +[
        +  "url",
        +  "fetched_at",
        +  "api_version",
        +  "service"
        +]
      • addedOutput schema / properties / cache
        Added value: +{
        +  "anyOf": [
        +    {
        +      "$ref": "#/$defs/CacheAdvice"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • changedOutput schema / properties / meaning / default
        Previous value: -"Opaque content-version token; a change means cached content is stale."New value: +"Published SHA-1 checksum and version token; a change means cached content is stale. Reading the token does not itself verify downloaded scripture bytes."
    • Changedget_hash_manifest12 fields changed
      • addedInput schema / properties / api_version
        Added value: +{
        +  "default": "v3",
        +  "enum": [
        +    "v2",
        +    "v3"
        +  ],
        +  "title": "Api Version",
        +  "type": "string"
        +}
      • changedInput schema / properties / book / anyOf
        Previous value: -[
        -  {
        -    "maximum": 200,
        -    "minimum": 1,
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "minimum": 1,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedInput schema / properties / kind / description
        Removed value: -"all_translations, translation, or book."
      • addedOutput schema / $defs / CacheAdvice
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Consumer guidance only: this MCP never stores upstream responses.",
        +  "properties": {
        +    "cacheable": {
        +      "title": "Cacheable",
        +      "type": "boolean"
        +    },
        +    "expires_at": {
        +      "format": "date-time",
        +      "title": "Expires At",
        +      "type": "string"
        +    },
        +    "hash_validation_required": {
        +      "title": "Hash Validation Required",
        +      "type": "boolean"
        +    },
        +    "max_retention_seconds": {
        +      "default": 2592000,
        +      "title": "Max Retention Seconds",
        +      "type": "integer"
        +    },
        +    "policy": {
        +      "title": "Policy",
        +      "type": "string"
        +    },
        +    "recommended": {
        +      "title": "Recommended",
        +      "type": "boolean"
        +    },
        +    "remaining_ttl_seconds": {
        +      "minimum": 0,
        +      "title": "Remaining Ttl Seconds",
        +      "type": "integer"
        +    }
        +  },
        +  "required": [
        +    "cacheable",
        +    "recommended",
        +    "remaining_ttl_seconds",
        +    "expires_at",
        +    "hash_validation_required",
        +    "policy"
        +  ],
        +  "title": "CacheAdvice",
        +  "type": "object"
        +}
      • removedOutput schema / $defs / SourceInfo / properties / api_version / const
        Removed value: -"v2"
      • removedOutput schema / $defs / SourceInfo / properties / api_version / default
        Removed value: -"v2"
      • addedOutput schema / $defs / SourceInfo / properties / api_version / enum
        Added value: +[
        +  "v1",
        +  "v2",
        +  "v3"
        +]
      • addedOutput schema / $defs / SourceInfo / properties / headers
        Added value: +{
        +  "additionalProperties": {
        +    "type": "string"
        +  },
        +  "title": "Headers",
        +  "type": "object"
        +}
      • addedOutput schema / $defs / SourceInfo / properties / service
        Added value: +{
        +  "enum": [
        +    "api",
        +    "query",
        +    "search",
        +    "dictionaries",
        +    "commentaries",
        +    "bookmarks"
        +  ],
        +  "title": "Service",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / SourceInfo / properties / status_code
        Added value: +{
        +  "default": 200,
        +  "maximum": 599,
        +  "minimum": 100,
        +  "title": "Status Code",
        +  "type": "integer"
        +}
      • changedOutput schema / $defs / SourceInfo / required
        Previous value: -[
        -  "url",
        -  "fetched_at"
        -]New value: +[
        +  "url",
        +  "fetched_at",
        +  "api_version",
        +  "service"
        +]
      • addedOutput schema / properties / cache
        Added value: +{
        +  "anyOf": [
        +    {
        +      "$ref": "#/$defs/CacheAdvice"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
    • Changedget_scripture20 fields changed
      • addedInput schema / properties / api_version
        Added value: +{
        +  "default": "v3",
        +  "enum": [
        +    "v2",
        +    "v3"
        +  ],
        +  "title": "Api Version",
        +  "type": "string"
        +}
      • changedInput schema / properties / book / anyOf
        Previous value: -[
        -  {
        -    "maximum": 200,
        -    "minimum": 1,
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "minimum": 1,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedInput schema / properties / book / description
        Removed value: -"Omit for a whole translation."
      • changedInput schema / properties / chapter / anyOf
        Previous value: -[
        -  {
        -    "maximum": 300,
        -    "minimum": 1,
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "minimum": 1,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedInput schema / properties / chapter / description
        Removed value: -"Omit for a whole book or translation."
      • addedInput schema / properties / translation / default
        Added value: +"kjv"
      • removedInput schema / properties / translation / description
        Removed value: -"Translation abbreviation, e.g. 'kjv'."
      • removedInput schema / required
        Removed value: -[
        -  "translation"
        -]
      • addedOutput schema / $defs / CacheAdvice
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Consumer guidance only: this MCP never stores upstream responses.",
        +  "properties": {
        +    "cacheable": {
        +      "title": "Cacheable",
        +      "type": "boolean"
        +    },
        +    "expires_at": {
        +      "format": "date-time",
        +      "title": "Expires At",
        +      "type": "string"
        +    },
        +    "hash_validation_required": {
        +      "title": "Hash Validation Required",
        +      "type": "boolean"
        +    },
        +    "max_retention_seconds": {
        +      "default": 2592000,
        +      "title": "Max Retention Seconds",
        +      "type": "integer"
        +    },
        +    "policy": {
        +      "title": "Policy",
        +      "type": "string"
        +    },
        +    "recommended": {
        +      "title": "Recommended",
        +      "type": "boolean"
        +    },
        +    "remaining_ttl_seconds": {
        +      "minimum": 0,
        +      "title": "Remaining Ttl Seconds",
        +      "type": "integer"
        +    }
        +  },
        +  "required": [
        +    "cacheable",
        +    "recommended",
        +    "remaining_ttl_seconds",
        +    "expires_at",
        +    "hash_validation_required",
        +    "policy"
        +  ],
        +  "title": "CacheAdvice",
        +  "type": "object"
        +}
      • addedOutput schema / $defs / ScopeSpec / properties / api_version
        Added value: +{
        +  "default": "v3",
        +  "enum": [
        +    "v2",
        +    "v3"
        +  ],
        +  "title": "Api Version",
        +  "type": "string"
        +}
      • changedOutput schema / $defs / ScopeSpec / properties / book / anyOf
        Previous value: -[
        -  {
        -    "maximum": 200,
        -    "minimum": 1,
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maximum": 281474977710655,
        +    "minimum": 1,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedOutput schema / $defs / ScopeSpec / properties / chapter / anyOf
        Previous value: -[
        -  {
        -    "maximum": 300,
        -    "minimum": 1,
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "minimum": 1,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedOutput schema / $defs / SourceInfo / properties / api_version / const
        Removed value: -"v2"
      • removedOutput schema / $defs / SourceInfo / properties / api_version / default
        Removed value: -"v2"
      • addedOutput schema / $defs / SourceInfo / properties / api_version / enum
        Added value: +[
        +  "v1",
        +  "v2",
        +  "v3"
        +]
      • addedOutput schema / $defs / SourceInfo / properties / headers
        Added value: +{
        +  "additionalProperties": {
        +    "type": "string"
        +  },
        +  "title": "Headers",
        +  "type": "object"
        +}
      • addedOutput schema / $defs / SourceInfo / properties / service
        Added value: +{
        +  "enum": [
        +    "api",
        +    "query",
        +    "search",
        +    "dictionaries",
        +    "commentaries",
        +    "bookmarks"
        +  ],
        +  "title": "Service",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / SourceInfo / properties / status_code
        Added value: +{
        +  "default": 200,
        +  "maximum": 599,
        +  "minimum": 100,
        +  "title": "Status Code",
        +  "type": "integer"
        +}
      • changedOutput schema / $defs / SourceInfo / required
        Previous value: -[
        -  "url",
        -  "fetched_at"
        -]New value: +[
        +  "url",
        +  "fetched_at",
        +  "api_version",
        +  "service"
        +]
      • addedOutput schema / properties / cache
        Added value: +{
        +  "anyOf": [
        +    {
        +      "$ref": "#/$defs/CacheAdvice"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
    • Changedlist_books13 fields changed
      • addedInput schema / properties / api_version
        Added value: +{
        +  "default": "v3",
        +  "enum": [
        +    "v2",
        +    "v3"
        +  ],
        +  "title": "Api Version",
        +  "type": "string"
        +}
      • addedInput schema / properties / translation / default
        Added value: +"kjv"
      • removedInput schema / properties / translation / description
        Removed value: -"Translation abbreviation from list_translations, for example 'kjv'."
      • removedInput schema / required
        Removed value: -[
        -  "translation"
        -]
      • addedOutput schema / $defs / CacheAdvice
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Consumer guidance only: this MCP never stores upstream responses.",
        +  "properties": {
        +    "cacheable": {
        +      "title": "Cacheable",
        +      "type": "boolean"
        +    },
        +    "expires_at": {
        +      "format": "date-time",
        +      "title": "Expires At",
        +      "type": "string"
        +    },
        +    "hash_validation_required": {
        +      "title": "Hash Validation Required",
        +      "type": "boolean"
        +    },
        +    "max_retention_seconds": {
        +      "default": 2592000,
        +      "title": "Max Retention Seconds",
        +      "type": "integer"
        +    },
        +    "policy": {
        +      "title": "Policy",
        +      "type": "string"
        +    },
        +    "recommended": {
        +      "title": "Recommended",
        +      "type": "boolean"
        +    },
        +    "remaining_ttl_seconds": {
        +      "minimum": 0,
        +      "title": "Remaining Ttl Seconds",
        +      "type": "integer"
        +    }
        +  },
        +  "required": [
        +    "cacheable",
        +    "recommended",
        +    "remaining_ttl_seconds",
        +    "expires_at",
        +    "hash_validation_required",
        +    "policy"
        +  ],
        +  "title": "CacheAdvice",
        +  "type": "object"
        +}
      • removedOutput schema / $defs / SourceInfo / properties / api_version / const
        Removed value: -"v2"
      • removedOutput schema / $defs / SourceInfo / properties / api_version / default
        Removed value: -"v2"
      • addedOutput schema / $defs / SourceInfo / properties / api_version / enum
        Added value: +[
        +  "v1",
        +  "v2",
        +  "v3"
        +]
      • addedOutput schema / $defs / SourceInfo / properties / headers
        Added value: +{
        +  "additionalProperties": {
        +    "type": "string"
        +  },
        +  "title": "Headers",
        +  "type": "object"
        +}
      • addedOutput schema / $defs / SourceInfo / properties / service
        Added value: +{
        +  "enum": [
        +    "api",
        +    "query",
        +    "search",
        +    "dictionaries",
        +    "commentaries",
        +    "bookmarks"
        +  ],
        +  "title": "Service",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / SourceInfo / properties / status_code
        Added value: +{
        +  "default": 200,
        +  "maximum": 599,
        +  "minimum": 100,
        +  "title": "Status Code",
        +  "type": "integer"
        +}
      • changedOutput schema / $defs / SourceInfo / required
        Previous value: -[
        -  "url",
        -  "fetched_at"
        -]New value: +[
        +  "url",
        +  "fetched_at",
        +  "api_version",
        +  "service"
        +]
      • addedOutput schema / properties / cache
        Added value: +{
        +  "anyOf": [
        +    {
        +      "$ref": "#/$defs/CacheAdvice"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
    • Changedlist_chapters13 fields changed
      • addedInput schema / properties / api_version
        Added value: +{
        +  "default": "v3",
        +  "enum": [
        +    "v2",
        +    "v3"
        +  ],
        +  "title": "Api Version",
        +  "type": "string"
        +}
      • removedInput schema / properties / book / description
        Removed value: -"GetBible book number."
      • removedInput schema / properties / book / maximum
        Removed value: -200
      • removedInput schema / properties / translation / description
        Removed value: -"Translation abbreviation, e.g. 'kjv'."
      • addedOutput schema / $defs / CacheAdvice
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Consumer guidance only: this MCP never stores upstream responses.",
        +  "properties": {
        +    "cacheable": {
        +      "title": "Cacheable",
        +      "type": "boolean"
        +    },
        +    "expires_at": {
        +      "format": "date-time",
        +      "title": "Expires At",
        +      "type": "string"
        +    },
        +    "hash_validation_required": {
        +      "title": "Hash Validation Required",
        +      "type": "boolean"
        +    },
        +    "max_retention_seconds": {
        +      "default": 2592000,
        +      "title": "Max Retention Seconds",
        +      "type": "integer"
        +    },
        +    "policy": {
        +      "title": "Policy",
        +      "type": "string"
        +    },
        +    "recommended": {
        +      "title": "Recommended",
        +      "type": "boolean"
        +    },
        +    "remaining_ttl_seconds": {
        +      "minimum": 0,
        +      "title": "Remaining Ttl Seconds",
        +      "type": "integer"
        +    }
        +  },
        +  "required": [
        +    "cacheable",
        +    "recommended",
        +    "remaining_ttl_seconds",
        +    "expires_at",
        +    "hash_validation_required",
        +    "policy"
        +  ],
        +  "title": "CacheAdvice",
        +  "type": "object"
        +}
      • removedOutput schema / $defs / SourceInfo / properties / api_version / const
        Removed value: -"v2"
      • removedOutput schema / $defs / SourceInfo / properties / api_version / default
        Removed value: -"v2"
      • addedOutput schema / $defs / SourceInfo / properties / api_version / enum
        Added value: +[
        +  "v1",
        +  "v2",
        +  "v3"
        +]
      • addedOutput schema / $defs / SourceInfo / properties / headers
        Added value: +{
        +  "additionalProperties": {
        +    "type": "string"
        +  },
        +  "title": "Headers",
        +  "type": "object"
        +}
      • addedOutput schema / $defs / SourceInfo / properties / service
        Added value: +{
        +  "enum": [
        +    "api",
        +    "query",
        +    "search",
        +    "dictionaries",
        +    "commentaries",
        +    "bookmarks"
        +  ],
        +  "title": "Service",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / SourceInfo / properties / status_code
        Added value: +{
        +  "default": 200,
        +  "maximum": 599,
        +  "minimum": 100,
        +  "title": "Status Code",
        +  "type": "integer"
        +}
      • changedOutput schema / $defs / SourceInfo / required
        Previous value: -[
        -  "url",
        -  "fetched_at"
        -]New value: +[
        +  "url",
        +  "fetched_at",
        +  "api_version",
        +  "service"
        +]
      • addedOutput schema / properties / cache
        Added value: +{
        +  "anyOf": [
        +    {
        +      "$ref": "#/$defs/CacheAdvice"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
    • Changedlist_translations10 fields changed
      • addedInput schema / properties / api_version
        Added value: +{
        +  "default": "v3",
        +  "enum": [
        +    "v2",
        +    "v3"
        +  ],
        +  "title": "Api Version",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / CacheAdvice
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Consumer guidance only: this MCP never stores upstream responses.",
        +  "properties": {
        +    "cacheable": {
        +      "title": "Cacheable",
        +      "type": "boolean"
        +    },
        +    "expires_at": {
        +      "format": "date-time",
        +      "title": "Expires At",
        +      "type": "string"
        +    },
        +    "hash_validation_required": {
        +      "title": "Hash Validation Required",
        +      "type": "boolean"
        +    },
        +    "max_retention_seconds": {
        +      "default": 2592000,
        +      "title": "Max Retention Seconds",
        +      "type": "integer"
        +    },
        +    "policy": {
        +      "title": "Policy",
        +      "type": "string"
        +    },
        +    "recommended": {
        +      "title": "Recommended",
        +      "type": "boolean"
        +    },
        +    "remaining_ttl_seconds": {
        +      "minimum": 0,
        +      "title": "Remaining Ttl Seconds",
        +      "type": "integer"
        +    }
        +  },
        +  "required": [
        +    "cacheable",
        +    "recommended",
        +    "remaining_ttl_seconds",
        +    "expires_at",
        +    "hash_validation_required",
        +    "policy"
        +  ],
        +  "title": "CacheAdvice",
        +  "type": "object"
        +}
      • removedOutput schema / $defs / SourceInfo / properties / api_version / const
        Removed value: -"v2"
      • removedOutput schema / $defs / SourceInfo / properties / api_version / default
        Removed value: -"v2"
      • addedOutput schema / $defs / SourceInfo / properties / api_version / enum
        Added value: +[
        +  "v1",
        +  "v2",
        +  "v3"
        +]
      • addedOutput schema / $defs / SourceInfo / properties / headers
        Added value: +{
        +  "additionalProperties": {
        +    "type": "string"
        +  },
        +  "title": "Headers",
        +  "type": "object"
        +}
      • addedOutput schema / $defs / SourceInfo / properties / service
        Added value: +{
        +  "enum": [
        +    "api",
        +    "query",
        +    "search",
        +    "dictionaries",
        +    "commentaries",
        +    "bookmarks"
        +  ],
        +  "title": "Service",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / SourceInfo / properties / status_code
        Added value: +{
        +  "default": 200,
        +  "maximum": 599,
        +  "minimum": 100,
        +  "title": "Status Code",
        +  "type": "integer"
        +}
      • changedOutput schema / $defs / SourceInfo / required
        Previous value: -[
        -  "url",
        -  "fetched_at"
        -]New value: +[
        +  "url",
        +  "fetched_at",
        +  "api_version",
        +  "service"
        +]
      • addedOutput schema / properties / cache
        Added value: +{
        +  "anyOf": [
        +    {
        +      "$ref": "#/$defs/CacheAdvice"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
    • Changedquery_verses23 fields changed
      • addedInput schema / properties / api_version
        Added value: +{
        +  "default": "v3",
        +  "enum": [
        +    "v2",
        +    "v3"
        +  ],
        +  "title": "Api Version",
        +  "type": "string"
        +}
      • changedInput schema / properties / references / description
        Previous value: -"For example: 'John 3:16-19; 1 John 3:16-19,22'."New value: +"Reference, e.g. 'John 3:16-19; 1 John 3:16-19,22'."
      • changedInput schema / properties / references / maxLength
        Previous value: -4096New value: +512
      • addedInput schema / properties / translation / default
        Added value: +"kjv"
      • removedInput schema / properties / translation / description
        Removed value: -"One translation abbreviation, e.g. 'kjv'."
      • changedInput schema / required
        Previous value: -[
        -  "translation",
        -  "references"
        -]New value: +[
        +  "references"
        +]
      • addedOutput schema / $defs / CacheAdvice
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Consumer guidance only: this MCP never stores upstream responses.",
        +  "properties": {
        +    "cacheable": {
        +      "title": "Cacheable",
        +      "type": "boolean"
        +    },
        +    "expires_at": {
        +      "format": "date-time",
        +      "title": "Expires At",
        +      "type": "string"
        +    },
        +    "hash_validation_required": {
        +      "title": "Hash Validation Required",
        +      "type": "boolean"
        +    },
        +    "max_retention_seconds": {
        +      "default": 2592000,
        +      "title": "Max Retention Seconds",
        +      "type": "integer"
        +    },
        +    "policy": {
        +      "title": "Policy",
        +      "type": "string"
        +    },
        +    "recommended": {
        +      "title": "Recommended",
        +      "type": "boolean"
        +    },
        +    "remaining_ttl_seconds": {
        +      "minimum": 0,
        +      "title": "Remaining Ttl Seconds",
        +      "type": "integer"
        +    }
        +  },
        +  "required": [
        +    "cacheable",
        +    "recommended",
        +    "remaining_ttl_seconds",
        +    "expires_at",
        +    "hash_validation_required",
        +    "policy"
        +  ],
        +  "title": "CacheAdvice",
        +  "type": "object"
        +}
      • removedOutput schema / $defs / ChapterHash
        Removed value: -{
        -  "additionalProperties": false,
        -  "properties": {
        -    "book": {
        -      "maximum": 200,
        -      "minimum": 1,
        -      "title": "Book",
        -      "type": "integer"
        -    },
        -    "chapter": {
        -      "maximum": 300,
        -      "minimum": 1,
        -      "title": "Chapter",
        -      "type": "integer"
        -    },
        -    "hash": {
        -      "title": "Hash",
        -      "type": "string"
        -    },
        -    "source_url": {
        -      "title": "Source Url",
        -      "type": "string"
        -    },
        -    "translation": {
        -      "title": "Translation",
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "translation",
        -    "book",
        -    "chapter",
        -    "hash",
        -    "source_url"
        -  ],
        -  "title": "ChapterHash",
        -  "type": "object"
        -}
      • removedOutput schema / $defs / SourceInfo / properties / api_version / const
        Removed value: -"v2"
      • removedOutput schema / $defs / SourceInfo / properties / api_version / default
        Removed value: -"v2"
      • addedOutput schema / $defs / SourceInfo / properties / api_version / enum
        Added value: +[
        +  "v1",
        +  "v2",
        +  "v3"
        +]
      • addedOutput schema / $defs / SourceInfo / properties / headers
        Added value: +{
        +  "additionalProperties": {
        +    "type": "string"
        +  },
        +  "title": "Headers",
        +  "type": "object"
        +}
      • addedOutput schema / $defs / SourceInfo / properties / service
        Added value: +{
        +  "enum": [
        +    "api",
        +    "query",
        +    "search",
        +    "dictionaries",
        +    "commentaries",
        +    "bookmarks"
        +  ],
        +  "title": "Service",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / SourceInfo / properties / status_code
        Added value: +{
        +  "default": 200,
        +  "maximum": 599,
        +  "minimum": 100,
        +  "title": "Status Code",
        +  "type": "integer"
        +}
      • changedOutput schema / $defs / SourceInfo / required
        Previous value: -[
        -  "url",
        -  "fetched_at"
        -]New value: +[
        +  "url",
        +  "fetched_at",
        +  "api_version",
        +  "service"
        +]
      • addedOutput schema / properties / cache
        Added value: +{
        +  "$ref": "#/$defs/CacheAdvice"
        +}
      • removedOutput schema / properties / cache_policy
        Removed value: -{
        -  "title": "Cache Policy",
        -  "type": "string"
        -}
      • removedOutput schema / properties / cacheable
        Removed value: -{
        -  "title": "Cacheable",
        -  "type": "boolean"
        -}
      • removedOutput schema / properties / chapter_hashes
        Removed value: -{
        -  "items": {
        -    "$ref": "#/$defs/ChapterHash"
        -  },
        -  "title": "Chapter Hashes",
        -  "type": "array"
        -}
      • removedOutput schema / properties / consistency_checked
        Removed value: -{
        -  "title": "Consistency Checked",
        -  "type": "boolean"
        -}
      • removedOutput schema / properties / consistency_retries
        Removed value: -{
        -  "title": "Consistency Retries",
        -  "type": "integer"
        -}
      • removedOutput schema / properties / unresolved_references
        Removed value: -{
        -  "items": {
        -    "type": "string"
        -  },
        -  "title": "Unresolved References",
        -  "type": "array"
        -}
      • changedOutput schema / required
        Previous value: -[
        -  "translation",
        -  "references",
        -  "data",
        -  "source",
        -  "chapter_hashes",
        -  "unresolved_references",
        -  "cacheable",
        -  "consistency_checked",
        -  "consistency_retries",
        -  "cache_policy"
        -]New value: +[
        +  "translation",
        +  "references",
        +  "data",
        +  "source",
        +  "cache"
        +]
    • Addedsearch_dictionary_entries
    • Addedsearch_verses
  2. 8 tool updatesv1.0.0
    • First observedcheck_for_updates
    • First observedget_hash
    • First observedget_hash_manifest
    • First observedget_scripture
    • First observedlist_books
    • First observedlist_chapters
    • First observedlist_translations
    • First observedquery_verses

TDQS

A3.7/5.0

Scored across 13 tools

Disambiguation4/5

The set separates discovery, retrieval, search, and hashing clearly, but call_api_operation overlaps with the domain-specific scripture and dictionary tools, requiring careful reading of descriptions to choose the right path.

Naming Consistency4/5

Most tools follow verb_noun snake_case (list_*, get_*, search_*), but query_verses, search_verses, and get_scripture use near-synonymous verbs, and check_for_updates breaks the simple pattern slightly.

Tool Count5/5

Thirteen tools is a reasonable size for a Bible data server that includes API discovery, scripture access, dictionary lookup, and integrity checks; no tool feels superfluous.

Completeness4/5

The core workflows (discover versions, list structure, read scripture, search) are covered, and the generic API tools fill in gaps like dictionary entry retrieval. A dedicated get_dictionary_entry would make it fully first-class, but the surface is not incomplete.

Maintenance

ActivityActive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    Not graded
    maintenance
    Provides structured access to Scripture through the BibleBridge API, enabling semantic search, contextual verse retrieval, and cross-reference analysis. It supports natural language reference normalization and comparative theological exploration across different passages.
    1
    -