Search, navigate, and explore the Quran through 8 MCP tools — verses, surahs, lemmas, roots, and morphology. Hosted at mcp.quran.us.kg.
This server demonstrates solid definition quality with well-structured tool naming, comprehensive input schemas, and clear descriptions. All 8 tools follow verb-noun conventions (find_, get_, list_, search_) and have non-empty descriptions (range: 55 - 110 characters, within the 10 - 1024 baseline). Input parameters are consistently typed with JSON Schema and include descriptions. However, output schemas are not explicitly documented in the source code, they are inferred from the implementation, and tool descriptions lack strategic context about when to use each tool vs. alternatives. Error handling guidance is minimal. The server shows disciplined TypeScript practices (strict types, Zod validation, linting), but definition quality doesn't quite reach 'A' tier without visible output schema documentation.
Find verses containing a normalized lemma via the inverted lemma index. Paginated.
Find verses containing a normalized Arabic root via the inverted root index. Paginated.
Look up one surah by numeric id (1–114), Arabic name, English name, or romanization. Returns the matching record or null.
Get a single verse by gid or by (suraId, ayaId). Returns the verse text and metadata or null.
Get the lemmas and roots for a single verse by gid or by (suraId, ayaId). Returns morphology or null.
Get multiple consecutive verses within a surah by gid range or (suraId, startAyaId, endAyaId). Returns array of verses.
List all 114 surahs with their basic metadata (id, names, verse counts, revelation order, revelation type).
Output schemas not documented in tool definitions. The API responses for each tool are not formally described in the tool registration code, only inferred from implementation. LLMs cannot determine downstream field names, types, or required vs. optional fields without explicit documentation.
Tool descriptions lack strategic context. Descriptions explain WHAT the tool does but omit WHEN to use it vs. similar tools. For example, find_verses_by_lemma and find_verses_by_root are both search tools but the description does not explain the linguistic distinction (lemma vs. root) or which to call for different use cases.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 63 | <=2025-11-25 | v2 |
Search the Quran for verses matching a free-text query. Uses the inverted index for fast, lemma-normalized search. Paginated.
Error handling guidance absent. Tool descriptions and schema do not indicate what errors are possible (e.g., invalid suraId, verse out of range) or recovery strategies. For example, get_verse with suraId=120 will fail, but the description does not guide the agent on limits (1 - 114) or what to do if a lookup fails.
get_sura_info parameter 'identifier' uses a union type with oneOf but does not clarify the precedence or behavior when the value could match both numeric and string forms (e.g., '1' as a string vs. numeric 1). The description should disambiguate: does numeric ID take precedence? What happens if a surah name matches a number?
list_surahs() accepts no parameters (empty input schema) but the description does not clarify if results are paginated, sorted, or complete. The baseline rubric expects pagination for list tools; this tool returns all 114 records but does not document whether batching or pagination is ever needed.