Source Library
What this MCP does
Provides searchable access to rare pre-modern texts, translations, images, book metadata, page text, canonical references, and citation-ready quotations.
Tools
Input schema
{'type': 'object', 'required': ['book_id'], 'properties': {'book_id': {'type': 'string', 'description': 'The book ID'}}}
Input schema
{'type': 'object', 'required': ['book_id'], 'properties': {'to': {'type': 'number', 'description': 'End page number (inclusive). Recommended chunk size: 50 pages. If the response has truncated=true, use the next from/to from truncation_note.'}, 'from': {'type': 'number', 'description': 'Start page number (inclusive). Use with to for explicit page ranges.'}, 'lang': {'type': 'string', 'description': 'ISO code of the EDITION to read, e.g. "es". Default "en". Resolved PER PAGE: a page with no text in that language comes back as English, labelled `translation_lang: "en"` (json) or `[Translation — en]` (plain), and the response carries lang_coverage. Chapter text is materialized in English only, so `chapter` with a non-English `lang` is served from the chapter\'s page range instead.'}, 'part': {'type': 'number', 'description': 'Part number (1-based) for large chapters split into multiple parts'}, 'format': {'enum': ['json', 'plain'], 'type': 'string', 'description': 'json (default, structured with per-page fields) or plain (concatenated text with page markers)'}, 'book_id': {'type': 'string', 'description': 'The book ID'}, 'chapter': {'type': 'number', 'description': 'Chapter index (0-based). Preferred over from/to — returns pre-structured chapter text with embedded [Page N] markers.'}, 'content': {'enum': ['ocr', 'translation', 'both'], 'type': 'string', 'description': 'Which text to include: ocr (original language), translation (English), or both (default)'}}}
Input schema
{'type': 'object', 'required': ['reference'], 'properties': {'work': {'type': 'string', 'description': 'The work or dialogue, when the reference needs it (Plato always does): "Republic", "Timaeus", "Laws", "Nicomachean Ethics", "Poetics". Greek or Latin titles as printed in the editions also resolve.'}, 'system': {'type': 'string', 'description': 'Optional: "bekker" or "stephanus". Inferred from the work when omitted; do not guess it from the number, since the two ranges overlap.'}, 'reference': {'type': 'string', 'description': 'The canonical reference: "1094a8", "1094a", "1447", "328b". A leading system name is accepted ("Bekker 1094a"), as is a work name ("Rep. 328b").'}}}
Input schema
{'type': 'object', 'required': ['book_id', 'page'], 'properties': {'lang': {'type': 'string', 'description': 'ISO code of the EDITION to quote, e.g. "es". Default "en". `quote.lang` on every response says which edition was actually served — where no such edition exists the English translation comes back with lang: "en" and a lang_note, and it must not be presented as the requested edition. The citation link follows the edition served.'}, 'page': {'type': 'number', 'description': 'Page number'}, 'book_id': {'type': 'string', 'description': 'The book ID'}, 'context': {'type': 'boolean', 'description': 'Also return the full text of the previous and next pages, so a sentence spanning the page break can be read whole. Set this when continuity.continues_from_previous or continues_on_next came back true on an earlier call, or whenever you are about to quote near a page edge.'}, 'include_image': {'type': 'boolean', 'description': 'Also return the scan of the cited leaf as an inline image (display size, ≤1200px). Set this when the user would benefit from SEEING the page — an illustrated leaf, a title page, a diagram, disputed OCR — or asks to see it. The image arrives as an MCP image block you can view and the user sees rendered.'}}}
Input schema
{'type': 'object', 'required': ['book_id'], 'properties': {'to': {'type': 'number', 'description': 'End page (inclusive) of a range. Use with from.'}, 'from': {'type': 'number', 'description': 'Start page (inclusive) of a range. Use with to.'}, 'lang': {'type': 'string', 'description': 'ISO code of the EDITION to quote, e.g. "es". Default "en". Resolved per page — one batch can mix editions, so read `quote.lang` on each entry rather than assuming the whole dossier is in one language.'}, 'pages': {'type': 'array', 'items': {'type': 'number'}, 'description': 'Explicit list of page numbers (e.g. [12, 40, 41]). Use this OR from/to.'}, 'book_id': {'type': 'string', 'description': 'The book ID'}, 'include_image': {'type': 'boolean', 'description': 'Also return page scans as inline images (display size). The first 5 pages of the batch get inline image blocks; every entry still carries its page_image_url in the JSON.'}}}
Input schema
{'type': 'object', 'properties': {'sort': {'enum': ['recent-translation', 'recent', 'title-asc', 'title-desc'], 'type': 'string'}, 'limit': {'type': 'number', 'description': 'Max results (default 100, max 200)'}, 'search': {'type': 'string', 'description': "Free-text filter matching title or author (relevance-ranked, may include title matches). For exactly one person's books use author_id instead."}, 'work_id': {'type': 'string', 'description': 'Every witness of one WORK, across editions, languages and centuries — pass the work_id from a result row or from get_book. Use this instead of a title search whenever you already hold the identifier: witnesses of one work are often titled differently in each language, so a title search finds only the subset that happens to share your wording. Unlike list_editions (which returns the whole set), this composes with language, year_from/year_to and sort.'}, 'year_to': {'type': 'number', 'description': 'Latest edition year (inclusive).'}, 'category': {'type': 'string'}, 'language': {'type': 'string'}, 'author_id': {'type': 'string', 'description': 'Canonical author slug, e.g. "jan-hus" — filters to exactly that person\'s books via the author thesaurus (variant slugs resolve to the canonical person). Every book row in results carries its author_id; the response echoes the canonicalized author.'}, 'year_from': {'type': 'number', 'description': 'Earliest edition year (inclusive). Matches only books with a known numeric year — ~60% of the library.'}, 'edition_key': {'type': 'string', 'description': 'Other digitizations of ONE printing — pass the edition_key from a result row. Only full-quality keys match on both sides, so this answers "what other scans of this exact edition do you hold?" and never merges different printings of the same title.'}, 'has_edition': {'type': 'string', 'description': 'ISO code — return only books READABLE in that language, e.g. "es". Different from `language`, which is the language printed on the leaves of the scan: a Latin book with a Spanish edition matches language="Latin" AND has_edition="es". Each result then also carries url_localized.'}}}
Input schema
{'type': 'object', 'properties': {'book_id': {'type': 'string', 'description': 'Any edition you already have. Its work is looked up and the siblings returned.'}, 'work_id': {'type': 'string', 'description': 'A work identifier, if you already have one (from get_book).'}}}
Input schema
{'type': 'object', 'required': ['title', 'rationale', 'book_ids'], 'properties': {'name': {'type': 'string'}, 'email': {'type': 'string'}, 'title': {'type': 'string', 'description': 'Title of the proposed collection (2-200 chars)'}, 'book_ids': {'type': 'array', 'items': {'type': 'string', 'description': 'A book id'}, 'description': 'Ordered list of book ids to include (1-200). Get ids from search_library / list_books / get_book.'}, 'rationale': {'type': 'string', 'description': 'Why these books belong together and what connects them (max 5000 chars)'}, 'suggested_slug': {'type': 'string', 'description': 'Optional URL slug suggestion, e.g. "renaissance-astronomy"'}}}
Input schema
{'type': 'object', 'required': ['query'], 'properties': {'lang': {'type': 'string', 'description': 'ISO code of the EDITION to read, e.g. "es". Default "en". Most books have only English — call get_book and read `editions`, or list_books with has_edition, to find the ones that do not. The response always states which edition it served.'}, 'limit': {'type': 'number', 'description': 'Max passages (default 15, max 50)'}, 'query': {'type': 'string', 'description': 'A concept or natural-language description — full sentences are fine (e.g. "tools that extend the mind beyond the body"). Unlike search_translations, this does NOT require words that appear in the corpus.'}, 'year_to': {'type': 'number', 'description': 'Restrict to books published in or before this year.'}, 'language': {'type': 'string', 'description': 'Filter by a single original language'}, 'languages': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Filter to any of these languages, e.g. ["Sanskrit", "Arabic", "Chinese"]. Use instead of language when targeting multiple traditions.'}, 'year_from': {'type': 'number', 'description': 'Restrict to books published in or after this year (filters out modern editions and translations).'}, 'max_per_book': {'type': 'number', 'description': 'Cap on passages from any single book. Useful when one book dominates the conceptual neighborhood; set to 1–2 for diverse author/work coverage.'}, 'exclude_languages': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Exclude these languages, e.g. ["Latin", "French", "German", "English"] to surface non-Western sources.'}}}
Input schema
{'type': 'object', 'properties': {'type': {'type': 'string', 'description': 'Image type (woodcut, engraving, emblem, diagram). Best-effort: the medium metadata on museum artworks is unnormalized, so treat results as ranked rather than strictly filtered.'}, 'limit': {'type': 'number', 'description': 'Max results (default 20, max 50)'}, 'query': {'type': 'string', 'description': 'Text search (e.g., "ouroboros", "tree of life")'}, 'figure': {'type': 'string'}, 'offset': {'type': 'number', 'description': 'Skip this many book-illustration results — page through a large result set instead of raising limit. The response echoes offset and returns next_offset while more remain. Offsets > 0 return the gallery lane only (the museum-artwork lane has no pagination and is included only on the first page).'}, 'symbol': {'type': 'string'}, 'book_id': {'type': 'string', 'description': "Only return images extracted from this book's pages. Excludes the museum-artwork collection (artworks do not belong to books)."}, 'subject': {'type': 'string'}, 'year_to': {'type': 'number', 'description': 'See year_from — same reliability caution applies.'}, 'year_from': {'type': 'number', 'description': 'CAUTION: reliable only for book illustrations (source_type "book_illustration"). On museum-artwork records the year field is dirty — some 17th-century works carry ingest years like 2014, and null years bypass the range check entirely — so never draw a chronological conclusion from a year-filtered artwork result (#4288 tracks the cleanup).'}, 'include_thumbnail_base64': {'type': 'boolean', 'description': "Embed each result's image as a thumbnail_data_uri (data:image/jpeg;base64,…, ~1000px) directly in the JSON. ONLY useful when your harness consumes tool results programmatically (API/SDK agents that can save the bytes without retyping them) — as a chat assistant you CANNOT copy hundreds of KB of base64 into a file, so do not request this for that purpose. To build a self-contained page from chat instead: fetch the public image_url values with your execution sandbox (if egress is blocked, ask the user to allowlist images.sourcelibrary.org in their network settings), or reference the CDN URLs directly — they are public and stable, so the page works in any online browser. First 6 results only; inline image blocks are suppressed in this mode to keep the payload bounded."}}}
Input schema
{'type': 'object', 'required': ['query'], 'properties': {'sort': {'enum': ['relevance', 'date_asc', 'date_desc', 'title'], 'type': 'string'}, 'limit': {'type': 'number', 'description': 'Max results per page (default 10, max 100)'}, 'query': {'type': 'string', 'description': 'Search query — prefer single distinctive concepts ("alchemy", "tree of life") over long natural-language phrases. Wrap in "double quotes" for exact phrase.'}, 'offset': {'type': 'number', 'description': 'Pagination offset (use with limit to page through total_matches; default 0)'}, 'year_to': {'type': 'number', 'description': 'Publication year range end'}, 'language': {'type': 'string', 'description': 'Filter by original language (e.g., Latin, German, Greek)'}, 'year_from': {'type': 'number', 'description': 'Publication year range start'}, 'has_translation': {'type': 'boolean', 'description': 'Only return books with translations'}}}
Input schema
{'type': 'object', 'required': ['query'], 'properties': {'lang': {'type': 'string', 'description': 'ISO code of the EDITION to read, e.g. "es". Default "en". Most books have only English — call get_book and read `editions`, or list_books with has_edition, to find the ones that do not. The response always states which edition it served.'}, 'limit': {'type': 'number', 'description': 'Max results per page (default 20, max 50)'}, 'query': {'type': 'string', 'description': 'Search term — prefer single distinctive concepts ("harmony of the spheres", "active intellect") over long natural-language phrases. Multi-word queries match all terms (not phrase); wrap in "double quotes" for exact phrase.'}, 'offset': {'type': 'number', 'description': 'Pagination offset (use with limit to page through total_matches; default 0)'}, 'book_id': {'type': 'string', 'description': 'Search within a specific book'}, 'year_to': {'type': 'number'}, 'language': {'type': 'string', 'description': 'Filter by a single original language'}, 'languages': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Filter to any of these languages, e.g. ["Sanskrit", "Arabic", "Chinese"]. Use instead of language when targeting multiple traditions.'}, 'year_from': {'type': 'number'}, 'exclude_languages': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Exclude these languages, e.g. ["Latin", "French", "German", "English"] to surface non-Western sources.'}}}
Input schema
{'type': 'object', 'required': ['book_id', 'query'], 'properties': {'lang': {'type': 'string', 'description': 'ISO code of the EDITION to read, e.g. "es". Default "en". Most books have only English — call get_book and read `editions`, or list_books with has_edition, to find the ones that do not. The response always states which edition it served.'}, 'query': {'type': 'string', 'description': 'Search query'}, 'book_id': {'type': 'string', 'description': 'The book ID to search within'}}}
Input schema
{'type': 'object', 'required': ['title', 'citations'], 'properties': {'name': {'type': 'string'}, 'email': {'type': 'string'}, 'title': {'type': 'string', 'description': 'Title of the dossier / thesis (2-300 chars)'}, 'summary': {'type': 'string', 'description': 'Optional prose summarizing the argument (max 5000 chars)'}, 'citations': {'type': 'array', 'items': {'type': 'object', 'required': ['book_id', 'page'], 'properties': {'note': {'type': 'string', 'description': 'Optional note on why this passage matters'}, 'page': {'type': 'number', 'description': 'Page number'}, 'book_id': {'type': 'string', 'description': 'The book ID'}}}, 'description': 'Ordered list of supporting passages (1-50). Get book_id + page from get_quote / search_translations.'}}}
Input schema
{'type': 'object', 'required': ['message'], 'properties': {'name': {'type': 'string'}, 'email': {'type': 'string'}, 'message': {'type': 'string', 'description': 'Your feedback (2-20000 chars). Long structured reports are welcome — the limit was raised from 5,000 because agent reports were pressing against it and being split across submissions.'}}}
Recent tool changes
Similar MCP servers
concordance
Provides deterministic claim verification and audit receipts, along with Bible references, commentary, geography, indexed knowled…
canton-ccpedia
Searches and explains Canton Network and Daml documentation, governance proposals, forums, code examples, APIs, releases, and eco…
BNM Data Shop
Sells access to cached official reports, enforcement orders, regulatory documents, inspection records, and other public-source te…
api-evangelist
Provides API governance analysis, OpenAPI overlays and version diffs, security-sensitive field classification, code samples, matu…
OpenHelvetia Gateway
Provides sourced access to Swiss federal legislation and political data, including law metadata, versions, amendments, citations,…
website-search
Provides security article search and structured guidance, templates, frameworks, and review criteria for incident response, threa…
The Ainglish Project
Maintains a measured, auditable register of language constructs, proposals, evidence, adoption, contributors, protocols, and rati…
Torah Library
Provides searchable Jewish texts, commentaries, source sheets, dictionaries, manuscripts, calendars, learning schedules, parasha …