Every change Wellknown observed on this MCP server, newest first, with what it was before and what it became. Tool-surface changes carry the definition diff. Nothing here is edited after the fact.
Certificate recorded, valid to 2026-12-07
Authorization not required
Added "shamela_cite", "shamela_find", "shamela_get_brief" and 9 more; removed "search_library", "shamela_books_by_period", "shamela_brief" and 34 more; changed the definition of "fetch" and "search" (39 tools before, 14 now)
Read one library page whole by the id `search` returned("{bookId}:{pageId}").Returns themain textand,underthenaitsseparatefootnoteslabel,underthetheirfootnotesown—label (the editor'snoteswords,notnever the author'swords —), with book, author, printed volume/page,theedition data
SearchQuick generic search of the whole library(deep research)
Searchallthe whole classical Islamic library (8,594 worksof the classical,Islamicnolibraryscope) andreturnget up to 10matchingpages as {id, title, url}.;Passpass an id to `fetch` to read
Format a citation or resolve a printed page — Citations. mode=citation (default): build one for a book, optionally a page and quoted text — Shamela's copy format, short inline, full with death year, or BibTeX/RIS. Call it whenever you attribute a quote; it needs only the catalogue, plus the installed text for a page's printed number. Read page_resolved, components.auto_numbered and notes[] before presenting. mode=printed_page: map a printed citation («vol. 4, p. 405») to the page_ids carrying it — no arithmetic relates the two, and one printed page often spans several ids: read them all, in order, with shamela_read(unit='page'). Resolve …
Find books, headings, authors, categories or names — Catalogue lookup — which books, headings, authors and shelves exist, not page text. `kind`: - book (default): titles, authors, publication lines, subject descriptions → book_ids, installed or not. no_title_match: not proof the book is held. downloaded:false → another edition (shamela_get_details(kind='book') same_group) or catalogue metadata only. - heading: chapter/section headings, i.e. where books treat a topic; open with shamela_read(unit='section', book_id, title_id). No hits = no heading carries the words: drop words or use shamela_search(match='words'). - author: names and biographies …
Server capabilities and search pitfalls — Return this server's machine-readable capability handshake: capabilities, numeric limits, retired tool names with their replacements, and traps (ways a result misleads, each with the response field that proves it fired). Call it first from a programmatic client: inputs are strict, so an argument an older build lacks (e.g. `shape`, response_format:'none') is a hard validation error that fails the whole call, and tools/list cannot reveal argument support — gate each new argument on its capability string. Cache by brief_hash and re-fetch only when it changes. Constants only: needs no library acc…
Get book or author details — Catalogue record for one book (kind=book, default) or one author (kind=author), installed or not. - book: authors, category, type, printed-edition flag, whether the text is installed here, the scanned printing and the other editions of the same work (same_group). When a reader tool says BOOK_NOT_DOWNLOADED, pick an installed entry from same_group or answer from this record. Read book_date, edition, editor and publisher per their field notes: never supply a missing one. - author: name, Hijri death year (null = unknown or living) and every catalogued book they wrote or co-wrote, each flagged in…
Find a hadith or the books that carry it — Hadith. mode=search (default): find a hadith by its wording and trace its takhrij — searches the hadith shelves (Sunnah collections, commentaries, takhrij, hadith sciences) in matn and footnotes, reads hadith keys off the matching pages and lists every collection indexing the same hadith. No offset; if the full text matches nothing, one word is dropped and named in `relaxed`. Takhrij covers only key_index_books, so few rows is not proof of a weak or rare hadith. mode=sources: every book recording one hadith_key, with its page_id, one row per book in index order. A downloaded:false book is cat…
Search the Quran or get an ayah — Qur'an text. mode=search (default): find verses by Arabic words, typed in إملائي spelling or pasted in Uthmani rasm; words ANDed, results in mushaf order (aya_id 1–6236), not relevance. Zero hits usually means a misspelling: drop a word or use options.wildcards. mode=aya: fetch verses you can already cite, by aya_id OR surah + aya (never both or neither: BAD_ARG); `count` gives a run that continues across surahs and stops at the last verse. Each verse in three renderings (body = the spelling search matches, amiri for display). AYA_NOT_FOUND names the valid range. Commentary → shamela_lookup_t…
Narrators and isnads — Hadith narrators and isnad chains, from Shamela's rijal register and isnad index. `mode`: - narrators (default): a narrator by name → narrator_id, most-documented first, then earliest death year. Names collide: confirm the death year before using an id. - narrator: one dossier by narrator_id — lineage, death year, tabaqa, Ibn Hajar's and al-Dhahabi's grades, critics' jarh wa-ta'dil verdicts verbatim with source (the only paged part), hadith_notes on audition and irsal; include_network adds isnad-index counts per book and top teachers/students. Quote verdicts as worded; never synthesize a grad…
Tafsir coverage and texts for an ayah — Tafsir on one verse (aya_id OR surah + aya, else BAD_ARG). mode=coverage (default): which tafsir books cover it, fetching no text — shelves 3 (tafsir) and 4 (Qur'anic sciences; not 5, tajwid and qira'at) crossed with Shamela's curated tafsir index, plus index hits from other shelves (in_tafsir_categories:false). Status per book: indexed_covers (with page_id), indexed_no_entry_for_this_aya, or not_indexed_coverage_unknown — NOT evidence the book is silent. mode=texts: the commentary from several books in one call, each attributed (book, author, death year, printed page), read only from pages t…
Read pages, sections and tables of contents — Read an installed book's text and structure by internal ids. `unit`: - page (default): one page_id → body (author's matn), foot (editor's footnotes), printed page label, prev/next page ids, enclosing headings. - range: up to 20 consecutive pages from start_page_id, each with text, footnotes, printed page — to read on past a hit or through a span. - section: one chapter by title_id with its sub-headings, up to the next heading outside it. - toc: headings with their title_ids; top level by default, parent_id/depth expand, containing_page_id gives the chain enclosing a page. - parts: volumes — p…
Search page text (words, phrase, exact, boolean, batch) — Full-text search inside the pages (matn and footnotes) of installed books. `match` picks how the query is read: - words (default): every word required, ranked by relevance; options add morphology, wildcards, chronological sort. An all-words miss retries with fewer words (relaxed_min_match). - phrase: the words consecutively (a quotation). near: all words within `distance`, any order. Both verified in the full page text. - exact: diacritics, hamza/alef forms or digit systems kept distinct («أحمد» not «احمد», «عِلْم» not «عَلَم», ٢٥٥ not 255); set at least one `preserve` flag. - boolean: every …
Search the classical Islamic library — Search one named shelf of the classical Islamic library (8,594 works) for quotable passages: verbatim Arabic with book, author, printed volume/page, edition and a shamela.ws link. The default first search for hadith, tafsir, fiqh or creed. Not for isnads, narrators or diacritic-exact wording. Use shamela_search (match "words") to pin books or categories or to page past 10 results, shamela_read (unit "page") to read a whole page. Scope is one shelf per call; call again with another shelf to widen. Ranking: exact phrase first, then all the words; a madhhab scope asks that school's own books fir…
Survey a topic across the library — Count how much the library holds on a term and where: the exact matching-page total plus its distribution by category, Hijri century, book and author (top 15 each). Statistics only, never passages — use shamela_search(match='words') instead to retrieve and read the pages. Run it before searching to size a topic and pick scope.category_ids (map by_category names to ids with shamela_find(kind='category')). mode 'literal' (default, 6–9 ms) counts the word as written; 'morphological' counts every derived form of its root (seconds) and is often far broader. coverage_capped:true means the breakdown…
Search the classical Islamic 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.
Books by period (composition and death year) — كتب حسب المدة (تأليفًا ووفاةً) 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 t…
Server capabilities and search pitfalls — بيان قدرات الخادم ومزالق البحث 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 witho…
Get author details — جلب بيانات مؤلف 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.
Get an ayah — جلب آية 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 ver…
Get book details — جلب بيانات كتاب 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 plu…
List a book's volumes — أجزاء الكتاب 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.
Read a book chapter — جلب باب من كتاب 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>}).
Books that contain a 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).
Format a 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>…
A page's isnad and its chains — إسناد الصفحة وطرقه 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…
Narrator biography — ترجمة الراوي 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…
Read a 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…
Page cross-references — إشارات الصفحة 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 servic…
Read a range of pages — جلب نطاق صفحات 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…
Tafsir of an ayah — تفاسير آية 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 downloade…
Tafsir texts for an ayah — جلب نصوص تفسير آية 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 comme…
Get a book's table of contents — جلب فهرس الكتاب 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 …
List library 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 downl…
Tafsir coverage of an ayah — تغطية تفاسير آية 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…
Survey a topic across the library — استكشاف: حجم الموضوع في المكتبة وأين يقع 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 …
Resolve a name to an id — تحويل اسم إلى معرِّف 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.
Printed page to library 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 specifi…
Identify a cited 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 …
Arabic root frequency across the library — انتشار جذر في المكتبة 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 co…
Search the author catalogue — بحث في فهرس المؤلفين 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 sham…
Batch search (several queries) — بحث مجمَّع بعدة استعلامات 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 nea…
Search the book catalogue — بحث في فهرس الكتب 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_onl…
Boolean search (and / or / not) — بحث منطقي (و/أو/دون) 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 …
Exact search (diacritics, hamzas, digits) — بحث مطابق مع التشكيل والهمزات والأرقام 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 i…
Find a hadith by its wording — بحث عن حديث بنصه 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…
Search isnads — بحث في الأسانيد 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 …
Search isnad 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 do…
Search page text (body and footnotes) — بحث في صفحات الكتب 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 s…
Exact phrase and proximity search — بحث بالعبارة والتقارب 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 …
Search the 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 matc…
Search chapter headings — بحث في عناوين الفصول 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>]}}).
Unknown → Live
First tool surface recorded: 39 tools (server version 0.2.0)
https://qurangallery.com/mcp/shamela (mcp_streamable_http) — from mcp_registry, with the record
Showing the latest 6 events. The API returns up to 500 and filters by kind: ?kind=tool_surface_changed
{"additionalProperties":false,"properties":{"id":{"description":"A documentPage idfrom `search`\"{bookId}:{pageId}\", e.g. \"1173591681:1796\10\".— Shamela internal ids from a `search` result, not printed page numbers. Malformed or unknown ids return a tool error.","type":"string"}},"required": ⟨3 unchanged words⟩
{"properties":{"id":{"description":"\"{bookId}:{pageId}\", normalised.","type":"string"},"metadata":{"properties":{"author":{"type":"string"},"authorDied":{"description":"Year of death in AH, or null.","type":["integer","null"]},"book ⟨19 unchanged words⟩ ,"type":"boolean"},"edition":{"description":"Omitted when the library records none.","type":"string"},"editor":{"description":"Omitted when the library records none.","type":"string"},"hasFootnotes":{"type" ⟨2 unchanged words⟩ {"type":"integer"},"printedPage":{"description":"Volume and page as the printing paginates it, or null.","type":["string","null"]},"publisher":{"typedescription":"stringOmitted when the library records none."}},"requiredtype":["bookId","pageId","book","author","authorDied","printedPage","hasFootnotes","completestring"]}},"type":"object"},"text":{"description":"Main text, then the footnotes under their ownlabel.label (the editor's words). When metadata.complete is false it ends with the shamela_read(unit='page') call that continues it.","type":"string"},"title":{"typedescription":"string\"{book},— {author} ({volume}/{page})\"url.":{,"type":"string"}},"requiredurl":["id",{"titledescription",:"textThe same page on shamela.ws.","urltype",:"metadatastring"]}},"type":"object"}
⟨3 unchanged words⟩ {"query":{"description":"Arabic search text,—e.g.a\"إنماquotedالأعمال بالنيات\"; 2-6 words work best. Quote the wordingorifaknown, else name the topic.","type":"string"}},"required ⟨3 unchanged words⟩
{"properties":{"results":{"description":"At most 10 pages; empty when no page carries the words.","items":{"properties":{"id":{"description ⟨9 unchanged words⟩ ,"type":"string"},"title":{"typedescription":"string\"{book},— {author} ({volume}/{page})\"url, plus [footnote match], [token match] or [near match] when the match is weaker than the exact phrase in the main text.":{,"type":"string"}},"requiredurl":["id",{"titledescription",:"urlThe same page on shamela.ws."],"type":"objectstring"}},"type":"arrayobject"}},"requiredtype":["resultsarray"]}},"type":"object"}