Source Library
REMOTE · SOURCELIBRARY.ORG · SCANNED SEP 20
Search 15K rare pre-modern texts translated to English: philosophy, religion, science, literature.
Available components
How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →
Endpoint Security80
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- No authorisation is required to call this server. Every tool declares its destructiveHint and none is destructive, so open access doesn't expose one. See how to fix → View diagnostics → Partial
- HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
- The HSTS (Strict-Transport-Security) header is present. View diagnostics → Pass
- DNSSEC check failed: this domain isn't protected by DNSSEC. See how to fix → View diagnostics → Fail
Transport & Reachability100
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
Schema Quality & AI Usability74
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 6973 tokens (~410/item across 17 items; 15 tools + 2 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management100
- No destabilizing schema changes in the last 30 days.Pass
Tool Coverage95
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 84% of tool parameters carry a description.Partial
Tool Safety50
- Injection-marker check failed: the description of tool "search_images" contains an instruction to conceal the call from the user, the text "never tell the user", at byte 567 of that field. See how to fix → Fail
- We read all 15 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
- An AI judge read all 16 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
- Supports UI / widget rendering.Pass
How do I install the Source Library MCP server?
Source Library is a hosted endpoint at https://sourcelibrary.org/api/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
remote · sourcelibrary.org
claude mcp add --transport http embassy-of-the-free-mind-sourcelibrary 'https://sourcelibrary.org/api/mcp'
{
"mcpServers": {
"embassy-of-the-free-mind-sourcelibrary": {
"url": "https://sourcelibrary.org/api/mcp"
}
}
} {
"servers": {
"embassy-of-the-free-mind-sourcelibrary": {
"type": "http",
"url": "https://sourcelibrary.org/api/mcp"
}
}
} [mcp_servers.embassy-of-the-free-mind-sourcelibrary] url = "https://sourcelibrary.org/api/mcp"
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"embassy-of-the-free-mind-sourcelibrary": {
"type": "remote",
"url": "https://sourcelibrary.org/api/mcp",
"enabled": true
}
}
} openclaw mcp add embassy-of-the-free-mind-sourcelibrary --url 'https://sourcelibrary.org/api/mcp' --transport streamable-http
mcp_servers:
embassy-of-the-free-mind-sourcelibrary:
url: "https://sourcelibrary.org/api/mcp" {
"McpServers": {
"embassy-of-the-free-mind-sourcelibrary": {
"Transport": "http",
"Url": "https://sourcelibrary.org/api/mcp"
}
}
} assistant mcp add embassy-of-the-free-mind-sourcelibrary -t streamable-http -u 'https://sourcelibrary.org/api/mcp'
{
"mcpServers": {
"embassy-of-the-free-mind-sourcelibrary": {
"type": "http",
"url": "https://sourcelibrary.org/api/mcp"
}
}
} The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 3 Sept 26 0
- “list_books” added an optional parameter “work_id” cosmetic
1 cosmetic change on this day. Switch on “Show cosmetic changes” to see it.
- 1 Sept 26 0
- Tool “list_books” rewrote its description, which is the text the model reads security
- “list_books” added an optional parameter “author_id” cosmetic
- “list_books” added an optional parameter “edition_key” cosmetic
- “list_books” added an optional parameter “year_from” cosmetic
- “list_books” added an optional parameter “year_to” cosmetic
- “list_books” reworded the description of “search” cosmetic
- 30 Aug 26 0
- Tool “get_book_text” rewrote its description, which is the text the model reads security
- 29 Aug 26 0
- Tool “search_images” rewrote its description, which is the text the model reads security
- 28 Aug 26 0
- Tool “get_book_text” rewrote its description, which is the text the model reads security
- Tool “get_quotes” rewrote its description, which is the text the model reads security
- Tool “search_images” rewrote its description, which is the text the model reads security
- Tool “submit_feedback” rewrote its description, which is the text the model reads security
- “search_images” added an optional parameter “iconclass” cosmetic
- “search_images” added an optional parameter “offset” cosmetic
- “search_images” reworded the description of “year_from” cosmetic
- “search_images” reworded the description of “year_to” cosmetic
- 26 Aug 26 −2
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 25 Aug 26 0
- Stability: 0.97 → pass security
- 24 Aug 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 93 to 97. That category is still filling its 30-day observation window: 28 days of observed history at the previous scan, 29 at this one. The score rises as the window fills, whether or not the server changes.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 20 Sept 2026 · Probed https://sourcelibrary.org/api/mcp
TLS valid
Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .
| Subject | Issuer | Valid from | Valid until | Key | Signature | Serial |
|---|---|---|---|---|---|---|
| CN=sourcelibrary.org | CN=YE1,O=Let's Encrypt,C=US | 9 Sept 2026 | 8 Dec 2026 | ECDSA 256 | ECDSA-SHA384 | 6c9d333f5ea0e675273f9fec2eac5d25ac5 |
| SANs: *.sourcelibrary.org, sourcelibrary.org | ||||||
| CN=YE1,O=Let's Encrypt,C=US (CA) | CN=Root YE,O=ISRG,C=US | 3 Sept 2025 | 2 Sept 2028 | ECDSA 384 | ECDSA-SHA384 | 5ddd70dd31f801c85c186a7a04b80afe |
| CN=Root YE,O=ISRG,C=US (CA) | CN=ISRG Root X2,O=Internet Security Research Group,C=US | 13 May 2026 | 2 Sept 2032 | ECDSA 384 | ECDSA-SHA384 | 872165fc34b6e5fba8add5b3705fb53a |
| CN=ISRG Root X2,O=Internet Security Research Group,C=US (CA) | CN=ISRG Root X1,O=Internet Security Research Group,C=US | 13 May 2026 | 2 Sept 2032 | ECDSA 384 | SHA256-RSA | 6c8f1dc727c7117f7baf853ac980f9cd |
Background: What to check on a remote MCP endpoint →
DNSSEC insecure
Validation of sourcelibrary.org. — Not signed
| Zone | DS | Keys | Algorithms | Outcome |
|---|---|---|---|---|
| . | trust_anchor | 20326, 38696 | 8, 8 | Verified |
| org. | present | 26974 | 8 | Verified |
| sourcelibrary.org. | absent | Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation |
Authentication No authorisation required
The endpoint answered without asking for a token. Anyone who knows the URL can reach it.
| Result | No authorisation required |
|---|---|
| HTTP status | 200 |
| Header | Value |
|---|---|
| strict-transport-security | max-age=63072000; includeSubDomains; preload |
| content-security-policy | default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: data: https://translate.google.com https://translate.googleapis.com https://www.googletagmanager.com https://analytics.ahrefs.com https://eu-assets.i.posthog.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com https://translate.googleapis.com; font-src 'self' https://fonts.gstatic.com; img-src 'self' data: blob: https://images.sourcelibrary.org https://lh3.googleusercontent.com https://*.r2.dev https://*.public.blob.vercel-storage.com https://*.amazonaws.com https://iiif.archive.org https://archive.org https://dl.ndl.go.jp https://gallica.bnf.fr https://api.digitale-sammlungen.de https://www.e-rara.ch https://digi.vatlib.it https://*.bodleian.ox.ac.uk https://cudl.lib.cam.ac.uk https://diglib.hab.de https://iiif.hab.de https://iiif.wellcomecollection.org https://ccdl.claremont.edu https://upload.wikimedia.org https://*.loc.gov https://babel.hathitrust.org https://bl.digirati.io https://images.lib.cam.ac.uk https://www.e-c |
| x-content-type-options | nosniff |
| x-frame-options | DENY |
| referrer-policy | strict-origin-when-cross-origin |
| permissions-policy | camera=(self), microphone=(self), geolocation=() |
Background: How OAuth 2.1 works in the 2026 MCP spec →
Transports 2 probes
| Transport | URL | Outcome | Status | Location |
|---|---|---|---|---|
| streamable-http | https://sourcelibrary.org/api/mcp | Verified | 200 | |
| http (plaintext) | http://sourcelibrary.org/api/mcp | HTTPS enforced | 301 | https://sourcelibrary.org/api/mcp |
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
get_book Get Book ~476
READ PIPELINE step 1 — DISCOVER. START HERE for any named work or author. Returns the book's AI-generated summary, chapter list, edition metadata, DOI, page counts, IIIF manifest, and the cover image (inline, so you and the user can see the book). LANGUAGE: `language` is what is printed on THIS EDITION's leaves, which is frequently not the language the work was written in. Where they differ the response also carries `work_language`, `text_role` (original / period-translation / modern-translation) and a `translation_note` — read them before describing a passage as the author's own words, because an edition can be a translation of a translation (de Slane's 1863 French Muqaddimah, read in English, is English←French←Arabic). Absent `work_language` means the edition is in the work's own language. Use list_editions to find an original-language witness. The summary is typically a multi-paragraph orientation covering the book's argument, structure, and significance — often answering the question without further searching. Then: get_book_text to read a chapter or page range (step 2), get_quote / get_quotes to lock specific pages with full citation apparatus (step 3). search_within_book locates passages inside this book. MULTI-WORK VOLUMES: where the scans carry running heads, contains_works lists the works the volume ACTUALLY holds with their page spans, taken from the heads the printer put on each leaf. Trust it over the title — collected-works titles routinely name works the volume does not contain, and the volume holding a work often does not name it. If contains_works is absent the scans have no heads to read; status "insufficient-heads" means it was examined and could not be decided. EDITIONS: `editions` says which languages this book can be READ in and how many pages each covers ({ en: 357 } on most books, { en: 357, es: 357 } where a localized edition exists). Pass a code as `lang` to get_quote, get_quotes, get_book_text or search_within_book to read that edition; wi…
| Name | Type | Req | Description |
|---|---|---|---|
| book_id | string | yes | The book ID |
No output schema declared.
No examples provided.
get_book_text Read Book Text ~546
READ PIPELINE step 2 — READ. Read a book's text. Call get_book first (step 1) for the chapter list, then come here. Preferred: use the chapter param to read one chapter at a time (includes [Page N] markers for citation). Alternatively, use from/to for explicit page ranges (e.g. from=1 to=50). When you find passages worth quoting, hand the page numbers to get_quote / get_quotes (step 3) for verbatim text + a citation link. TRUNCATION: the response always includes truncated: true/false. When truncated=true, the truncation_note field gives the exact next from/to values to call — this means content was cut short by a page-budget limit, NOT that the book ended. An AI agent MUST NOT infer end-of-book from pages_returned alone; check truncated first. Daily page budgets apply across get_book_text/get_quote/get_quotes: anonymous 500 pages/24h, signed-in 1,000, free Explorer keys 2,000, paid keys uncapped — sign in at sourcelibrary.org/auth/signin or get a key at sourcelibrary.org/developers. Corpus-scale text belongs on the dataset API (sourcelibrary.org/dataset), not on this tool.
| Name | Type | Req | Description |
|---|---|---|---|
| book_id | string | yes | The book ID |
| chapter | number | – | Chapter index (0-based). Preferred over from/to — returns pre-structured chapter text with embedded [Page N] markers. |
| content | string | – | Which text to include: ocr (original language), translation (English), or both (default) |
| format | string | – | json (default, structured with per-page fields) or plain (concatenated text with page markers) |
| from | number | – | Start page number (inclusive). Use with to for explicit page ranges. |
| lang | string | – | 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… |
| part | number | – | Part number (1-based) for large chapters split into multiple parts |
| to | number | – | End page number (inclusive). Recommended chunk size: 50 pages. If the response has truncated=true, use the next from/to from truncation_note. |
No output schema declared.
No examples provided.
get_locus Find a Canonical Reference (Bekker / Stephanus) ~622
Turn a CANONICAL CITATION into the actual leaves that carry it. Aristotle is cited by Bekker number (1094a8, 1447a) and Plato by Stephanus number (Rep. 328b) — the references scholarship has used for centuries, which survive re-typesetting and are shareable in a way a scan page never is. USE THIS FIRST whenever a passage arrives as a canonical reference rather than a page: do not try to derive the page yourself from a book's pagination, which is what produced a wrong guess before this tool existed. Bekker numbers are unique across the whole Aristotelian corpus, so the number alone is enough and it also tells you WHICH WORK you are citing. Stephanus numbers restart in each of the three 1578 volumes, so pass work ("Republic", "Timaeus") — without it the response lists the candidate dialogues instead of choosing one. Returns every witness the library holds: the Greek reference edition and, where we have one, an English translation of the same lines, each with its scan page, a reader URL and a quote_api link — so you can compare the original against a translation at one reference. Then call get_quote with the returned book_id + page for the verbatim text and a citable shortlink. LIMITS, stated plainly: a witness is only returned where the reference is PRINTED on that leaf (or, in the two root editions, where a verified constant offset brackets it) — nothing is interpolated, so an empty result means this library holds no anchored leaf there, NOT that the citation is wrong; editions_searched shows what was consulted and the range each covers. Line numbers (the "8" of 1094a8) are not resolved — you get the right leaf and read the line off it. Two works can share a page where one ends and the next begins (Bekker 184 and 1447 are both such joins), and each leaf is filed by the running head printed on it, so a reference at the very start of a work may come back under its predecessor — always read other_works_at_this_reference before concluding a passage is absent. A bare num…
| Name | Type | Req | Description |
|---|---|---|---|
| reference | string | yes | The canonical reference: "1094a8", "1094a", "1447", "328b". A leading system name is accepted ("Bekker 1094a"), as is a work name ("Rep. 328b"). |
| system | string | – | Optional: "bekker" or "stephanus". Inferred from the work when omitted; do not guess it from the number, since the two ranges overlap. |
| work | string | – | 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. |
No output schema declared.
No examples provided.
get_quote Get Quote ~795
READ PIPELINE step 3 — CITE. Get the exact verbatim text of a single page plus its citation apparatus. ALWAYS use before putting text in quotation marks. The response headline is citation_link (the stable sourcelibrary.org/q/… shortlink) — present it to the user alongside the quote. Render as: > [exact translation text, verbatim] > — [Author], p. [N]. [citation_link] PAGE BREAKS: this corpus is paginated from physical leaves, and nearly one prose page-boundary in five has a sentence running across it — sometimes a word split by a hyphen ("…our move-" / "movements…"). A page that opens or breaks off mid-sentence still reads as complete prose and still carries a perfectly valid citation, so check the continuity field on every response BEFORE quoting: if continues_on_next or continues_from_previous is true, call again with context: true and quote the whole sentence. Quoting a fragment as though it were the author's complete thought is a misattribution even when the page number is right. NON-LATIN SCRIPTS: where the page is Greek, Hebrew, Arabic, Sanskrit, Cyrillic and so on, the response also carries romanized — the romanization of the original — so the citation can be shown in three layers: original → romanized → translation → citation_link. It is AI-generated reading apparatus, not a transcription; quote the source from original or translation, never from romanized. Absent on Latin-script pages and on non-Latin pages not yet romanized. ENGLISH ORIGINALS: where the leaf is already English there is no translation and none is needed — the response omits `translation`, sets `text_source: "ocr_original"`, and the verbatim text is `original` (with a `transcription_note`). Quote it as the source's own words, never as a translation, and expect period spelling and long-s (ſ) — it is an uncorrected transcription of the scan. `text_source` is on every response (`translation` otherwise), so branch on it rather than guessing from pages_translated, which is 0 for an English-origi…
| Name | Type | Req | Description |
|---|---|---|---|
| book_id | string | yes | The book ID |
| context | boolean | – | 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… |
| include_image | boolean | – | 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 O… |
| lang | string | – | 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… |
| page | number | yes | Page number |
No output schema declared.
No examples provided.
get_quotes Get Quotes (batch) ~413
READ PIPELINE step 3 — CITE, in batch. Get verbatim text + citation_link for SEVERAL pages of a single book in one round-trip, to assemble a multi-passage dossier. Specify either pages (an explicit array, e.g. [12, 40, 41]) or an inclusive from/to range. Max 25 pages per call. Each entry carries its own citation_link to present alongside the quote, and — on non-Latin-script pages that have one — a romanized layer to show between the original and the translation (AI apparatus, not a transcription). Every entry also carries `text_source`: `translation` normally, or `ocr_original` on a leaf that is already English, where the verbatim text is `original` and must be attributed as the source's own words rather than as a translation. One batch can mix both — a Latin volume can hold an English preface. Batch pages count toward the shared daily page budget (see get_book_text); this is a citation tool, and corpus-scale extraction belongs on the dataset API (sourcelibrary.org/dataset).
| Name | Type | Req | Description |
|---|---|---|---|
| book_id | string | yes | The book ID |
| from | number | – | Start page (inclusive) of a range. Use with to. |
| include_image | boolean | – | 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. |
| lang | string | – | 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 | array | – | Explicit list of page numbers (e.g. [12, 40, 41]). Use this OR from/to. |
| to | number | – | End page (inclusive) of a range. Use with from. |
No output schema declared.
No examples provided.
list_books List Books ~527
BROWSES/FILTERS THE CATALOG by metadata (canonical author via author_id, author/title fragment via search, language, category, year range, translation recency) — no content/topic matching. PICK THIS to see WHAT EXISTS by an author or in a tradition, or to enumerate a date range. Returns books with title, author (string + canonical author_id + author_url), language, year, and translation progress. → For a relevance-ranked topic search use search_library; for passages on a theme use search_translations (exact words) or search_concept (by meaning).
| Name | Type | Req | Description |
|---|---|---|---|
| author_id | string | – | 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_i… |
| category | string | – | – |
| edition_key | string | – | 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 nev… |
| has_edition | string | – | 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 lang… |
| language | string | – | – |
| limit | number | – | Max results (default 100, max 200) |
| search | string | – | Free-text filter matching title or author (relevance-ranked, may include title matches). For exactly one person's books use author_id instead. |
| sort | string | – | – |
| work_id | string | – | 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:… |
| year_from | number | – | Earliest edition year (inclusive). Matches only books with a known numeric year — ~60% of the library. |
| year_to | number | – | Latest edition year (inclusive). |
No output schema declared.
No examples provided.
list_editions List Editions of a Work ~193
Every edition of one work that the library holds — the other witnesses to the same text, across languages and centuries. Give it a book_id (easiest: the id of any edition you already found) or a work_id. USE THIS when a quotation needs checking against more than one witness, when you want the original-language text behind a translation, or when comparing how a passage reads across editions — differences between witnesses are often the finding. Returns language, date, page count and translation coverage per edition, so you can pick the right one to read. Note: for multi-volume collected works the identifier names the SET rather than a single text, and the response says so explicitly when that applies.
| Name | Type | Req | Description |
|---|---|---|---|
| book_id | string | – | Any edition you already have. Its work is looked up and the siblings returned. |
| work_id | string | – | A work identifier, if you already have one (from get_book). |
No output schema declared.
No examples provided.
propose_collection Propose a Collection ~220
Propose a themed collection of books to the Source Library team — a title, a rationale (why these books belong together and what thread connects them), and an ordered list of book ids. Get book ids from search_library / list_books / get_book. Like submit_feedback and share_findings, this goes to the team for REVIEW — it does NOT create a public collection instantly; a curator reviews and approves it. Use this when the user has identified a coherent set of books worth grouping and wants to contribute that curation back.
| Name | Type | Req | Description |
|---|---|---|---|
| book_ids | array | yes | Ordered list of book ids to include (1-200). Get ids from search_library / list_books / get_book. |
| string | – | – | |
| name | string | – | – |
| rationale | string | yes | Why these books belong together and what connects them (max 5000 chars) |
| suggested_slug | string | – | Optional URL slug suggestion, e.g. "renaissance-astronomy" |
| title | string | yes | Title of the proposed collection (2-200 chars) |
No output schema declared.
No examples provided.
search_concept Search by Concept ~630
RETURNS QUOTABLE PASSAGES matched by MEANING (cosine similarity on Gemini embeddings, 768d) — paraphrases and adjacent phrasings match even with zero keyword overlap. PICK THIS when the modern term won't literally appear in historical texts — e.g. "distributed cognition" maps to passages about active intellect, art of memory, wax tablet metaphors; "social contract" maps to pre-Hobbesian discussions of consent and authority. → For exact words/distinctive terms use search_translations (cheaper, more precise); to list which BOOKS cover a topic use search_library; if the user named an author/work, get_book first (semantic search is expensive — reserve it for cross-corpus discovery). Similarity calibration: 0.70+ is a strong match, 0.55–0.70 is worth reading but verify, below 0.55 is mostly conceptual drift. Set max_per_book to diversify results across many books rather than cluster on one source. Each passage carries a snippet_type — quote only "translation" snippets, never "summary". Cross-cultural tip: for pre-modern or non-Western topics, also try source-tradition vocabulary — e.g. for seminal economy try "jing preservation" or "bindu yoga" or "istimnāʾ"; for masturbation try "mollities" (Latin) or "hastamaithuna" (Sanskrit) or "shouyin" (Chinese). The corpus is indexed via period translations that use tradition-internal terminology, so adjacent/euphemistic terms often surface material that modern English keywords miss.
| Name | Type | Req | Description |
|---|---|---|---|
| exclude_languages | array | – | Exclude these languages, e.g. ["Latin", "French", "German", "English"] to surface non-Western sources. |
| lang | string | – | 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… |
| language | string | – | Filter by a single original language |
| languages | array | – | Filter to any of these languages, e.g. ["Sanskrit", "Arabic", "Chinese"]. Use instead of language when targeting multiple traditions. |
| limit | number | – | Max passages (default 15, max 50) |
| max_per_book | number | – | Cap on passages from any single book. Useful when one book dominates the conceptual neighborhood; set to 1–2 for diverse author/work coverage. |
| query | string | yes | 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 cor… |
| year_from | number | – | Restrict to books published in or after this year (filters out modern editions and translations). |
| year_to | number | – | Restrict to books published in or before this year. |
No output schema declared.
No examples provided.
search_images Search Images ~882
Search 200,000+ historical illustrations, emblems, engravings, diagrams, AND 24,000+ artworks (paintings, prints, sculptures). Filter by type, subject, figure, symbol, year. Results interleave two collections: illustrations extracted from book pages (each with a page number and book link) and standalone museum artworks (type: "artwork"). The first few results also return as inline images YOU can see. Hosts that support MCP Apps render an in-chat image gallery for this tool automatically; on other clients images may sit inside the collapsed tool-result view, so never tell the user images are "rendered above" unless the gallery appeared — describe what you see and give each image's url link instead. Every image_url is public and stable — an HTML page that references them directly works in any online browser. If images.length is 0, read the note field — an empty result under a book_id filter means that book has no EXTRACTED images yet, not that the physical book has no plates. A broad query can match tens of thousands (read total): narrow with type/subject/symbol/iconclass or page with offset instead of raising limit. On museum-artwork results, a title_is_descriptive flag means the title is an AI description of the picture rather than a title the work was published under — cite such a record by its source_record_title, never by the descriptive one (#4288).
| Name | Type | Req | Description |
|---|---|---|---|
| book_id | string | – | Only return images extracted from this book's pages. Excludes the museum-artwork collection (artworks do not belong to books). |
| figure | string | – | – |
| iconclass | string | – | Filter by Iconclass notation, prefix-matched ("49" matches 49G22, 49E39, …). Coverage is SPARSE: only ~2,500 of 206K images carry a notation, so an empty result means the classifier has not run on ma… |
| include_thumbnail_base64 | boolean | – | 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 c… |
| limit | number | – | Max results (default 20, max 50) |
| offset | number | – | 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 galle… |
| query | string | – | Text search (e.g., "ouroboros", "tree of life") |
| subject | string | – | – |
| symbol | string | – | – |
| type | string | – | 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. |
| year_from | number | – | 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 yea… |
| year_to | number | – | See year_from — same reliability caution applies. |
No output schema declared.
No examples provided.
search_library Search Library ~296
RETURNS A LIST OF BOOKS (works on a topic) — NOT passages. PICK THIS to discover which works exist on a subject. → For quotable text use search_translations (exact words) or search_concept (by meaning); if the user already named an author/work, call get_book directly (or list_books to find the ID) — the AI summary + chapter outline is usually the right first answer. Searches titles, authors, subjects, and (as a secondary signal) translated text. Query tips: single distinctive words or short phrases work best ("memory palace", "ouroboros"); quoted phrases match exactly. Each result includes total_matches (full count) + returned (this page) + offset for pagination.
| Name | Type | Req | Description |
|---|---|---|---|
| has_translation | boolean | – | Only return books with translations |
| language | string | – | Filter by original language (e.g., Latin, German, Greek) |
| limit | number | – | Max results per page (default 10, max 100) |
| offset | number | – | Pagination offset (use with limit to page through total_matches; default 0) |
| query | string | yes | Search query — prefer single distinctive concepts ("alchemy", "tree of life") over long natural-language phrases. Wrap in "double quotes" for exact phrase. |
| sort | string | – | – |
| year_from | number | – | Publication year range start |
| year_to | number | – | Publication year range end |
No output schema declared.
No examples provided.
search_translations Search Translations ~570
RETURNS QUOTABLE PASSAGES (page-level snippets + citation URLs), matched by KEYWORD/term. PICK THIS to find a quote or textual evidence on a topic across the whole library. → If the modern word won't literally appear in historical texts, use search_concept (matches by meaning); to list which BOOKS cover a topic use search_library; to dig inside one known book use search_within_book; if the user named an author/work, get_book first (its AI summary is usually the right first read). Query tips: single distinctive terms ("memory palace", "wax tablet") work best; multi-word natural-English queries ("unity of the intellect") may return fewer results because matching is term-based, not phrase-based. Each snippet has a snippet_type — "translation"/"ocr" means it is a verbatim extract from the source text; "summary" means it is AI-generated description (do not quote those as the author's words). Response includes total_matches, returned, and offset for pagination. Cross-cultural tip: for pre-modern or non-Western topics, search source-tradition vocabulary rather than modern English terms — e.g. for seminal economy search "jing" or "bindu" or "istimnāʾ", not "semen retention"; for female homoeroticism search "tribade" or "sahq", not "lesbian". The corpus is indexed via period translations that use tradition-internal terminology.
| Name | Type | Req | Description |
|---|---|---|---|
| book_id | string | – | Search within a specific book |
| exclude_languages | array | – | Exclude these languages, e.g. ["Latin", "French", "German", "English"] to surface non-Western sources. |
| lang | string | – | 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… |
| language | string | – | Filter by a single original language |
| languages | array | – | Filter to any of these languages, e.g. ["Sanskrit", "Arabic", "Chinese"]. Use instead of language when targeting multiple traditions. |
| limit | number | – | Max results per page (default 20, max 50) |
| offset | number | – | Pagination offset (use with limit to page through total_matches; default 0) |
| query | string | yes | 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 qu… |
| year_from | number | – | – |
| year_to | number | – | – |
No output schema declared.
No examples provided.
search_within_book Search Within Book ~356
SEARCHES INSIDE ONE BOOK (requires book_id). PRIMARILY KEYWORD: it runs a lexical search over the book's pages plus a narrow scoped-semantic pass (top ~10), interleaved by relevance. PICK THIS when you know the wording you are looking for, or want every page of one book mentioning a term. → IF YOU ARE SEARCHING FROM A PARAPHRASE, a half-remembered line, or a modern restatement, USE search_concept INSTEAD — it is the meaning-matching tool and it searches the whole corpus, including translations whose vocabulary differs completely from yours (Thomas Taylor writes "energies" for energeia and "felicity" for eudaimonia, so a sensible modern paraphrase can miss his pages entirely while matching semantically). → To find the book first, use search_library or search_concept, then pass its book_id here. Each result carries score (0-1, normalised within this book) and found_by ("keyword", "semantic", or "both" — both is the strongest signal). Results flagged is_front_matter are the translator's or publisher's words rather than the author's, and are ordered last. Returns OCR and translation snippets with page numbers, ready to cite.
| Name | Type | Req | Description |
|---|---|---|---|
| book_id | string | yes | The book ID to search within |
| lang | string | – | 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… |
| query | string | yes | Search query |
No output schema declared.
No examples provided.
share_findings Share Findings ~197
Share a research dossier back to the Source Library team — a title, an optional summary, and an ordered list of citations (the passages your thesis rests on). Each citation is a reference { book_id, page, note }, NOT copied text: the library re-renders the canonical quote from the reference, so links stay authoritative. Use this when the user has assembled a thesis backed by passages across one or more books and wants to contribute it back. Like submit_feedback, this goes to the team for review (not an instant public page).
| Name | Type | Req | Description |
|---|---|---|---|
| citations | array | yes | Ordered list of supporting passages (1-50). Get book_id + page from get_quote / search_translations. |
| string | – | – | |
| name | string | – | – |
| summary | string | – | Optional prose summarizing the argument (max 5000 chars) |
| title | string | yes | Title of the dossier / thesis (2-300 chars) |
No output schema declared.
No examples provided.
submit_feedback Submit Feedback ~157
Submit feedback, bug reports, or feature requests to the Source Library team. Before proposing NEW functionality, read https://sourcelibrary.org/llms.txt and https://sourcelibrary.org/developers — several past submissions proposed building things that already exist (IIIF manifests, Content Search, DTS), which wastes reviewer time. State in the report which docs you checked. Bug reports with record IDs and reproducing queries are the most actionable kind.
| Name | Type | Req | Description |
|---|---|---|---|
| string | – | – | |
| message | string | yes | 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. |
| name | string | – | – |
No output schema declared.
No examples provided.
What is the Source Library MCP server?
Source Library is an MCP server listed in the public MCP registry as io.github.Embassy-of-the-Free-Mind/sourcelibrary. Search 15K rare pre-modern texts translated to English: philosophy, religion, science, literature. This page covers its hosted endpoint (https://sourcelibrary.org/api/mcp).
Is the Source Library MCP server safe to use?
Source Library scores 84 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the Source Library MCP server expose?
Source Library exposes 15 tools: search_library, search_translations, search_concept, search_within_book, list_books, and 10 more. Their descriptions and schemas cost roughly 6,880 tokens of context every time the server is loaded.
Does the Source Library MCP server require authentication?
No. We connected to Source Library without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.
Is the Source Library MCP server still maintained?
Source Library is still listed as active in the MCP registry. We last reached this channel on 20 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.