- Registry update
- Oct 15, 2026
Connect
remote$claude mcp add --transport http mcp https://qurangallery.com/mcp/shamela \ --header "Authorization: <authorization>"
Headers
AuthorizationsecretOptional. Free Quran Gallery API key as a bearer token: 60 tool calls a minute with no daily cap, instead of the keyless 10 a minute and 200 a day. Create one at https://accounts.qurangallery.com/developers. Omit the header to use the server with no account.
Security review
Review passedReviewed 1h ago.
- tools
- 39 tools scanned
- metadata
- scanned
No findings.
Tools
39search_library
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 ranking in this corpus is by term frequency, which surfaces a poetry anthology above a hadith collection.
search
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 hadith, tafsir or fiqh question, search_library with a scope ranks the standard sources first.
fetch
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.
shamela_search_pages
بحث في صفحات الكتب 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'|'hanbali') answers a school-specific fiqh question — it uses Shamela's school categories AND the main author's school, so it reaches مسائل فقهية and الفقه العام where no school is filed; books whose school is unknown are excluded, so leave it unset for comparative questions. `scope.book_type` excludes what is not an authored book (transcript/thesis/journal/electronic/manuscript), and `scope.citable_only` keeps only books whose page numbers match a real printed edition — set it whenever the answer will quote a page as a citation. `options` controls morphology (Arabic root expansion via AlKhalil
shamela_search_titles
بحث في عناوين الفصول 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:'تعريف', scope:{book_ids:[<id from shamela_resolve or shamela_list_downloaded_books>]}}).
shamela_search_books
بحث في فهرس الكتب 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 'description'. Pre-built index — works even before any books are downloaded. scope.book_ids is not accepted (the catalog IS the universe); use scope.author_ids, category_ids, period_*, downloaded_only. Returns paginated results with book name, author, category, book_date, downloaded flag, and a snippet showing the matched text. Examples: shamela_search_books({query:'الأصول'}), shamela_search_books({query:'فقه', scope:{category_ids:[17], downloaded_only:true}}).
shamela_search_authors
بحث في فهرس المؤلفين 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 variants before concluding absence (جرّب الكنية والنسبة والشهرة: ابن قدامة / الموفق / المقدسي). Use the resulting author_id with shamela_get_author for full details, or with scope.author_ids in shamela_search_pages/_books to filter by that author. Examples: shamela_search_authors({query:'ابن قدامة'}), shamela_search_authors({query:'الشافعي', options:{wildcards:false}}).
shamela_get_page
جلب صفحة 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 reads use shamela_get_pages_range; for full chapters use shamela_get_book_section. Long pages: the body is split into parts of ~4000 chars — `body_part` selects the 1-based part, and body_total_parts/body_has_more report the split (footnote/comment come with part 1; a `_display` hint advises when to ask the user how to show it).
shamela_get_toc
جلب فهرس الكتاب 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 to read the section. Examples: shamela_get_toc({book_id:<id>, depth:1}) lists top-level chapters; shamela_get_toc({book_id:<id>, containing_page_id:17}) returns the chapter containing page 17. Find downloaded book ids via shamela_list_downloaded_books or shamela_resolve.
shamela_get_book
جلب بيانات كتاب 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 the per-book SQLite has page rows), publication_date (DDMMYYYY Hijri from meta_data), sub_books, `same_group` (other catalog entries of the SAME work — Ṣaḥīḥ al-Bukhārī is 8 entries: five editions plus three abridgments; treat quotes from two of them as one source, not two), `scan` (the scanned PDF printing Shamela holds, with resolved download URLs), `cover` (a ~310x460 JPEG of that printing's title page, attached as an image block by default — pass include_cover:false to suppress; only 1,368 of 8,594 books have one. Its absence does NOT mean there is no scanned printing — 377 books carry a `s
shamela_get_author
جلب بيانات مؤلف 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: shamela_get_author({author_id:57}) returns Ibn Uthaymeen + his books.
shamela_list_categories
قائمة التصنيفات 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 counts are cached so cost is negligible). Each entry also reports downloaded_count (books in that category present on THIS machine), and downloaded_only=true lists only categories where the user has downloads — useful because Shamela is a 41-category library and tafsir alone spans categories 3 (التفسير), 4 (علوم القرآن وأصول التفسير), and 5 (التجويد والقراءات).
shamela_resolve
تحويل اسم إلى معرِّف 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 but doesn't know the exact ID. Examples: shamela_resolve({query:'ابن قدامة'}) → returns the matching author_id(s) with confidence; shamela_resolve({query:'روضة الناظر'}) → returns book matches.
shamela_get_pages_range
جلب نطاق صفحات 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 next_start_page_id and a `_display` hint — continue from there. For full chapters use shamela_get_book_section instead — it knows where the chapter ends. Example: shamela_get_pages_range({book_id:<id>, start_page_id:1, count:5}). Find downloaded book ids via shamela_list_downloaded_books.
shamela_get_book_section
جلب باب من كتاب 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 `_display` hint to continue. Use shamela_get_toc to find title_ids, then this tool to read the matching section. Example: shamela_get_book_section({book_id:<id>, title_id:<title_id from get_toc>}).
shamela_get_citation
صياغة إحالة Format a citation in five styles. style='shamela' (default) replicates Shamela's UI copy-with-citation: «<book>» (<part>/ <page>):\n«<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 — master.db doesn't have these; never fabricate). style='bibtex' and style='ris' export a machine-readable record for Zotero/EndNote/Mendeley (Western digits, Arabic UTF-8, cite key shamela<book_id>p<page_id>, same missing-field notes[], no fabricated edition/publisher/city/editor). All other styles use Arabic-Indic digits. Examples: shamela_get_citation({book_id:<id>, page_id:<page_id>, style:'shamela'}), shamela_get_citation({book_id:<id>, page_id:<page_id>, text:'<quoted passage>', style:'shamela'}).
shamela_search_quran
بحث في القرآن 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 forms, which widens it: «الملك» returns 60 verses where the word as typed accounts for 28. The widening is reported — `stem_expanded_to` names the forms searched, `query_form_hits` counts the verses matching your word or its prefixed forms, and each hit's `matched_form` says which form it came in on, so a verse that only rode the stem (مَٰلِكِ in 1:4) is identifiable rather than presented as your word. Pair with shamela_get_aya to fetch a single verse with the Othmani Amiri rendering, or with shamela_get_tafseer_of_aya to find tafsir books that comment on a matching verse.
shamela_get_aya
جلب آية 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 for the rest without guessing. Pass either aya_id alone OR both surah and aya. Examples: shamela_get_aya({aya_id:1}) → al-Fatiha verse 1 (basmala); shamela_get_aya({surah:55, aya:1}) → Ar-Rahman verse 1; shamela_get_aya({surah:112, aya:1, count:4}) → all of al-Ikhlas in one call; shamela_get_aya({surah:2, aya:285, count:2}) → the last two verses of al-Baqara.
shamela_get_tafseer_of_aya
تفاسير آية 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 book_id, book_name, author_name, page_id, downloaded flag. Pair with shamela_get_page(book_id, page_id) to read the actual tafsir text. NOTE: this uses a CURATED service index that may omit downloaded tafsirs (many tafsirs carry no per-page aya markers) — on some installs it returns only al-Tabari. For the user's full tafsir picture, also list downloaded books in the tafsir categories via shamela_list_downloaded_books(category_id=3) and (category_id=4); see coverage_note in the result.
shamela_get_books_for_hadith
كتب تتضمَّن حديثًا 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-collection hadith research (Bukhari + Muslim + Sunan + Musnad references for the same hadith).
shamela_get_book_parts
أجزاء الكتاب 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. «(١٨/ ٥١١)»). Useful to know whether a citation needs a part designator. Example: shamela_get_book_parts({book_id:<id>}). Find downloaded book ids via shamela_list_downloaded_books.
shamela_get_page_services
إشارات الصفحة 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 on their own; call `shamela_get_isnad(book_id, page_id)` to get the same chains resolved to narrator names, death years and variant routes. Many books — particularly non-hadith works — have no services and return has_services:false cleanly. Useful to pivot from a search hit to what it cites: pair aya_ids with shamela_get_aya, or hadith keys with shamela_get_books_for_hadith.
shamela_search_phrase
بحث بالعبارة والتقارب 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 close but not adjacent. Two-stage: finds candidate pages where all words co-occur, then verifies adjacency/proximity in the full page text. Pass `scope` (book_ids/author_ids/category_ids) to cover large libraries reliably. Returns book name, author, printed page, and a snippet. Examples: shamela_search_phrase({query:'خيار المجلس'}), shamela_search_phrase({query:'بيع قبض', mode:'near', distance:5, scope:{category_ids:[17]}}).
shamela_search_hadith
بحث عن حديث بنصه 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 search covers those shelves, while takhrij keys exist only in the books hadeeth.db indexes (`key_index_books` — ten on this install), so a hadith can be found on 1,746 pages and still yield takhrij from ten books. `takhrij[].books` counts distinct BOOKS and `index_entries` the pages behind them. Returns matched pages (snippets often show the printed takhrij «رواه البخاري ومسلم») plus cross-book takhrij where service keys exist. Scoping to those shelves is deliberate: unscoped, term-frequency ranking fills the scan window with fiqh/usul works that merely QUOTE the hadith and carry no service keys,
shamela_search_exact
بحث مطابق مع التشكيل والهمزات والأرقام 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) each candidate's FULL raw SQLite text is verified in Node, folding ONLY the features you did NOT ask to preserve. Type the query WITH the diacritics/hamza/digits to enforce; enable at least one flag in `preserve`. Broad searches may miss matches outside the bounded candidate window (`candidate_cap_hit`/`total_candidates_scanned` report it) — pass `scope` for large libraries. Examples: shamela_search_exact({query:'أحمد', preserve:{preserve_hamza:true}}) won't match «احمد»; shamela_search_exact({query:'عِلْم', preserve:{preserve_diacritics:true}}) won't match «عَلَم».
shamela_search_boolean
بحث منطقي (و/أو/دون) 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 evaluated over the entire index — all_of as MUST, any_of as SHOULD-min-1, none_of as MUST_NOT — so `total_hits` is an exact count and the exclusion is exhaustive, not a sample. `scope` is still worth passing for speed on a large library, not for correctness. If a term has no entry in the index at all it is named in `zero_hit_terms`: a zero then means that word is not in the library as spelled, which is different from the expression having no match. Examples: shamela_search_boolean({all_of:['الوقف'], any_of:['المسجد','المقبرة'], none_of:['البيع'], scope:{category_ids:[17]}}).
shamela_root_stats
انتشار جذر في المكتبة 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 from at most 5,000 top-scoring hits (COVERAGE_CAP), so when `coverage_capped` is true the bucket counts are floors and shares are indicative. Morphology accuracy on classical Arabic is ~0.80 — read counts as reach, not exact tallies. Pass `scope` to profile a slice. Examples: shamela_root_stats({root:'صبر'}), shamela_root_stats({root:'رحم', scope:{category_ids:[17]}}).
shamela_books_by_period
كتب حسب المدة (تأليفًا ووفاةً) 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 same number on 98.5% of dated books, because Shamela records no composition year. A composed-vs-died question — «books written in the 8th century by authors who died in the 9th» — is therefore one this data cannot answer, and a near-empty result means the distinction is unavailable, not that no such book exists. A book matches only if it satisfies ALL provided constraints at once (composition-year AND death-year AND category AND downloaded) — an intersection, never a union. At least one of the four bounds is required. Also accepts category_id, downloaded_only, limit/offset. Returns book_id, b
shamela_list_tafsirs_for_aya
تغطية تفاسير آية 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 the index but has no entry for this aya; 'not_indexed_coverage_unknown' — the book is absent from the curated index, so coverage CANNOT be determined (explicitly NOT evidence the book lacks commentary on the verse). Index hits outside categories 3/4 (e.g. mawsuʿat) are included and marked in_tafsir_categories:false. Pass either aya_id (1..6236) OR surah+aya. Returns totals per status and a note about the curated-index limitation. Never text-searches; navigate unknown-status books via shamela_get_toc. Examples: shamela_list_tafsirs_for_aya({surah:2, aya:255}), shamela_list_tafsirs_for_aya({aya_i
shamela_get_tafseer_texts
جلب نصوص تفسير آية 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. Each source carries embedded attribution (book_name, author, death_year, printed_page, page_id) plus continuation: text_part/text_total_parts/text_has_more for long pages and next_page_id for commentary spanning pages — read the per-source `note`, which names the exact follow-up call, rather than assuming body_part=2. `verse_located_in_page` says whether the text was cut to START at your verse: when a tafsir quotes the same words several times on one page (a refrain like «فبأي آلاء ربكما تكذبان») and the printed verse numbers do not settle which copy is yours, it returns false with a note an
shamela_brief
بيان قدرات الخادم ومزالق البحث 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`, `response_format:'none'`) to a server that predates it is a HARD validation error that fails the whole call, not a silently ignored field; and `tools/list` cannot help, because it proves a tool exists without saying which arguments it takes. Gate each new argument on its capability string. `traps[]` is the operating half: each entry pairs a way a search result misleads with the exact RESPONSE FIELD that proves it fired (`relaxed_min_match`, `zero_hit_terms`, `paging_ceiling`, `coverage.sample_is_complete`, `scope_resolution.dropped`, `madhab_source`, `probes[].qualifiers`, …), so a caller checks the
shamela_search_narrators
بحث في رجال الأسانيد 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 short name, the full lineage, or the shuhra / laqab / kunya / nisba — so «الزهري» and «الأعمش», which are how these men are actually cited, now find them. Results are ordered by how much the register documents a man (the size of his jarḥ-wa-taʿdīl dossier), death year breaking ties: the narrator an isnād would actually name comes ahead of an obscure namesake. Names are common in this corpus — always check the death year and grade before deciding which «محمد بن إسماعيل» you have. Examples: shamela_search_narrators({query:'شعبة بن الحجاج'}), shamela_search_narrators({query:'الزهري'}).
shamela_get_narrator
ترجمة الراوي 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`, default 10, and `offset`), because a heavily-documented narrator has dozens — al-Zuhrī has 56 critics and 184 verdicts — and the response reports `total_critics`/`total_verdicts` plus a cursor so you can tell a page from the whole file and reach the rest. 15,160 of the 18,989 narrators carry verdicts, from 2,821 named critics. Also returns hadith_notes (فوائد) on audition, irsāl and implicit tawthīq — the evidence for whether a chain is connected. With include_network (default true) it adds the transmission network computed live from the isnād index: how many chains name this narrator, in whic
shamela_search_isnad
بحث في الأسانيد 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 [teacher_id, student_id] pairs that must be ADJACENT and in that order — direct audition with nobody in between. `transmission` is the strictly stronger claim and the one ʿilm al-rijāl asks: «did X actually hear from Y». Every result gives book, page and the chain resolved to names and death years, so a claim can be checked against the printed page with shamela_get_page. Chains run ASCENDING: chain[0] is the Companion, the last link is the collector. At least one constraint is required. Examples: shamela_search_isnad({transmission:[[1580,2779]]}) — chains where Shuʿba heard from al-Ḥakam b. ʿ
shamela_get_isnad
إسناد الصفحة وطرقه 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 outward — counting the routes is how you judge whether a report rests on one thread (غريب) or many (مشهور). Chains run ASCENDING: first link is the Companion, last is the collector; each link heard from the one before. Only ten ḥadīth books are indexed for isnād, so most pages return no_isnad_indexed:true — and `no_isnad_reason` then says WHICH kind of nothing it is: 'no_marker_on_page' (the page carries no isnād marker at all, read from its own service annotations) or 'marked_but_unindexed' (it does carry one, but this book is outside the ten). A page_id the book does not have is now an error ra
shamela_search_batch
بحث مجمَّع بعدة استعلامات 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`) — which is corroboration across wordings, not a duplicate. Every row carries `match_quality` ('exact_phrase'|'near'|'all_terms'|'relaxed') and `matched_in_section` ('body'|'footnote'|'both') so a near miss can never be read as a located quotation once results are merged, and a modern editor's footnote is never quoted as the author's own words. Every row also carries `work_group_id`, and `edition_groups` names any work present here under several catalog entries — read those as ONE source, not as several that corroborate each other. `scope` is REQUIRED on every probe (one of book_ids/author_ids/
shamela_resolve_work
تحديد الكتاب المُحال إليه 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 PREFIX of the candidate's title: «شرح صحيح البخاري», «المدخل إلى صحيح البخاري» and «عمدة القاري شرح صحيح البخاري» all contain the work's name and none of them IS the work — a commentary is another author writing about it, and quoting one as the work attributes his words to al-Bukhari. (2) `author` is a FILTER, not a hint: a candidate whose author cannot be reconciled with it is rejected and listed in `rejected[]`, never ranked down. (3) A requested `edition` that no entry carries returns status='not_found' with reason='edition_not_found' plus `available_editions[]` — never a different book. `status
shamela_resolve_printed_page
ردُّ رقم الصفحة المطبوعة إلى صفحات البرنامج 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', page=6 is ids 9, 10 and 11 in the fixture book) because Shamela splits a long printed page across records — read them all, since the first alone is a fragment quoted as the page. Failure is specific rather than null: 'book_not_downloaded', 'no_printed_pagination' (Shamela paginates this entry itself, so no printed page exists to find), 'part_not_found' (with `available_parts`), 'page_not_in_part' (with the range that does exist). `citable` false means the numbers are Shamela's own, not a published edition's. Omit `part` for a single-volume work or a citation with no volume; `parts_matched` t
shamela_recon
استكشاف: حجم الموضوع في المكتبة وأين يقع 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: «الاستصناع» reports 393,498 pages across 7,405 books morphologically and 1,510 literally, and the first answer says every shelf holds the topic, which is not a plan. Returns the EXACT page total plus the distribution by category, Hijri century, book and author, in 6-9 ms. Read the distribution as corpus size PLUS topic, never as authority: التفسير tops nearly every profile because tafsir is simply the largest body of text here, not because it is where the question is answered. Use the by_category ranking to choose `scope.category_ids` for the searches that follow. Examples: shamela_recon({root:'الاستصناع'}), sh
More in Search
Fork
app.vercel.fork-for-agents
Agents share improvements to their setups (rules, skills, settings), fork and install them.
InDesign MCP Server
io.github.zachshallbetter
Drive Adobe InDesign from any MCP client: 135+ tools for layout, styles, books and PDF export.
Polymarket Paper Trader
io.github.agent-next
Polymarket paper trading for AI agents: $10k paper money, real order books, official fees.
I2IDL Glossary of Digital Learning
io.github.blakeplock
Public read-only MCP access to digital learning concepts, semantic relationships, and citations.
Base of AGI
com.baseofagi
AI news in TR/EN/ES/RU, a daily stack brief and a verified MCP/plugin/skill catalog. Read-only.
CandleFeed
ai.candlefeed
Rebuild Binance USD-M order book days for spread and depth; candles, funding, OI and liquidations
Listing from the official MCP Registry.