shebanq-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@shebanq-mcpFind all niphal verbs in Exodus 15"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
shebanq-mcp
Ask the Hebrew Bible a linguistic question in plain language and get back two things together: the MQL query and the results. An LLM drafts the query, a local Emdros engine runs it against the BHSA database (the same data behind SHEBANQ), and the server returns both. The query is always shown, so it stays the thing you read, verify, and cite.
This is an MCP server: it plugs into clients like Claude as a set of tools.
Status: early. The core server is built and unit-tested. The Emdros execution path is implemented but exercised only where a built BHSA database is present (those tests skip otherwise). The demo web app and deployment are not done yet. Feedback welcome, especially from people who teach or use MQL.
Why
Querying BHSA today means knowing MQL, the BHSA feature vocabulary, and the SHEBANQ interface. Generative AI can draft a query from a plain-language question, which raises a real worry for scholarship and teaching: if a machine writes the query, does the scholar still learn anything?
This tool takes a position on that question. The translation was never the whole of the work. The scholarly act is judging whether a query faithfully captures a form-to-function question, reading what a result does and does not show, and catching a query that quietly asks the wrong thing. So the design keeps the query visible and central rather than hiding it:
The query is the product, not the answer. Every result carries the exact MQL that produced it. It is reproducible and pastes straight into SHEBANQ to save, share, and cite. Nothing comes back as a black box.
Validation before execution. A query is checked against the BHSA feature catalogue first, so a wrong code like
vs=niphal(the correct code isvs=nif) fails loudly instead of silently returning zero.Honest empty results. Zero matches returns the query and a clear "0 results", so you can tell "the query is wrong" from "the phenomenon is not there".
AI as a way in, not a way around.
Tools
Tool | Purpose |
| Plain-language question to generated MQL plus results |
| Validate and run MQL you already have |
| A BHSA feature's gloss and valid values |
run_mql and lookup_feature need no LLM. search_bhsa drafts the query with
an LLM, with the feature catalogue injected into the prompt.
LLM provider
Translation is isolated behind a Translator interface, so the provider is
swappable. Select it with the LLM_PROVIDER environment variable:
anthropic(default) — drafts MQL with the Anthropic API. NeedsANTHROPIC_API_KEY.none— runs translation-free.search_bhsais disabled and returns an error pointing you atrun_mql. Use this inside an MCP client (Claude can draft the query itself and callrun_mql), so the server makes no external calls and needs no key.
Adding another provider (OpenAI, a local model) is a small adapter: a class with
a translate() method plus a branch in build_translator(). Query quality
varies by model, so use the featured-search regression set to measure any given
model's reliability.
How it works
question
-> LLM drafts MQL (guided by the feature catalogue)
-> validator (reject unknown features/values; reject unparseable MQL)
-> Emdros runner (execute on the local BHSA SQLite database)
-> formatter (verse references, Hebrew, glosses)
-> { mql, result_count, results }Four small, independently testable units: a static feature reference, a
validator, an Emdros runner, and a formatter, wired together behind the MCP
tools. See docs/specs for the design and
docs/superpowers/plans for the implementation plan.
Setup
Install Emdros (provides the
mqlCLI and theemdrosPython binding).Build the database (see Data).
pip install -e ".[dev]"(Python 3.10+).Choose an LLM provider (see LLM provider). For the default, set
ANTHROPIC_API_KEY; or setLLM_PROVIDER=noneto run translation-free.Run:
BHSA_SQLITE=data/bhsa.sqlite3 shebanq-mcp
Data
BHSA version: 2021 (pinned). Download the MQL dump from the
ETCBC/bhsa release assets to data/bhsa.mql,
then build the read-only SQLite database:
mql --backend sqlite3 -d data/bhsa.sqlite3 data/bhsa.mqlData files are gitignored and never committed.
Tests
pytest -q # unit tests, no database needed
BHSA_SQLITE=data/bhsa.sqlite3 pytest -m emdros # database-backed testsEmdros-backed tests skip cleanly when the binding or database is absent. After building the database, confirm the Emdros Python API and pin the featured-search counts:
python scripts/spike_emdros.py data/bhsa.sqlite3then fill in the expected_count values in
tests/fixtures/featured_searches.json
from real runs. Those fixtures are the regression backbone and, later, the demo
gallery content.
Roadmap
Core MCP server: feature reference, validator, Emdros runner, formatter, three tools
Pin featured-search counts against a built BHSA database
Demo web app (static front-end with curated, validated searches)
Deploy: Render Pro Web Service (Docker, Emdros-on-SQLite, data baked in)
Full feature-catalogue generation from the ETCBC feature docs
Credits
Built on the work of the Eep Talstra Centre for Bible and Computer (ETCBC): the BHSA dataset, SHEBANQ, and the Emdros query engine. This project wraps that work; it does not replace it.
License
MIT. The BHSA data is licensed separately by the ETCBC and is not included in this repository.
Available Tools
6 toolslookup_featureB
Look up a BHSA feature: its gloss and valid values.
| Name | Required | Description | Default |
|---|---|---|---|
| name_or_term | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the partially describes the return content but does not disclose safety, side effects, or required permissions. It implies a read-only lookup but lacks explicit behavioral details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence that front-loads the key purpose. Every word is informative with no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simplicity (one parameter, no output schema), the description is adequate but minimal. It does not explain the BHSA context, return structure, or how 'gloss and valid values' are represented, leaving the agent to guess.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description does not explain the 'name_or_term' parameter beyond its name. It fails to provide format, examples, or constraints, leaving ambiguity for the agent.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Look up a BHSA feature') and the expected output ('its gloss and valid values'). It is specific about the resource and distinguishes this tool from siblings like run_mql and search_bhsa, which are for querying or searching.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
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, nor does it mention any prerequisites or limitations. An agent would need to infer usage context from the tool's name and description alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_mqlA
Validate and run a read-only MQL query; return the query and glossed results.
Only read-only queries (SELECT/GET) are accepted. Quoting rule (getting it wrong fails typechecking): enumeration features compare UNQUOTED (sp=verb, vs=nif); string features compare QUOTED (lex='BR>['). Verb lexemes carry a trailing '['. Call lookup_feature(name) to check a feature's kind/values.
| Name | Required | Description | Default |
|---|---|---|---|
| mql | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description carries full burden. It discloses read-only nature, validation, and glossing, but does not mention error handling, rate limits, or response format. The quoting rules add behavioral context, but gaps remain.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded with purpose. Each sentence adds value, though it could be slightly shorter without losing clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of MQL queries, no output schema, and no annotations, the description covers purpose, constraints, quoting rules, and a referencing sibling. Lacks examples or error behavior, but for a single-parameter tool, it is fairly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so description must compensate. It explains the MQL parameter fully, including that it must be a read-only query, quoting rules, and cross-reference to 'lookup_feature' for feature checks. This adds substantial meaning beyond the schema's bare type string.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Validate and run a read-only MQL query; return the query and glossed results.' This provides a specific verb ('validate and run'), resource ('MQL query'), and output, distinguishing it from siblings like 'lookup_feature' and 'search_bhsa'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It specifies that only read-only queries (SELECT/GET) are accepted and provides quoting rules. It also mentions 'lookup_feature' as a way to check feature kinds, implying when to use an alternative. However, it does not explicitly state when not to use this tool or provide direct comparison with siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_tfA
Validate and run a Text-Fabric search template; return glossed results.
A template is one object per line, indentation = containment, constraints as unquoted feature=value pairs (sp=verb, lex=BR>[). Put the object you want results for on the LAST line. Call lookup_feature(name) to check a feature's values. Pinned to the BHSA 2021 release.
| Name | Required | Description | Default |
|---|---|---|---|
| template | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It explains the template syntax and that results are glossed, and mentions the BHSA release pinning. However, it does not explicitly state that the tool is read-only or has no side effects, though the query nature is implied.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the main purpose and uses four sentences efficiently. While it could be more structured (e.g., bullet points), it avoids filler and communicates key information without verbosity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description lacks details about the return format ('glossed results' is vague), error handling, or prerequisites. Given no output schema, the agent is left guessing about the structure of results. The tool is complex, and the description does not fully compensate for the missing schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter 'template' has 0% schema description coverage, so the description must add meaning. It provides detailed format: one object per line, indentation for containment, constraints as unquoted feature=value pairs, and that the last line is the target. This is comprehensive and actionable beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's verb ('validate and run'), resource ('Text-Fabric search template'), and output ('return glossed results'). It distinguishes itself from siblings by specifying the template syntax and pinning to BHSA 2021, differentiating it from run_mql, lookup_feature, etc.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description offers some usage hints (e.g., calling lookup_feature to check values) but does not explicitly state when to use this tool versus siblings like run_mql or search_bhsa. Context is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_bhsaA
Answer a plain-language question about the Hebrew Bible.
With server-side translation enabled, returns generated MQL + results. On the public deploy (no server-side LLM) it returns a concise MQL-writing primer so you compose a read-only query yourself and call run_mql. Use the write-mql prompt for the full feature reference. The response also carries the query's Text-Fabric equivalent, derived deterministically from the MQL.
| Name | Required | Description | Default |
|---|---|---|---|
| question | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses behavioral traits: returns generated MQL+results or a primer depending on deployment, and includes Text-Fabric equivalent. No annotations, but description adequately covers behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences, front-loaded with primary function, no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Completes the picture for a simple tool with one parameter: explains output modes, deployment differences, and related tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Single 'question' parameter is described as 'plain-language question about the Hebrew Bible', adding semantic context beyond the schema alone. Could include an example, but sufficient.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it answers plain-language questions about the Hebrew Bible. Differentiates from siblings like run_mql by explaining it can generate MQL or provide a primer.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly describes two usage modes (with server-side LLM vs. public deploy) and directs to alternatives like write-mql prompt or run_mql for raw queries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
to_citable_mqlA
Convert a Text-Fabric search template to equivalent MQL for SHEBANQ.
Deterministic, no model involved: indentation becomes brackets, spaces become AND, string features get quoted from the catalogue. Use this to turn a notebook query into a citable SHEBANQ saved query. Templates using TF constructs beyond ' feature=value ...' lines are refused with an explanation. The mirror of to_tf_template.
| Name | Required | Description | Default |
|---|---|---|---|
| template | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It discloses deterministic behavior: 'indentation becomes brackets, spaces become AND, string features get quoted from the catalogue.' Also explains refusal of complex templates with explanation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two paragraphs, clear and front-loaded. First sentence defines purpose, second adds details. No wasted words, though 'Deterministic, no model involved' is somewhat unnecessary. Efficient overall.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given one parameter, no output schema, and moderate complexity (language conversion), the description covers behavior, limitations, alternatives, and transformation rules. Complete for agent usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter 'template' has no schema description (0% coverage). The description explains it is a Text-Fabric search template and gives transformation rules, adding meaning beyond the schema. Lacks explicit syntax examples but sufficient for use.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool converts a Text-Fabric search template to MQL for SHEBANQ, with a specific verb 'Convert' and resource. It explicitly distinguishes itself as the mirror of 'to_tf_template', differentiating from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit use case: 'Use this to turn a notebook query into a citable SHEBANQ saved query.' Also states when not to use: 'Templates using TF constructs beyond ... are refused with an explanation.' Mentions the alternative tool 'to_tf_template' as the mirror.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
to_tf_templateA
Convert an Emdros MQL query to the equivalent Text-Fabric search template.
Deterministic, no model involved: brackets become indentation, AND becomes a space, quoted string values lose their quotes. GET clauses are dropped with a note (TF results expose all features). MQL using OR, NOT, FOCUS, or sequence operators is refused with an explanation. The mirror of to_citable_mql.
| Name | Required | Description | Default |
|---|---|---|---|
| mql | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It discloses determinism, no model involvement, transformation rules (brackets to indentation, AND to space, quoted strings lose quotes), and handling of GET clauses and refused operators. More detail on error handling could improve it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise (4 sentences), front-loaded with the core purpose, and each sentence adds unique value. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers purpose, behavior, limitations, and sibling relationship. For a conversion tool with one parameter and no output schema, it is largely complete. Could mention output format explicitly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds meaning to the single parameter 'mql' by specifying it is an 'Emdros MQL query', but does not elaborate on expected format or syntax. Given 0% schema coverage, this provides necessary context but could be more precise.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: converting an Emdros MQL query to a Text-Fabric search template. It also differentiates from siblings by noting it is the mirror of to_citable_mql, and its behavior contrasts with run_mql and run_tf.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use (for conversion) and specifies limitations (refuses OR, NOT, FOCUS, sequence operators). However, it does not explicitly state when not to use or provide alternatives among 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.
3 tool updates
v0.9.0- Added
run_tf - Added
to_citable_mql - Added
to_tf_template
3 tool updates
v0.1.0- First observed
lookup_feature - First observed
run_mql - First observed
search_bhsa
TDQS
Scored across 6 tools
Tools are largely distinct: lookup_feature for metadata, run_mql and run_tf for executing queries, search_bhsa for plain-language queries, and two conversion tools. However, search_bhsa's output sometimes overlaps with run_mql/run_tf when it generates MQL, causing slight potential confusion.
Naming follows a consistent verb_noun pattern (lookup_feature, run_mql, run_tf, search_bhsa) with a 'to_' prefix for conversion tools (to_citable_mql, to_tf_template). Minor inconsistency in the naming of search_bhsa (domain name instead of resource) but overall pattern is clear.
6 tools is appropriate for the server's purpose of querying the BHSA Hebrew Bible data. It covers execution, conversion, and metadata lookup without being overwhelming or too sparse.
The tool surface covers core workflows: query execution in two formats, conversion between them, plain-language search, and feature metadata. Minor gaps exist (e.g., no tool to list object types or manage sessions), but the set is reasonably complete for read-only querying.
Maintenance
Related MCP Connectors
Ask questions in plain language, get answers from your business database. No SQL required.
AI-powered biblical research tools — lexicons, morphology, manuscripts, and more.
Bible corpus MCP server: scripture, Greek/Hebrew interlinear data, cross-refs, semantic search.
Ask business questions in plain English. Get instant answers from your database, no SQL needed.