MCP server exposing the IslamQA.org fatwa archive — search ~98,000 sourced Islamic legal answers from Claude, Codex, or any MCP client
Server has 8 tools with mostly complete schemas and descriptions. Tool naming follows verb_noun convention (search_fatwas, get_fatwa, list_sources, browse_fatwas, index_status, rebuild_index). Descriptions are substantive (100-250 chars typical), explaining WHAT, WHEN, and context. Parameters have types and descriptions. However, two tools (search, fetch in cli.py) appear to be duplicates of server.py tools with minimal descriptions, and output schemas are not explicitly documented. Tool annotations are present (read_only_hint, destructive_hint) but only on 6 of 8 tools. Error handling via _error() function exists but lacks recovery guidance in tool descriptions.
List the most recent fatwas, optionally filtered to one madhhab or issuing source. For browsing; prefer search_fatwas to answer a specific question.
Retrieve the full text of one fatwa by its id, as returned by `search`.
Fetch one full fatwa from IslamQA.org by URL: the original question, the mufti's answer, the Arabic citations of classical texts, the issuing darul ifta and a link to their own copy. Cached locally after the first read.
Report how many fatwas are indexed, how many have been read into the local full-text cache, and when the index was last rebuilt.
List every darul ifta indexed by IslamQA.org, grouped by madhhab, with how many answers each contributed. Use to discover valid 'source' values for search_fatwas, or to see how the schools are represented.
Rebuild the local URL index from islamqa.org's sitemap. Rarely needed — the index builds itself on first search and refreshes when stale. Takes about a minute and makes roughly 22 requests to the site.
Duplicate tools with inconsistent naming: search_fatwas (server.py) vs search (cli.py), get_fatwa vs fetch. LLMs will conflate similar tools and waste reasoning cycles deciding between them.
Output schemas not documented. Tool descriptions state what is returned (e.g. 'Returns ranked results with title, madhhab, issuing source and URL') but no formal schema is visible. LLMs cannot plan downstream calls without knowing exact field names and types.
Error handling lacks recovery guidance. _error() function returns generic error dicts but tool descriptions do not explain what to do on failure (e.g. 'If search fails, try a simpler query' or 'If URL is invalid, call search_fatwas first').
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 58 | 2026-07-28+ | v2 |
Search Islamic legal answers (fatwas) on IslamQA.org. Returns a list of matching fatwas. Use `fetch` with a result's id to read the full question and answer.
Search roughly 100,000 fatwas (Islamic legal answers) on IslamQA.org by keyword or question. Use this whenever a question concerns Islamic rulings, fiqh, worship or practice and you want sourced scholarly answers rather than your own knowledge. Returns ranked results with title, madhhab, issuing source and URL; call get_fatwa on a result to read the full answer.
Tool annotations incomplete: search and fetch tools in cli.py lack annotations. Only 6 of 8 tools have read_only_hint/destructive_hint declared.
Minimal descriptions on cli.py tools: 'search' has 35-char description ('Search Islamic legal answers...'), 'fetch' has 40 chars. Below the 50-char baseline for clarity. These are too terse to guide LLM selection.