Comprehensive Model Context Protocol server for managing Home Assistant through AI assistants.
Quran Gallery is installed from its publisher's own source and answers where it runs, so this marketplace is not in the path of a single call. There is no address here to send one to, and a panel that pretended otherwise would be showing you an answer we made up. Install it and call it from your own client — the Installation tab has the entry for each one.
What it does
Classical Islamic library (Shamela, 8,594 books): verbatim Arabic cited by volume and page. No key.
Quickstart
# 1 — add it to Claude Code
claude mcp add --scope user --transport http quran-gallery-mcp https://qurangallery.com/mcp/shamela
# 2 — ask your agent for something these tools do
# search_library, search, fetch and 36 more
Quran Gallery costs nothing on mcprush: there is no plan to choose here, no cap to set and nothing mcprush can bill you for.
Collected from a public index. Nobody has claimed this account, so nothing here was written by its author — claim it if it is yours.
Where are you running it?
Every route below installs the same thing and ends at the same approval screen. Nothing here runs on your machine and nothing runs on ours: this server answers at its publisher’s own address, and what you install is the connection straight to it.
This is a public server: it answers at its publisher’s own address and this marketplace is not in the path. Claude Code registers it in one command; --scope user makes it available in every project. The transport below is http, as the publisher's own manifest declares it.
claude mcp add --scope user --transport http quran-gallery-mcp https://qurangallery.com/mcp/shamelaReconnect, or start a new session, and the tools appear in the model’s tool list.
One config entry pointing straight at the publisher’s own address — this marketplace is not in the path, and nothing from this listing executes on your machine.
39 tools, with what each one reads, writes and reaches shown before you agree — the same list on every route above. Read the tool surface.
Tool surface
What the model actually sees. Descriptions are diffed on every release — see version history.
Search a Maktabah al-Shamela library of 8,594 classical works and return passages with the book, author, printed edition page and the verbatim Arabic. Each passage also carries its edition, editor and publisher when the library records them, and a sourceUrl on shamela.ws. Runs an exact-phrase pass first and falls back to a token search, reporting which one answered. A scope is REQUIRED: unscoped r
| Parameter | Type | Required | Notes |
|---|---|---|---|
| query | string | yes | Arabic search text. A quoted wording works best; a topic also works. |
| scope | string | yes | hadith-primary — The eight primary hadith collections, edition-pinned; tafsir-canonical — Canonical tafsir — Ibn Kathir, al-Tabari, Ibn al-Jawzi first; fiqh-hanafi — Hanafi fiqh (+ usul, comparative); |
| limit | integer | no | Maximum passages to return (max 10). |
Search all 8,594 works of the classical Islamic library and return up to 10 matching pages as {id, title, url}. Pass an id to fetch to read that page. Query in ARABIC. A title ending in [footnote match] matched only an editor's footnote, not the main text; [token match] means the exact phrase was not found and the words occur separately. This search is unscoped and ranks by term frequency; for a
| Parameter | Type | Required | Notes |
|---|---|---|---|
| query | string | yes | Arabic search text — a quoted wording or a topic. |
Read one library page by the id search returned ("{bookId}:{pageId}"). Returns the main text and, under a separate label, the footnotes — the editor's notes, not the author's words — with book, author, printed volume/page, the edition data the library records, and the shamela.ws link.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | A document id from search, e.g. "117359:1796". |
بحث في صفحات الكتب Search the body (matn) and footnotes (الحواشي) of every Shamela page the user has downloaded locally. AND-combines tokens; each token can match in any of the search_in fields. Default scope is the full downloaded library; pass scope (book_ids/author_ids/category_ids/period_*/downloaded_only/madhab/book_type/citable_only) to narrow. scope.madhab ('hanafi'|'maliki'|'shafii'|'
| Parameter | Type | Required | Notes |
|---|---|---|---|
| query | string | yes | Arabic search phrase. Multiple words are AND-combined; each can match in body or footnotes. If a word does not exist in the library under the spelling you used, the spelling the books DO use is search |
| scope | object | no | Restrict the search to specific books, authors, categories, or a Hijri date range. Use shamela_list_categories / shamela_resolve to find IDs. |
| options | object | no | Search options: morphology, wildcards, sort, search_in (body/foot), relax_when_empty. Defaults to body+foot, no toggles. preserve_* redirect to shamela_search_exact. |
| exclude_book_ids | array | no | Book ids to keep out of the results entirely. |
| exclude_author_ids | array | no | Exclude every book by these authors. |
| exclude_category_ids | array | no | Exclude every book on these shelves. |
| exclude_work_group_ids | array | no | Exclude every catalogue entry of these works — all printings at once. This is the one to use after a round returned «صحيح البخاري - ط السلطانية»: excluding that book_id alone leaves the other seven en |
| exclude_pages | array | no | Exact pages to keep out — the pages a previous round already returned. Excluding these rather than whole books is what lets a follow-up search find MORE evidence in a book that has already contributed |
| limit | integer | no | Maximum number of results to return (1-100, default 20). |
| offset | integer | no | Number of results to skip for pagination. Use with limit to page through large result sets. The response includes has_more and next_offset to drive paging. |
| response_format | string | no | Output format for the human-readable text. 'markdown' (default) is best for direct display; 'json' returns the same data as a single JSON code block; 'none' skips the rendered text entirely and return |
| shape | string | no | How much of each hit to return. 'full' (default) is every field on every row, including the snippets — ask for this when the answer will QUOTE the page. 'brief' keeps book_id/page_id, printed_page, ma |
بحث في عناوين الفصول Search Shamela's title/ Lucene index for chapter and section titles. Same query/scope/options/pagination shape as shamela_search_pages but matches title text rather than page bodies. After finding a matching title, use shamela_get_book_section(book_id, title_id) to read the full section. Examples: shamela_search_titles({query:'باب الصيام'}), shamela_search_titles({query:'تعري
| Parameter | Type | Required | Notes |
|---|---|---|---|
| query | string | yes | Arabic search phrase. Matches against chapter / section title text. |
| scope | object | no | Same scope filter as shamela_search_pages (book_ids, author_ids, category_ids, period_*, downloaded_only). |
| options | object | no | morphology / wildcards / preserve_* (preserve_* deferred to v1.1). search_in is ignored — titles are a single field. |
| limit | integer | no | Maximum number of results to return (1-100, default 20). |
| offset | integer | no | Number of results to skip for pagination. Use with limit to page through large result sets. The response includes has_more and next_offset to drive paging. |
| response_format | string | no | Output format for the human-readable text. 'markdown' (default) is best for direct display; 'json' returns the same data as a single JSON code block; 'none' skips the rendered text entirely and return |
بحث في فهرس الكتب Search Shamela's catalog of ~8,500 books by name, author, bibliography text, OR the editorial description of what the book is about (1,729 entries carry one, averaging ~1,500 characters). That last field is what finds a book by SUBJECT rather than title: «الرجز» matches 0 titles and 2 descriptions. Each hit reports matched_in: 'bibliography' (title/author/publication line) or
| Parameter | Type | Required | Notes |
|---|---|---|---|
| query | string | yes | Arabic search phrase matched against the book name + author + bibliography concatenation. |
| scope | object | no | Optional: restrict to specific authors, categories, periods, or downloaded-only. |
| options | object | no | morphology / wildcards / relax_when_empty / preserve_*. |
| limit | integer | no | Maximum number of results to return (1-100, default 20). |
| offset | integer | no | Number of results to skip for pagination. Use with limit to page through large result sets. The response includes has_more and next_offset to drive paging. |
| response_format | string | no | Output format for the human-readable text. 'markdown' (default) is best for direct display; 'json' returns the same data as a single JSON code block; 'none' skips the rendered text entirely and return |
بحث في فهرس المؤلفين Search Shamela's ~3,200-author catalog by name or biography text. Pre-built index — no downloads needed. No scope (authors aren't scoped by category/period). Returns author name, Hijri death year, and book count. options.sort:'chronological' orders by death year, earliest first. Arabic scholars go by several name forms — when a query misses, try the kunya, nisba, and shuhra
| Parameter | Type | Required | Notes |
|---|---|---|---|
| query | string | yes | Arabic search phrase matched against author name + biography. |
| options | object | no | morphology / wildcards. No scope (authors aren't scoped by category/period). |
| limit | integer | no | Maximum number of results to return (1-100, default 20). |
| offset | integer | no | Number of results to skip for pagination. Use with limit to page through large result sets. The response includes has_more and next_offset to drive paging. |
| response_format | string | no | Output format for the human-readable text. 'markdown' (default) is best for direct display; 'json' returns the same data as a single JSON code block; 'none' skips the rendered text entirely and return |
جلب صفحة Fetch the full text of one Shamela page (book_id, page_id). Returns body (matn), foot (footnotes), comment (user notes), printed_page label, prev/next page ids, the chapter ancestor chain (root → leaf), and the category path. Set keep_html=true to preserve inline <span data-type='title'> markers; default strips them. The book must be downloaded (BOOK_NOT_DOWNLOADED otherwise). For batch
| Parameter | Type | Required | Notes |
|---|---|---|---|
| book_id | integer | yes | The book id. |
| page_id | integer | yes | The page id (Lucene/SQLite internal id, not the printed page number). |
| keep_html | boolean | no | If true, preserve inline HTML markers (e.g. <span data-type='title'>). Default false strips them for plain Arabic display. |
| body_part | integer | no | For long pages: when the body exceeds ~4000 characters it is split into parts. Pass the 1-based part to read (default 1). The response reports body_part/body_total_parts/body_has_more; request the nex |
| response_format | string | no | Output format for the human-readable text. 'markdown' (default) is best for direct display; 'json' returns the same data as a single JSON code block; 'none' skips the rendered text entirely and return |
جلب فهرس الكتاب Fetch a downloaded book's table of contents. Two modes: (a) subtree mode (default) — pass parent_id (0 = top level) and depth (1–5) to get a tree of titles; (b) ancestor-chain mode — pass containing_page_id to get the root → leaf chapter chain that contains that page. Returns title_id, title_text, page_id, has_children for each entry. Use the title_id with shamela_get_book_section
| Parameter | Type | Required | Notes |
|---|---|---|---|
| book_id | integer | yes | The book id. |
| parent_id | integer | no | Title id whose children to expand. 0 (default) returns top-level chapters. |
| depth | integer | no | How many levels deep to recurse (1–5, default 1). |
| containing_page_id | integer | no | Alternate mode: instead of returning a subtree, return the ancestor chain (root → leaf chapter) for this page. |
| response_format | string | no | Output format for the human-readable text. 'markdown' (default) is best for direct display; 'json' returns the same data as a single JSON code block; 'none' skips the rendered text entirely and return |
جلب بيانات كتاب Fetch full metadata for a book by book_id. Returns book_name, all authors (main + co), category, book_type (printed/manuscript/journal/thesis/electronic/audio), book_date (Shamela's «تاريخ الكتاب» — on 98.5% of dated books this is the MAIN AUTHOR's death year, not a composition year; do not cite it as one), printed flag, downloaded flag (true ONLY when both master.db says so AND t
| Parameter | Type | Required | Notes |
|---|---|---|---|
| book_id | integer | yes | The book id (e.g. 9942). |
| include_cover | boolean | no | Attach the book's cover image as an MCP image block when Shamela ships one (1,368 of 8,594 books). The picture is a ~310x460 thumbnail of the scanned printing's title page, so it costs roughly 190 ima |
| response_format | string | no | Output format for the human-readable text. 'markdown' (default) is best for direct display; 'json' returns the same data as a single JSON code block; 'none' skips the rendered text entirely and return |
جلب بيانات مؤلف Fetch metadata for an author by author_id, optionally with the list of books they authored. Returns author_name, death_year (null if unknown or modern), death_text (display string), and the book list (main + co-authored). Each book entry has book_id, book_name, book_date, downloaded flag. Use include_books=false to skip the book list when you only need name/death year. Example: sh
| Parameter | Type | Required | Notes |
|---|---|---|---|
| author_id | integer | yes | The author id (e.g. 57 for Ibn Uthaymeen). |
| include_books | boolean | no | If true (default), include the list of books authored by this author. Includes co-authored books. |
| response_format | string | no | Output format for the human-readable text. 'markdown' (default) is best for direct display; 'json' returns the same data as a single JSON code block; 'none' skips the rendered text entirely and return |
قائمة التصنيفات List all 41 categories in Shamela's catalog. Categories are flat (no parent_id, no transitive expansion). Each entry has category_id, category_name, and book_count (total books in catalog under that category). Use category_id values with scope.category_ids in search_pages / search_books to narrow searches. Set include_counts=false to skip the book counts (slightly faster but count
| Parameter | Type | Required | Notes |
|---|---|---|---|
| include_counts | boolean | no | If true (default), include book_count for each category. Costs nothing — counts are precomputed. |
| downloaded_only | boolean | no | If true, list only categories where the user has at least one book downloaded locally. Useful to see where this install's library is concentrated across the 41 categories. |
| response_format | string | no | Output format for the human-readable text. 'markdown' (default) is best for direct display; 'json' returns the same data as a single JSON code block; 'none' skips the rendered text entirely and return |
تحويل اسم إلى معرِّف Disambiguate Arabic name fragments to book_ids and/or author_ids. Uses the pre-built s_book/ + s_author/ n-gram indexes for fast partial matching. type='book' searches only books, 'author' only authors, 'any' (default) both. Returns up to limit results per type with confidence scores. Use this BEFORE search_pages / search_books / search_authors when the user mentions a name
| Parameter | Type | Required | Notes |
|---|---|---|---|
| query | string | yes | Arabic name fragment to resolve. Use partial names: 'ابن قدامة' resolves Ibn Qudamah, 'الروضة' resolves books with that word in their title. |
| type | string | no | 'book' searches the s_book/ index, 'author' searches s_author/, 'any' (default) searches both. |
| limit | integer | no | Maximum results per type (1–20, default 5). |
| response_format | string | no | Output format for the human-readable text. 'markdown' (default) is best for direct display; 'json' returns the same data as a single JSON code block; 'none' skips the rendered text entirely and return |
جلب نطاق صفحات Fetch N (1–20, default 5) consecutive pages from a downloaded book starting at start_page_id. Faster than calling shamela_get_page in a loop. Each page entry has page_id, printed_page, part, body, foot, comment. has_more flag indicates whether more pages exist after the returned range. Very long ranges are cut short to stay within a size budget; when that happens the response sets
| Parameter | Type | Required | Notes |
|---|---|---|---|
| book_id | integer | yes | The book id. |
| start_page_id | integer | yes | First page_id (inclusive). |
| count | integer | no | How many consecutive pages to fetch (1–20, default 5). Use shamela_get_book_section for full chapter reads. |
| keep_html | boolean | no | Preserve inline HTML markers. |
| response_format | string | no | Output format for the human-readable text. 'markdown' (default) is best for direct display; 'json' returns the same data as a single JSON code block; 'none' skips the rendered text entirely and return |
جلب باب من كتاب Fetch every page under a chapter title. Resolves the chapter's start/end page range from the per-book SQLite (next-sibling-title boundary), then batch-reads the page contents. Capped at max_pages (default 30, max 100); sets truncated:true if the section is longer. Long sections also stop early on a character budget (even within max_pages) and return next_start_page_id + a `_disp
| Parameter | Type | Required | Notes |
|---|---|---|---|
| book_id | integer | yes | The book id. |
| title_id | integer | yes | The title id of the chapter / section to fetch (use shamela_get_toc to find IDs). |
| max_pages | integer | no | Cap on pages to read (1–100, default 30). Sections longer than this are truncated with a flag. |
| keep_html | boolean | no | Preserve inline HTML markers. |
| response_format | string | no | Output format for the human-readable text. 'markdown' (default) is best for direct display; 'json' returns the same data as a single JSON code block; 'none' skips the rendered text entirely and return |
صياغة إحالة Format a citation in five styles. style='shamela' (default) replicates Shamela's UI copy-with-citation: «<book>» (<part>/ <page>): «<text>». style='short' is a one-line inline reference: <author>، <book>، ص <page>. style='full' is the long form with author death year and book composition year, plus a notes[] array listing missing citation-grade fields (edition/publisher/city/editor
| Parameter | Type | Required | Notes |
|---|---|---|---|
| book_id | integer | yes | The book id. |
| page_id | integer | no | Optional page_id. When omitted, the citation references the book without a specific page (e.g. for a book-level citation). |
| text | string | no | Optional quoted text. When provided in 'shamela' style, the output includes a two-line block: «<book>» (<part>/ <page>): «<text>». |
| style | string | no | Citation style. 'shamela' replicates Shamela's UI copy-with-citation format (default). 'short' is a one-line inline reference. 'full' is the long form including author death year and book year, with n |
| response_format | string | no | Output format for the human-readable text. 'markdown' (default) is best for direct display; 'json' returns the same data as a single JSON code block; 'none' skips the rendered text entirely and return |
بحث في القرآن Search the Qur'an (6,236 verses, Hafs from Asim, Egyptian إملائي orthography) via the pre-built aya/ Lucene index. Ships zero-config — works on a fresh Shamela install. Returns aya_id (1..6236), surah, surah_name, aya, body (full verse text), and a snippet with <mark>...</mark> around matches. A single-word query is also searched as its ال-stripped stem and that stem's prefixed form
| Parameter | Type | Required | Notes |
|---|---|---|---|
| query | string | yes | Arabic text of a verse or part of one. Matched against all 6,236 verses in BOTH orthographies — the Egyptian إملائي spelling a user types from memory AND the Uthmani rasm that mushaf apps, quran.com a |
| options | object | no | Currently only the wildcards flag is honored. The Quranic index ships pre-built and zero-config. |
| limit | integer | no | Maximum number of results to return (1-100, default 20). |
| offset | integer | no | Number of results to skip for pagination. Use with limit to page through large result sets. The response includes has_more and next_offset to drive paging. |
| response_format | string | no | Output format for the human-readable text. 'markdown' (default) is best for direct display; 'json' returns the same data as a single JSON code block; 'none' skips the rendered text entirely and return |
جلب آية Fetch Qur'anic verses by aya_id (1..6236, cumulative across surahs) OR by surah (1..114) + aya (1..N), optionally a run of them with count. Returns each verse in three renderings: body (Egyptian إملائي, Hafs from Asim — the searchable form), amiri (Othmani Amiri rendering for display), majma (KFQPC Mushaf rendering). Also returns surah_ayat, the surah's total verse count, so you can ask
| Parameter | Type | Required | Notes |
|---|---|---|---|
| aya_id | integer | no | Cumulative aya id, 1..6236. Mutually exclusive with surah/aya. |
| surah | integer | no | Surah number 1..114. Pair with aya. |
| aya | integer | no | Aya number within the surah, 1..N. Pair with surah. |
| count | integer | no | How many consecutive verses to return, starting at the one resolved above (1-20, default 1). Use it for a passage — «the last two verses of al-Baqara» is surah=2, aya=285, count=2, and a short surah c |
| response_format | string | no | Output format for the human-readable text. 'markdown' (default) is best for direct display; 'json' returns the same data as a single JSON code block; 'none' skips the rendered text entirely and return |
تفاسير آية Given a Qur'anic verse, list every tafsir book in the catalog that has a page commenting on it. Uses Shamela's pre-built service/tafseer.db join. Pass either aya_id (1..6236) OR surah+aya. By default returns only books the user has downloaded locally (downloaded_only=true) — set to false to see the full catalog of tafsirs that COULD comment on this verse if downloaded. Each result has
| Parameter | Type | Required | Notes |
|---|---|---|---|
| aya_id | integer | no | Aya id 1..6236. |
| surah | integer | no | Surah number, paired with aya. |
| aya | integer | no | Aya within surah. |
| downloaded_only | boolean | no | If true (default), only return books the user has downloaded locally. |
| response_format | string | no | Output format for the human-readable text. 'markdown' (default) is best for direct display; 'json' returns the same data as a single JSON code block; 'none' skips the rendered text entirely and return |
كتب تتضمَّن حديثًا Given a Shamela hadith key (numeric identifier shared by all collections that record the same hadith), list every book that cites it. Uses Shamela's pre-built service/hadeeth.db join. By default filters to downloaded books only. Each result has book_id, book_name, author_name, page_id, downloaded flag. Pair with shamela_get_page to read the cited page. Useful for cross-collecti
| Parameter | Type | Required | Notes |
|---|---|---|---|
| hadith_key | integer | yes | Numeric hadith key (the normalized identifier Shamela uses across collections — e.g. 1234). Different collections of the same hadith share this key. |
| downloaded_only | boolean | no | If true (default), only return books actually downloaded on this machine. |
| response_format | string | no | Output format for the human-readable text. 'markdown' (default) is best for direct display; 'json' returns the same data as a single JSON code block; 'none' skips the rendered text entirely and return |
أجزاء الكتاب List the volumes/parts of a multi-volume book. Returns is_multi_volume flag, total_pages, and an array of parts each with part name (e.g. 'ج 1'), page_count, first_page_id, last_page_id. For single-volume books returns is_multi_volume:false, and an empty parts array unless the pages carry a single part label — that one label is kept, because get_citation prints it (e.g. «(١٨/ ٥١١)»).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| book_id | integer | yes | The book id. |
| response_format | string | no | Output format for the human-readable text. 'markdown' (default) is best for direct display; 'json' returns the same data as a single JSON code block; 'none' skips the rendered text entirely and return |
إشارات الصفحة Read the per-page service markers (Qur'anic verses cited, hadith keys, isnād markers) for a specific (book_id, page_id). Returns has_services plus ayat (cumulative aya_ids), hadeeth (hadith keys), esnad and esnad_count. NOTE: esnad entries are Shamela's RAW markers — «02464 s 2651 3234 1580 …» is a hadith key, a marker, then internal narrator IDS, not names, and they mean nothing
| Parameter | Type | Required | Notes |
|---|---|---|---|
| book_id | integer | yes | The book id. |
| page_id | integer | yes | The page id. |
| response_format | string | no | Output format for the human-readable text. 'markdown' (default) is best for direct display; 'json' returns the same data as a single JSON code block; 'none' skips the rendered text entirely and return |
بحث بالعبارة والتقارب Exact-phrase and proximity search the regular search lacks. mode='phrase' matches the query words as a CONSECUTIVE phrase (e.g. «خيار المجلس» only where those two words are adjacent). mode='near' matches pages where the words occur within distance words of each other in any order (e.g. «بيع» near «قبض» within 5 words) — ideal for fiqh questions where related terms sit clos
| Parameter | Type | Required | Notes |
|---|---|---|---|
| query | string | yes | Arabic phrase. In mode='phrase' the words must appear consecutively (exact phrase). In mode='near' the words must appear within distance words of each other in any order. |
| mode | string | no | 'phrase' = exact consecutive words (default). 'near' = words within distance words, any order. |
| distance | integer | no | For mode='near': maximum word span from the FIRST to the LAST query word, counted inclusively — distance=1 means adjacent, distance=2 allows one word between two query words. Ignored for mode='phrase' |
| search_in | array | no | Which page sections to verify the phrase in: body (matn), foot (footnotes), comment. |
| scope | object | no | Restrict to books/authors/categories/period. Strongly recommended to scope large libraries. |
| exclude_book_ids | array | no | Book ids to keep out of the results entirely. |
| exclude_author_ids | array | no | Exclude every book by these authors. |
| exclude_category_ids | array | no | Exclude every book on these shelves. |
| exclude_work_group_ids | array | no | Exclude every catalogue entry of these works — all printings at once. This is the one to use after a round returned «صحيح البخاري - ط السلطانية»: excluding that book_id alone leaves the other seven en |
| exclude_pages | array | no | Exact pages to keep out — the pages a previous round already returned. Excluding these rather than whole books is what lets a follow-up search find MORE evidence in a book that has already contributed |
| limit | integer | no | Maximum number of results to return (1-100, default 20). |
| offset | integer | no | Number of results to skip for pagination. Use with limit to page through large result sets. The response includes has_more and next_offset to drive paging. |
| response_format | string | no | Output format for the human-readable text. 'markdown' (default) is best for direct display; 'json' returns the same data as a single JSON code block; 'none' skips the rendered text entirely and return |
| shape | string | no | How much of each hit to return. 'full' (default) is every field on every row, including the snippets — ask for this when the answer will QUOTE the page. 'brief' keeps book_id/page_id, printed_page, ma |
بحث عن حديث بنصه Find a hadith by its TEXT (not its numeric key). Text-searches the hadith shelves (كتب السنة، شروح الحديث، التخريج والأطراف، علوم الحديث — 1,957 books here, reported as books_searched) across matn + footnotes, reads each matching page's service annotations for hadith keys, then resolves each key's cross-collection takhrij via hadeeth.db. Keep the two numbers apart: the TEXT sea
| Parameter | Type | Required | Notes |
|---|---|---|---|
| query | string | yes | The hadith text (or a distinctive part of it). AND-combines words across matn + footnotes. |
| max_pages_scanned | integer | no | How many matching pages to scan for hadith service keys. |
| search_all_categories | boolean | no | Search the ENTIRE library instead of the hadith shelves (كتب السنة، شروح الحديث، التخريج، علوم الحديث). Off by default because unscoped ranking buries the collections under works that merely quote the |
| limit | integer | no | Maximum number of results to return (1-100, default 20). |
| response_format | string | no | Output format for the human-readable text. 'markdown' (default) is best for direct display; 'json' returns the same data as a single JSON code block; 'none' skips the rendered text entirely and return |
بحث مطابق مع التشكيل والهمزات والأرقام Exactness-preserving search the regular search cannot do: it honors diacritics (التشكيل), hamza/alef forms (ٱآأإ vs bare ا, plus ؤ ئ ء ى ة), and digit systems (Arabic-Indic ٠-٩ vs Western 0-9). shamela_search_pages folds all of these away (preserve_* return OPTION_NOT_SUPPORTED). Two-stage, no index change: (1) normalized AND-search gathers candidates; (2) e
| Parameter | Type | Required | Notes |
|---|---|---|---|
| query | string | yes | The exact Arabic string to find. Type it WITH the diacritics / hamza form / digit system you want preserved (the query is NOT auto-diacritized). Multiple words are matched as written; the preserve f |
| preserve | object | yes | Which distinctions to enforce during stage-2 verification. At least one must be true. |
| scope | object | no | Restrict to books/authors/categories/period. Strongly recommended for large libraries so the candidate window covers the topic. |
| limit | integer | no | Maximum number of results to return (1-100, default 20). |
| offset | integer | no | Number of results to skip for pagination. Use with limit to page through large result sets. The response includes has_more and next_offset to drive paging. |
| response_format | string | no | Output format for the human-readable text. 'markdown' (default) is best for direct display; 'json' returns the same data as a single JSON code block; 'none' skips the rendered text entirely and return |
بحث منطقي (و/أو/دون) Boolean search the AND-only regular search lacks — combines OR (any_of) and NOT (none_of) with AND (all_of). all_of: terms that must ALL appear (intersection). any_of: at least ONE must appear (union), intersected with all_of. none_of: pages containing ANY of these are excluded. At least one of all_of/any_of is required. The whole expression is ONE Lucene BooleanQuery e
| Parameter | Type | Required | Notes |
|---|---|---|---|
| all_of | array | no | AND — terms that must ALL appear on the page (each term is itself AND-searched, so a multi-word term must co-occur). Intersection of every term's hit set. Leave empty to rely on any_of. |
| any_of | array | no | OR — at least ONE of these terms must appear on the page. Union of every term's hit set, then intersected with the all_of result. Leave empty to rely on all_of. |
| none_of | array | no | NOT — pages containing ANY of these terms are excluded, across the whole index (a MUST_NOT clause, not a subtraction inside a sampled window). Optional. |
| scope | object | no | Restrict to books/authors/categories/period. Recommended: an unscoped boolean search over a large library is exhaustive but slow. Use shamela_list_categories / shamela_resolve to find IDs. |
| search_in | array | no | Which page sections each sub-search looks in: body (matn), foot (footnotes), comment. Default ['body','foot']. |
| limit | integer | no | Maximum number of results to return (1-100, default 20). |
| offset | integer | no | Number of results to skip for pagination. Use with limit to page through large result sets. The response includes has_more and next_offset to drive paging. |
| response_format | string | no | Output format for the human-readable text. 'markdown' (default) is best for direct display; 'json' returns the same data as a single JSON code block; 'none' skips the rendered text entirely and return |
انتشار جذر في المكتبة Profile how widely an Arabic root spreads across the DOWNLOADED library, aggregated by category / Hijri century / book / author. Runs ONE morphological (AlKhalil) page search for the root — all derived forms are counted (صابر/يصبر/اصطبار for صبر) — and returns the DISTRIBUTION only, not snippets. total_hits is EXACT; the by-category/century/book/author breakdown is built f
| Parameter | Type | Required | Notes |
|---|---|---|---|
| root | string | yes | Arabic root or base word to profile (e.g. «صبر»، «رحم»، «علم»). Under mode='morphological' it is matched via the AlKhalil analyzer, so all derived forms (صابر، يصبر، اصطبار…) are counted, not just the |
| mode | string | no | 'literal' counts pages carrying the WORD as written (plus the ordinary spelling folds). 'morphological' expands it to every AlKhalil root reading and counts those — which is far broader than most call |
| scope | object | no | Restrict the profile to specific books, authors, categories, or a Hijri date range. Use shamela_list_categories / shamela_resolve to find IDs. Omit to profile the whole downloaded library. |
| response_format | string | no | Output format for the human-readable text. 'markdown' (default) is best for direct display; 'json' returns the same data as a single JSON code block; 'none' skips the rendered text entirely and return |
كتب حسب المدة (تأليفًا ووفاةً) Catalog filter that AND-combines its constraints, unlike scope.period_*, which unions them and so widens a search instead of narrowing it. composed_from/composed_to bound book.book_date (Shamela's «تاريخ الكتاب»); died_from/died_to bound the MAIN AUTHOR's death year. Read those as two COLUMNS, not two independent dimensions: measured on this catalogue they carry the
| Parameter | Type | Required | Notes |
|---|---|---|---|
| composed_from | integer | no | Hijri year, inclusive LOWER bound on book.book_date — Shamela's «تاريخ الكتاب». NOT an independent composition year: it holds the main author's death year on 98.5% of dated books (8,461/8,587), so pai |
| composed_to | integer | no | Hijri year, inclusive UPPER bound on book.book_date («تاريخ الكتاب»; see composed_from — it is not a composition year). Pair with composed_from. |
| died_from | integer | no | Hijri year, inclusive LOWER bound on the MAIN AUTHOR's death year (author.death_number). A different column from composed_*, but the same number on 98.5% of dated books. Pair with died_to. |
| died_to | integer | no | Hijri year, inclusive UPPER bound on the MAIN AUTHOR's death year (author.death_number). Pair with died_from. |
| category_id | integer | no | Optional: restrict to one category (use shamela_list_categories for IDs). Categories are flat in master.db. |
| downloaded_only | boolean | no | If true, restrict to books actually downloaded on this machine (master.db.book.major_ondisk > 0) — the only ones with searchable page content. |
| limit | integer | no | Maximum number of results to return (1-100, default 20). |
| offset | integer | no | Number of results to skip for pagination. Use with limit to page through large result sets. The response includes has_more and next_offset to drive paging. |
| response_format | string | no | Output format for the human-readable text. 'markdown' (default) is best for direct display; 'json' returns the same data as a single JSON code block; 'none' skips the rendered text entirely and return |
تغطية تفاسير آية Per-aya tafsir coverage report: cross-references the user's DOWNLOADED tafsir shelves (categories 3 AND 4 — tafsir spans both) against the curated service/tafseer.db index and reports an honest tri-state per book. status='indexed_covers' — the index maps this aya to a page in this book (page_id + printed page included); 'indexed_no_entry_for_this_aya' — the book participates in t
| Parameter | Type | Required | Notes |
|---|---|---|---|
| aya_id | integer | no | Aya id 1..6236. |
| surah | integer | no | Surah number, paired with aya. |
| aya | integer | no | Aya within surah. |
| response_format | string | no | Output format for the human-readable text. 'markdown' (default) is best for direct display; 'json' returns the same data as a single JSON code block; 'none' skips the rendered text entirely and return |
جلب نصوص تفسير آية Fetch the actual tafsir texts of one aya across multiple sources in a single call. Strictly index-driven: fetches ONLY pages the curated service/tafseer.db maps to this aya (no text-search fallback — it misattributes verses via shared phrases and the basmala). Pass either aya_id OR surah+aya; optional book_ids restricts sources, max_sources (default 5) caps how many are fetched
| Parameter | Type | Required | Notes |
|---|---|---|---|
| aya_id | integer | no | Aya id 1..6236. |
| surah | integer | no | Surah number, paired with aya. |
| aya | integer | no | Aya within surah. |
| book_ids | array | no | Restrict to these tafsir books. Books not present in the curated index for this aya are reported with an explicit status instead of text. Use shamela_list_tafsirs_for_aya to see which books the index |
| max_sources | integer | no | Maximum number of sources to fetch text for (1-10, default 5). |
| response_format | string | no | Output format for the human-readable text. 'markdown' (default) is best for direct display; 'json' returns the same data as a single JSON code block; 'none' skips the rendered text entirely and return |
بيان قدرات الخادم ومزالق البحث Capability handshake + operating brief for programmatic callers. Call this FIRST, before sending any argument you are not certain this build accepts. Returns capabilities[] — the arguments and response fields this server supports — plus server_version, limits, and traps[]. Every tool input here is strict, so sending an unknown argument (e.g. shape, `respon
| Parameter | Type | Required | Notes |
|---|---|---|---|
| response_format | string | no | Output format for the human-readable text. 'markdown' (default) is best for direct display; 'json' returns the same data as a single JSON code block; 'none' skips the rendered text entirely and return |
بحث في رجال الأسانيد Find a ḥadīth narrator (راوٍ) by name in Shamela's rijāl register — 18,989 narrators with death years 2-774 AH. This is the entry point for ʿilm al-rijāl: every other narrator/isnād tool takes the narrator_id this returns. The query is folded the same way page search folds Arabic, so «شعبه» finds «شعبة» and tashkeel is ignored; tokens are ANDed and match anywhere in the sho
| Parameter | Type | Required | Notes |
|---|---|---|---|
| query | string | yes | Part of the narrator's name, in Arabic. Matched against the short name, the full lineage, and the register's الشهرة / اللقب / الكنية / النسب — so «الزهري» and «الأعمش» reach the men known by those nis |
| limit | integer | no | Maximum narrators to return (1-50, default 10). |
| offset | integer | no | Narrators to skip, for paging. Common names match in the thousands — «محمد بن» matches 3,620 — so page with this or narrow the query. |
| response_format | string | no | Output format for the human-readable text. 'markdown' (default) is best for direct display; 'json' returns the same data as a single JSON code block; 'none' skips the rendered text entirely and return |
ترجمة الراوي The full dossier on one narrator: name and lineage, death year, ṭabaqa (generation per Taqrīb al-Tahdhīb), Ibn Ḥajar's and al-Dhahabī's grades, kunya/nasab/cities/relations, and — the heart of it — al-jarḥ wa-l-taʿdīl: the critics' verdicts, grouped by critic, each quoted verbatim WITH the book and volume/page it came from (e.g. «تهذيب التهذيب (1/ 101)»). Critics are PAGED (limit,
| Parameter | Type | Required | Notes |
|---|---|---|---|
| narrator_id | integer | yes | The narrator id, as returned by shamela_search_narrators or inside a chain from shamela_get_isnad. |
| include_network | boolean | no | Include the transmission network computed from the isnād index: how many chains this narrator carries, in which books, and their most frequent teachers and students. Set false to skip it when you only |
| top_n | integer | no | How many teachers and how many students to return, most frequent first (1-100, default 15). |
| limit | integer | no | How many CRITICS of al-jarḥ wa-l-taʿdīl to return (1-100, default 10) — the only part of the dossier that is paged. al-Zuhrī has 56 critics and 184 verdicts; they do not fit one response, and `total_c |
| offset | integer | no | Critics to skip, for paging through the verdicts. Follow next_offset until has_more is false. |
| response_format | string | no | Output format for the human-readable text. 'markdown' (default) is best for direct display; 'json' returns the same data as a single JSON code block; 'none' skips the rendered text entirely and return |
بحث في الأسانيد Search the 45,220 isnād chains Shamela indexes across ten ḥadīth books (Bukhārī 1681, Muslim 711, Abū Dāwūd 654, Tirmidhī 7895, Nasāʾī 829, Muwaṭṭaʾ 28107, Ṭayālisī 1456, Ibn al-Jārūd 627/13071, ʿIlal al-Tirmidhī 642). Two constraints, both taking narrator ids from shamela_search_narrators: contains requires the narrators to appear ANYWHERE in the chain, and transmission takes
| Parameter | Type | Required | Notes |
|---|---|---|---|
| contains | array | no | Narrator ids that must ALL appear in the chain, at any position and in any order. Use for «which reports pass through both X and Y». |
| transmission | array | no | Pairs [teacher_id, student_id] that must appear ADJACENT and in that order — direct transmission, the student having heard from the teacher with nobody in between. This is the question «did X really n |
| scope_book_ids | array | no | Restrict to these books. The isnād index covers only ten: صحيح البخاري (1681), صحيح مسلم (711), سنن أبي داود (654), سنن الترمذي (7895), سنن النسائي (829), موطأ مالك (28107), مسند الطيالسي (1456), المن |
| max_results | integer | no | Chains to return per page (1-100, default 20). |
| offset | integer | no | Chains to skip, for paging. |
| response_format | string | no | Output format for the human-readable text. 'markdown' (default) is best for direct display; 'json' returns the same data as a single JSON code block; 'none' skips the rendered text entirely and return |
إسناد الصفحة وطرقه The isnād chain(s) printed on one page, resolved from Shamela's narrator ids to names and death years, plus the other routes (طرق) of the same ḥadīth in the other indexed books. This is the pivot from a search hit to who transmitted it: run shamela_search_pages, then pass a (book_id, page_id) here. A page can carry several chains, and variants follows Shamela's ḥadīth key out
| Parameter | Type | Required | Notes |
|---|---|---|---|
| book_id | integer | yes | The book id. |
| page_id | integer | yes | The page id. |
| include_variants | boolean | no | Also return the other routes (طرق) of the same ḥadīth from the other indexed books, matched on Shamela's ḥadīth key. This is what shows whether a report rests on one thread or many. |
| max_variants | integer | no | Cap on returned variant routes (1-200, default 20). variants.truncated reports when more exist. |
| response_format | string | no | Output format for the human-readable text. 'markdown' (default) is best for direct display; 'json' returns the same data as a single JSON code block; 'none' skips the rendered text entirely and return |
بحث مجمَّع بعدة استعلامات Run up to 12 scoped searches in ONE call and get back a single merged, deduplicated result set. Built for assembling evidence for one question from several wordings at once: each probe is {query, mode:'and'|'phrase'|'near', scope, limit}, they execute concurrently, and pages found by more than one probe are returned ONCE with every probe id that found them (probe_ids)
| Parameter | Type | Required | Notes |
|---|---|---|---|
| probes | array | yes | The searches to run. They execute concurrently and their results are merged, deduped by (book_id, page_id) and attributed back to the probes that found each page. |
| max_total_passages | integer | no | Hard cap on merged rows returned. Rows are ordered by match quality then probe agreement before the cut, so the cap drops the weakest evidence rather than an arbitrary tail. truncated says whether i |
| deadline_ms | integer | no | Wall-clock budget for the whole batch. Probes still running when it expires are reported with status='timeout' and contribute nothing. A timeout is NOT a negative finding — it means the question was n |
| response_format | string | no | Output format for the human-readable text. 'markdown' (default) is best for direct display; 'json' returns the same data as a single JSON code block; 'none' skips the rendered text entirely and return |
| shape | string | no | How much of each hit to return. 'full' (default) is every field on every row, including the snippets — ask for this when the answer will QUOTE the page. 'brief' keeps book_id/page_id, printed_page, ma |
تحديد الكتاب المُحال إليه Resolve a CITED work — title, optional author, optional edition — to the catalogue entry it names, or refuse. Use this instead of shamela_resolve whenever a citation is being verified: shamela_resolve RANKS, and a ranking always produces a winner, so an ambiguous request comes back as a confident wrong answer. Three guarantees. (1) The requested title must be a PREFI
| Parameter | Type | Required | Notes |
|---|---|---|---|
| title | string | yes | The work's title as cited, e.g. «صحيح البخاري», «المغني», «فتح الباري». Leading words only — the title, not a description of it. You may include the catalogue's own edition tail, with the « - » («صحيح |
| author | string | no | The author as cited, when known. This is a FILTER, not a hint: a candidate whose author cannot be reconciled with it is rejected rather than ranked down, because that is exactly how a commentary gets |
| edition | string | no | A specific printing, as the catalogue names it: 'ط السلطانية', 'ت البغا', 'ط التأصيل'. If no entry carries it you get status='not_found' with reason='edition_not_found' and the editions that DO exist |
| limit | integer | no | Maximum candidates to report (1-50, default 20). |
| response_format | string | no | Output format for the human-readable text. 'markdown' (default) is best for direct display; 'json' returns the same data as a single JSON code block; 'none' skips the rendered text entirely and return |
ردُّ رقم الصفحة المطبوعة إلى صفحات البرنامج Turn a printed citation — «vol. 4, p. 405» — into the internal page ids that carry it, in one indexed query. A printed page number and a page_id are different things with no arithmetic between them, so estimating an id and correcting it by reading is both slow and unreliable. Returns page_ids[]: ONE printed page routinely maps to SEVERAL ids (part='1'
| Parameter | Type | Required | Notes |
|---|---|---|---|
| book_id | integer | yes | The book. Resolve a cited title with shamela_resolve_work first — and note that different printings of one work paginate differently, so the book_id must be the printing the citation came from. |
| page | integer | yes | The PRINTED page number as the citation gives it (e.g. 405). |
| part | string | no | The volume/part label as the book uses it, usually a bare number ('4'). Omit when the citation names no volume or the work is single-volume: the search then runs across every part and the response rep |
| response_format | string | no | Output format for the human-readable text. 'markdown' (default) is best for direct display; 'json' returns the same data as a single JSON code block; 'none' skips the rendered text entirely and return |
استكشاف: حجم الموضوع في المكتبة وأين يقع Round-zero reconnaissance: how much does this library actually hold on a topic, and on which shelves, BEFORE a retrieval plan is committed to. Same measurement as shamela_root_stats but mode defaults to 'literal' — counting pages that carry the WORD as written rather than every AlKhalil root reading of it. That difference is the point: «الاستصناع» report
| Parameter | Type | Required | Notes |
|---|---|---|---|
| root | string | yes | Arabic root or base word to profile (e.g. «صبر»، «رحم»، «علم»). Under mode='morphological' it is matched via the AlKhalil analyzer, so all derived forms (صابر، يصبر، اصطبار…) are counted, not just the |
| mode | string | no | 'literal' counts pages carrying the WORD as written (plus the ordinary spelling folds). 'morphological' expands it to every AlKhalil root reading and counts those — which is far broader than most call |
| scope | object | no | Restrict the profile to specific books, authors, categories, or a Hijri date range. Use shamela_list_categories / shamela_resolve to find IDs. Omit to profile the whole downloaded library. |
| response_format | string | no | Output format for the human-readable text. 'markdown' (default) is best for direct display; 'json' returns the same data as a single JSON code block; 'none' skips the rendered text entirely and return |
- Every tool — any call limit is its publisher’s, not ours
- No card, and mcprush charges nothing for it
- Runs at its publisher’s own address — this marketplace is not in the path
- Nothing to cap, because mcprush bills nothing
What counts against your monthly calls
| Tool | Unit | Calls used | Out of the allowance |
|---|
Nothing here is billable: mcprush charges nothing to install Quran Gallery or to call it, at any volume.
Two independent axes, because powerful and malicious are different questions. The grade is threat only. The capability level is blast radius, and it is never a penalty on the grade — it is priced as one subtract-only term in the score, where you can see it.
This listing is an address its publisher runs, and you connect to it directly — this marketplace is not in the path. The scanner reads packages and public source, and an address is neither. So there is no grade — not a withheld one, an unmeasured one.
Release history
This is an address its publisher runs: which release it serves is theirs to choose, so there is nothing here to pin. The history below is for reading; the current release on file is 0.2.0.
No release note was published with this version.
One review per account, from a signed-in account that does not publish this listing. Nothing else is asked — you can say what you think before you install it. Publishers can reply once per review, and a review can be edited or deleted by whoever wrote it.
Any signed-in account that does not publish Quran Gallery can review it, once — before installing it or after. A review from an account that has installed it is marked as one.
Nobody has reviewed this listing. The rating on the card is the mean of the reviews written here and nothing else, so there is no rating until somebody writes the first — which takes a signed-in account that does not publish it, and nothing else.