Search Bahá’í texts and read passages in context with source links. Independent, read-only access.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Find document records by title, publication contributor, supported date or matching passage text. Returns metadata and identifiers rather than document text. Omit filters to browse records.
Maximum documents per page, from 1 to 20.
Sort by title or ascending document_date. Date ordering places unknown or ambiguous dates last.
Find titles containing all supplied terms after normalization. Accepts 1–16 terms and supports partial-word matches. Example: Hidden Words.
Continue from a returned next_cursor, keeping all other arguments unchanged.
Inclusive upper bound for supported document dates, in YYYY-MM-DD format. Month-only ranges do not establish an exact day.
Inclusive lower bound for supported document dates, in YYYY-MM-DD format. Month-only date ranges are separate metadata and are excluded from exact date filtering.
Select documents whose date is supported, unknown or ambiguous.
Keep documents containing a passage that matches all supplied terms. Accepts 1–64 searchable terms.
Filter by the exact recorded document type.
Filter by a publication contributor in any recorded role, such as author, issuer, compiler or translator. Accepts a name, recognized alias or contributor ID. Name matching normalizes case, punctuation and diacritics; Bahaullah matches Bahá’u’lláh.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http bahai-mcp https://mcp.bahaigpt.com/mcp
Find document records by title, publication contributor, supported date or matching passage text. Returns metadata and identifiers rather than document text. Omit filters to browse records.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Maximum documents per page, from 1 to 20. |
| order | string | Sort by title or ascending document_date. Date ordering places unknown or ambiguous dates last. |
| query | any | Find titles containing all supplied terms after normalization. Accepts 1–16 terms and supports partial-word matches. Example: Hidden Words. |
| cursor | any | Continue from a returned next_cursor, keeping all other arguments unchanged. |
| date_to | any | Inclusive upper bound for supported document dates, in YYYY-MM-DD format. Month-only ranges do not establish an exact day. |
| date_from | any | Inclusive lower bound for supported document dates, in YYYY-MM-DD format. Month-only date ranges are separate metadata and are excluded from exact date filtering. |
| date_status | any | Select documents whose date is supported, unknown or ambiguous. |
| content_query | any | Keep documents containing a passage that matches all supplied terms. Accepts 1–64 searchable terms. |
| document_type | any | Filter by the exact recorded document type. |
| responsibility | any | Filter by a publication contributor in any recorded role, such as author, issuer, compiler or translator. Accepts a name, recognized alias or contributor ID. Name matching normalizes case, punctuation and diacritics; Bahaullah matches Bahá’u’lláh. |
{
"type": "object",
"title": "query_documentsArguments",
"properties": {
"limit": {
"type": "integer",
"title": "Limit",
"default": 10,
"maximum": 20,
"minimum": 1,
"description": "Maximum documents per page, from 1 to 20."
},
"order": {
"enum": [
"title",
"document_date"
],
"type": "string",
"title": "Order",
"default": "title",
"description": "Sort by title or ascending document_date. Date ordering places unknown or ambiguous dates last."
},
"query": {
"anyOf": [
{
"type": "string",
"maxLength": 512,
"minLength": 1
},
{
"type": "null"
}
],
"title": "Query",
"default": null,
"description": "Find titles containing all supplied terms after normalization. Accepts 1–16 terms and supports partial-word matches. Example: Hidden Words."
},
"cursor": {
"anyOf": [
{
"type": "string",
"maxLength": 2048
},
{
"type": "null"
}
],
"title": "Cursor",
"default": null,
"description": "Continue from a returned next_cursor, keeping all other arguments unchanged."
},
"date_to": {
"anyOf": [
{
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
{
"type": "null"
}
],
"title": "Date To",
"default": null,
"description": "Inclusive upper bound for supported document dates, in YYYY-MM-DD format. Month-only ranges do not establish an exact day."
},
"date_from": {
"anyOf": [
{
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
{
"type": "null"
}
],
"title": "Date From",
"default": null,
"description": "Inclusive lower bound for supported document dates, in YYYY-MM-DD format. Month-only date ranges are separate metadata and are excluded from exact date filtering."
},
"date_status": {
"anyOf": [
{
"enum": [
"supported",
"unknown",
"ambiguous"
],
"type": "string"
},
{
"type": "null"
}
],
"title": "Date Status",
"default": null,
"description": "Select documents whose date is supported, unknown or ambiguous."
},
"content_query": {
"anyOf": [
{
"type": "string",
"maxLength": 2048,
"minLength": 1
},
{
"type": "null"
}
],
"title": "Content Query",
"default": null,
"description": "Keep documents containing a passage that matches all supplied terms. Accepts 1–64 searchable terms."
},
"document_type": {
"anyOf": [
{
"type": "string",
"maxLength": 128
},
{
"type": "null"
}
],
"title": "Document Type",
"default": null,
"description": "Filter by the exact recorded document type."
},
"responsibility": {
"anyOf": [
{
"type": "string",
"maxLength": 512
},
{
"type": "null"
}
],
"title": "Responsibility",
"default": null,
"description": "Filter by a publication contributor in any recorded role, such as author, issuer, compiler or translator. Accepts a name, recognized alias or contributor ID. Name matching normalizes case, punctuation and diacritics; Bahaullah matches Bahá’u’lláh."
}
},
"additionalProperties": false
}Return the library’s snapshot identity, document and passage counts, coverage and tool limits.
No arguments.
{
"type": "object",
"title": "library_infoArguments",
"properties": {},
"additionalProperties": false
}List sections derived from recorded source headings, preserving their hierarchy. Return titles and identifiers for reading sections or browsing their children.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Maximum sections per page, from 1 to 20. |
| cursor | any | Continue from a returned next_cursor, keeping all other arguments unchanged. |
| section_id | any | Parent section whose direct children to list. Omit to list root sections. |
| version_id* | string | Text-version ID from a returned passage or work occurrence. |
{
"type": "object",
"title": "browse_sectionsArguments",
"required": [
"version_id"
],
"properties": {
"limit": {
"type": "integer",
"title": "Limit",
"default": 10,
"maximum": 20,
"minimum": 1,
"description": "Maximum sections per page, from 1 to 20."
},
"cursor": {
"anyOf": [
{
"type": "string",
"maxLength": 2048
},
{
"type": "null"
}
],
"title": "Cursor",
"default": null,
"description": "Continue from a returned next_cursor, keeping all other arguments unchanged."
},
"section_id": {
"anyOf": [
{
"type": "string",
"maxLength": 256
},
{
"type": "null"
}
],
"title": "Section Id",
"default": null,
"description": "Parent section whose direct children to list. Omit to list root sections."
},
"version_id": {
"type": "string",
"title": "Version Id",
"maxLength": 256,
"minLength": 1,
"description": "Text-version ID from a returned passage or work occurrence."
}
},
"additionalProperties": false
}Look up a catalogued work by reviewed title alias, passage ID or work ID. Works may appear separately or inside larger publications. Return available languages and recorded source versions, including coverage and availability. Supply exactly one lookup parameter.
| Argument | Type | Description |
|---|---|---|
| query | any | A reviewed title alias. Matching normalizes case, punctuation and diacritics. Example: Tablet of Ahmad. |
| work_id | any | Retrieve the catalogue entry for this work ID. |
| passage_id | any | Find work mappings associated with this passage occurrence. |
{
"type": "object",
"title": "discover_workArguments",
"properties": {
"query": {
"anyOf": [
{
"type": "string",
"maxLength": 512,
"minLength": 1
},
{
"type": "null"
}
],
"title": "Query",
"default": null,
"description": "A reviewed title alias. Matching normalizes case, punctuation and diacritics. Example: Tablet of Ahmad."
},
"work_id": {
"anyOf": [
{
"type": "string",
"maxLength": 256
},
{
"type": "null"
}
],
"title": "Work Id",
"default": null,
"description": "Retrieve the catalogue entry for this work ID."
},
"passage_id": {
"anyOf": [
{
"type": "string",
"maxLength": 256
},
{
"type": "null"
}
],
"title": "Passage Id",
"default": null,
"description": "Find work mappings associated with this passage occurrence."
}
},
"additionalProperties": false
}Read an identified passage, complete source group, section or recorded work version. Supports continued reading and adjacent-source navigation. Supply exactly one source identifier; work_id also requires language.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Maximum passages per page, from 1 to 5. A passage target returns one selected passage plus requested context. |
| cursor | any | Continue from next_cursor, keeping all other arguments unchanged. |
| context | integer | For a current passage target, include adjacent passage positions on each side, from 0 to 3. |
| unit_id | any | Read this complete source group, such as a Q&A pair or multi-paragraph extract. |
| work_id | any | Read a catalogued work in the requested language, using its default eligible source version. Supply language. If several versions qualify, the result lists the choices. |
| language | any | Recorded language value to select with work_id, such as ar, en or fa. Use und for unknown-language or mul for mixed-language occurrences. |
| direction | string | Select current, next or previous content. Passage targets navigate adjacent passages; group targets navigate adjacent groups or ungrouped passages. Navigation stays within the enclosing section, or text version where no section is mapped. Section and work-version targets use current. |
Search complete source-defined Q&A pairs, numbered selections and extracts. Terms may occur in different component passages—for example, one in a question and another in its answer. Results return the individually cited components. Coverage: The Kitáb-i-Aqdas Q&A, The Hidden Words selections, and extracts in To Set the World in Order: Building and Preserving Strong Marriages. Additional reviewed compilation extracts: Social Action, Family Life, and Women.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Maximum units per page, from 1 to 10. |
| query* | string | Words to find across a source unit. Accepts 1–64 searchable terms. Example: sick permissible can match terms divided between a question and its answer. |
| author | any | Keep units where every component passage has this recorded author. Accepts a name, recognized alias or contributor ID. Name matching normalizes case, punctuation and diacritics; Bahaullah matches Bahá’u’lláh. Only scoped author roles qualify, including supported derived assignments; publication credits and on-behalf-of responsibility do not qualify. Unknown/conflicting scope is excluded. Every component must match. |
| cursor | any | Continue from a returned next_cursor, keeping all other arguments unchanged. |
| phrase | boolean | Match the query words as one adjacent phrase in the normalized unit text. |
Search individual passage text lexically. All query terms must occur within one passage. Matching normalizes case, punctuation and diacritics. Filters apply before duplicate quotation grouping.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Maximum results per page, from 1 to 50. |
| query* | string | Words to find in passage text. Accepts 1–64 searchable terms. Example: justice unity. |
| author | any | Filter by recorded passage author. Accepts a name, recognized alias or contributor ID. Name matching normalizes case, punctuation and diacritics; Bahaullah matches Bahá’u’lláh. Only scoped author roles qualify, including supported derived assignments; publication credits and on-behalf-of responsibility do not qualify. Unknown/conflicting scope is excluded. |
| cursor | any | Continue from a returned next_cursor, keeping all other arguments unchanged. |
| issuer | any | Filter by recorded publication issuer. Accepts a name, recognized alias or contributor ID. Name matching normalizes case, punctuation and diacritics; Bahaullah matches Bahá’u’lláh. |
| phrase | boolean | Match the query words as one adjacent phrase after normalization. |
| context |
We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 6, 2026.
| passage_id | any | Read this exact passage occurrence. |
| section_id | any | Read this source section in order, including its headings. |
| text_chars | integer | Maximum Unicode characters per passage slice: 1–12,000 for passage targets; 1–4,000 for other targets. |
| text_start | integer | Starting Unicode character offset for a passage target. Defaults to 0. |
| occurrence_id | any | Read a work version listed in returned work metadata, within its recorded source boundaries. |
{
"type": "object",
"title": "read_textArguments",
"properties": {
"limit": {
"type": "integer",
"title": "Limit",
"default": 5,
"maximum": 5,
"minimum": 1,
"description": "Maximum passages per page, from 1 to 5. A passage target returns one selected passage plus requested context."
},
"cursor": {
"anyOf": [
{
"type": "string",
"maxLength": 4096
},
{
"type": "null"
}
],
"title": "Cursor",
"default": null,
"description": "Continue from next_cursor, keeping all other arguments unchanged."
},
"context": {
"type": "integer",
"title": "Context",
"default": 0,
"maximum": 3,
"minimum": 0,
"description": "For a current passage target, include adjacent passage positions on each side, from 0 to 3."
},
"unit_id": {
"anyOf": [
{
"type": "string",
"maxLength": 256
},
{
"type": "null"
}
],
"title": "Unit Id",
"default": null,
"description": "Read this complete source group, such as a Q&A pair or multi-paragraph extract."
},
"work_id": {
"anyOf": [
{
"type": "string",
"maxLength": 256
},
{
"type": "null"
}
],
"title": "Work Id",
"default": null,
"description": "Read a catalogued work in the requested language, using its default eligible source version. Supply language. If several versions qualify, the result lists the choices."
},
"language": {
"anyOf": [
{
"type": "string",
"maxLength": 64
},
{
"type": "null"
}
],
"title": "Language",
"default": null,
"description": "Recorded language value to select with work_id, such as ar, en or fa. Use und for unknown-language or mul for mixed-language occurrences."
},
"direction": {
"enum": [
"current",
"next",
"previous"
],
"type": "string",
"title": "Direction",
"default": "current",
"description": "Select current, next or previous content. Passage targets navigate adjacent passages; group targets navigate adjacent groups or ungrouped passages. Navigation stays within the enclosing section, or text version where no section is mapped. Section and work-version targets use current."
},
"passage_id": {
"anyOf": [
{
"type": "string",
"maxLength": 256
},
{
"type": "null"
}
],
"title": "Passage Id",
"default": null,
"description": "Read this exact passage occurrence."
},
"section_id": {
"anyOf": [
{
"type": "string",
"maxLength": 256
},
{
"type": "null"
}
],
"title": "Section Id",
"default": null,
"description": "Read this source section in order, including its headings."
},
"text_chars": {
"type": "integer",
"title": "Text Chars",
"default": 4000,
"maximum": 12000,
"minimum": 1,
"description": "Maximum Unicode characters per passage slice: 1–12,000 for passage targets; 1–4,000 for other targets."
},
"text_start": {
"type": "integer",
"title": "Text Start",
"default": 0,
"minimum": 0,
"description": "Starting Unicode character offset for a passage target. Defaults to 0."
},
"occurrence_id": {
"anyOf": [
{
"type": "string",
"maxLength": 256
},
{
"type": "null"
}
],
"title": "Occurrence Id",
"default": null,
"description": "Read a work version listed in returned work metadata, within its recorded source boundaries."
}
},
"additionalProperties": false
}| language |
| any |
| Strict exact passage language from the versioned evidence projection when installed, otherwise source-recorded language. Unknown/conflicting values are excluded; hints and website locale are not text language. Zero results do not establish source absence. Every component, including markers, must match. |
| document_id | any | Restrict results to units from one document ID. |
| document_type | any | Filter by the exact recorded document type. |
| responsibility | any | Filter by a publication contributor in any recorded role, such as author, issuer, compiler or translator. Accepts a name, recognized alias or contributor ID. Name matching normalizes case, punctuation and diacritics; Bahaullah matches Bahá’u’lláh. |
{
"type": "object",
"title": "search_unitsArguments",
"required": [
"query"
],
"properties": {
"limit": {
"type": "integer",
"title": "Limit",
"default": 5,
"maximum": 10,
"minimum": 1,
"description": "Maximum units per page, from 1 to 10."
},
"query": {
"type": "string",
"title": "Query",
"maxLength": 2048,
"minLength": 1,
"description": "Words to find across a source unit. Accepts 1–64 searchable terms. Example: sick permissible can match terms divided between a question and its answer."
},
"author": {
"anyOf": [
{
"type": "string",
"maxLength": 512
},
{
"type": "null"
}
],
"title": "Author",
"default": null,
"description": "Keep units where every component passage has this recorded author. Accepts a name, recognized alias or contributor ID. Name matching normalizes case, punctuation and diacritics; Bahaullah matches Bahá’u’lláh. Only scoped author roles qualify, including supported derived assignments; publication credits and on-behalf-of responsibility do not qualify. Unknown/conflicting scope is excluded. Every component must match."
},
"cursor": {
"anyOf": [
{
"type": "string",
"maxLength": 2048
},
{
"type": "null"
}
],
"title": "Cursor",
"default": null,
"description": "Continue from a returned next_cursor, keeping all other arguments unchanged."
},
"phrase": {
"type": "boolean",
"title": "Phrase",
"default": false,
"description": "Match the query words as one adjacent phrase in the normalized unit text."
},
"language": {
"anyOf": [
{
"type": "string",
"maxLength": 64
},
{
"type": "null"
}
],
"title": "Language",
"default": null,
"description": "Strict exact passage language from the versioned evidence projection when installed, otherwise source-recorded language. Unknown/conflicting values are excluded; hints and website locale are not text language. Zero results do not establish source absence. Every component, including markers, must match."
},
"document_id": {
"anyOf": [
{
"type": "string",
"maxLength": 256
},
{
"type": "null"
}
],
"title": "Document Id",
"default": null,
"description": "Restrict results to units from one document ID."
},
"document_type": {
"anyOf": [
{
"type": "string",
"maxLength": 128
},
{
"type": "null"
}
],
"title": "Document Type",
"default": null,
"description": "Filter by the exact recorded document type."
},
"responsibility": {
"anyOf": [
{
"type": "string",
"maxLength": 512
},
{
"type": "null"
}
],
"title": "Responsibility",
"default": null,
"description": "Filter by a publication contributor in any recorded role, such as author, issuer, compiler or translator. Accepts a name, recognized alias or contributor ID. Name matching normalizes case, punctuation and diacritics; Bahaullah matches Bahá’u’lláh."
}
},
"additionalProperties": false
}| integer |
| Include up to this many adjacent passage positions on each side of each result, from 0 to 3. |
| language | any | Strict exact passage language from the versioned evidence projection when installed, otherwise source-recorded language. Unknown/conflicting values are excluded; hints and website locale are not text language. Zero results do not establish source absence. |
| document_id | any | Restrict results to one document ID. |
| document_type | any | Filter by the exact recorded document type. |
| language_hint | any | Filter by the language hint recorded in the source markup. |
| group_duplicates | boolean | Group matching occurrences of the same quotation. Set to false to return occurrences individually. |
{
"type": "object",
"title": "searchArguments",
"required": [
"query"
],
"properties": {
"limit": {
"type": "integer",
"title": "Limit",
"default": 5,
"maximum": 50,
"minimum": 1,
"description": "Maximum results per page, from 1 to 50."
},
"query": {
"type": "string",
"title": "Query",
"maxLength": 2048,
"minLength": 1,
"description": "Words to find in passage text. Accepts 1–64 searchable terms. Example: justice unity."
},
"author": {
"anyOf": [
{
"type": "string",
"maxLength": 512
},
{
"type": "null"
}
],
"title": "Author",
"default": null,
"description": "Filter by recorded passage author. Accepts a name, recognized alias or contributor ID. Name matching normalizes case, punctuation and diacritics; Bahaullah matches Bahá’u’lláh. Only scoped author roles qualify, including supported derived assignments; publication credits and on-behalf-of responsibility do not qualify. Unknown/conflicting scope is excluded."
},
"cursor": {
"anyOf": [
{
"type": "string",
"maxLength": 2048
},
{
"type": "null"
}
],
"title": "Cursor",
"default": null,
"description": "Continue from a returned next_cursor, keeping all other arguments unchanged."
},
"issuer": {
"anyOf": [
{
"type": "string",
"maxLength": 512
},
{
"type": "null"
}
],
"title": "Issuer",
"default": null,
"description": "Filter by recorded publication issuer. Accepts a name, recognized alias or contributor ID. Name matching normalizes case, punctuation and diacritics; Bahaullah matches Bahá’u’lláh."
},
"phrase": {
"type": "boolean",
"title": "Phrase",
"default": false,
"description": "Match the query words as one adjacent phrase after normalization."
},
"context": {
"type": "integer",
"title": "Context",
"default": 0,
"maximum": 3,
"minimum": 0,
"description": "Include up to this many adjacent passage positions on each side of each result, from 0 to 3."
},
"language": {
"anyOf": [
{
"type": "string",
"maxLength": 64
},
{
"type": "null"
}
],
"title": "Language",
"default": null,
"description": "Strict exact passage language from the versioned evidence projection when installed, otherwise source-recorded language. Unknown/conflicting values are excluded; hints and website locale are not text language. Zero results do not establish source absence."
},
"document_id": {
"anyOf": [
{
"type": "string",
"maxLength": 256
},
{
"type": "null"
}
],
"title": "Document Id",
"default": null,
"description": "Restrict results to one document ID."
},
"document_type": {
"anyOf": [
{
"type": "string",
"maxLength": 128
},
{
"type": "null"
}
],
"title": "Document Type",
"default": null,
"description": "Filter by the exact recorded document type."
},
"language_hint": {
"anyOf": [
{
"type": "string",
"maxLength": 64
},
{
"type": "null"
}
],
"title": "Language Hint",
"default": null,
"description": "Filter by the language hint recorded in the source markup."
},
"group_duplicates": {
"type": "boolean",
"title": "Group Duplicates",
"default": true,
"description": "Group matching occurrences of the same quotation. Set to false to return occurrences individually."
}
},
"additionalProperties": false
}