Skip to main content
Glama

Server Details

Search 15K rare pre-modern texts translated to English: philosophy, religion, science, literature.

If you are the author of this connector, you can claim ownership by verifying the domain or GitHub account it belongs to. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Uptime
100.0% over 72 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
Repository
Embassy-of-the-Free-Mind/sourcelibrary-v2
GitHub Stars
0

TDQS

A4.4/5.0

Scored across 22 tools

Disambiguation4/5

The tool set mostly has clearly distinct roles, and the descriptions actively steer between near-neighbours such as search_library vs list_books and search_translations vs search_concept vs search_within_book. A few clusters still require careful reading, especially the search/discovery tools and the review tools, but the boundaries are documented and learnable.

Naming Consistency5/5

Names follow a consistent snake_case, mostly verb-led convention: list_books, get_book, search_library, start_review_shift, submit_page_review, propose_correction. There are minor variations like get_locus and search_within_book, but no camelCase mixing or chaotic verb patterns.

Tool Count4/5

At 22 tools the surface is heavy, but the server spans discovery, reading, citation, image search, volunteer review, and contribution workflows, so most tools earn their place. Some consolidation is possible—especially get_quote/get_quotes and the several search entry points—but the count is reasonable for the breadth of the domain.

Completeness5/5

The set covers the full research lifecycle: holdings checks, catalog discovery, semantic and keyword search, in-book reading, editions, citations, images, review shifts, corrections, feedback, and collection proposals. I do not see obvious dead ends for the stated purpose, aside from optional administrative functions.

Available Tools

22 tools
check_duplicateCheck HoldingsA
Read-onlyIdempotent
Inspect

DOES THE LIBRARY HOLD THIS WORK? Call this BEFORE telling the user the library lacks a book, and before proposing one for acquisition. A miss from list_books or search_library is NOT evidence of absence: list_books matches words and search_library ranks by relevance, so a held book can sit behind dozens of better-ranked hits. Give a title + author (+ year if known), or a library URL (Internet Archive, Gallica, e-rara, BSB, a IIIF manifest). Matches the same scan, the same edition, other editions and the same work, plus near and cross-lingual titles (title in any language). Returns a verdict (same_object / same_edition / possible_same_edition / other_edition / related_title / new), confidence, matches with reasons, ids and URLs, held_not_public (copies held but not yet published: counted, not described), and limits (what the check could not search). A "new" verdict from a URL alone has not searched other editions; pass the title and author too.

NameRequiredDescriptionDefault
urlNoA library URL or IIIF manifest for a specific copy (title then optional).
yearNoEdition year, if known. Separates "same edition" from "another edition".
ia_idNoInternet Archive identifier, for an exact same-scan match.
titleNoTitle in any language, original or English, e.g. "Musurgia universalis".
authorNoAuthor in any form ("Athanasius Kircher", "Kircher, Athanasius"). Strongly improves matching.
languageNoLanguage hint for the cross-lingual title match (optional).

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover safety (readOnly, idempotent, non-destructive, closed-world), but the description goes well beyond them: it discloses what categories are matched (same scan, same edition, other editions, cross-lingual titles), the verdict enum, the held_not_public behavior (counted, not described), and the limits field. This is rich behavioral context a caller could not infer from structured data.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core question and the when-to-call rule, and every sentence carries information (inputs, match scope, return fields, caveat). The single dense paragraph is longer than ideal and packs several distinct ideas without breaks, which costs a little readability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description carries the return-value burden itself and does so completely: it enumerates the verdict values, confidence, matches with reasons, ids/URLs, held_not_public, and limits. Combined with the input guidance and the under-search caveat, an agent has everything needed to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already 100%, so the baseline is 3; the description adds practical combination guidance ('give a title + author (+ year if known), or a library URL') and warns that a URL-only verdict under-searches, so pass title and author too. It also restates the year's discriminating role, which is helpful framing even though the schema covers it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific, capitalized question ('DOES THE LIBRARY HOLD THIS WORK?') that names both the verb (check holdings) and the resource (the work), and explicitly contrasts itself with list_books and search_library. An agent can tell it apart from every sibling without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit when-to-use rule ('Call this BEFORE telling the user the library lacks a book, and before proposing one for acquisition') and explains why the obvious alternatives are insufficient (list_books matches words, search_library ranks by relevance). It also names the required input shape and the caveat about URL-only checks. Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

continue_review_shiftContinue a Review ShiftA
Read-onlyIdempotent
Inspect

Next page of the book being reviewed. Call it straight after finishing a page until the stretch the user chose is done, and again when they ask for more. Pass next.book and next.after from the previous page, and volunteer_code. Returns the same shape as start_review_shift; follow how_to_run again. When page is null the book is finished: say so and offer start_review_shift with new_book true.

NameRequiredDescriptionDefault
bookYesnext.book from the previous page
afterYesnext.after from the previous page
volunteer_codeYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so safety is covered. The description adds genuine behavioral context beyond that: the output mirrors start_review_shift's shape, how_to_run must be followed again, and a null page signals the book is finished. It is slightly indirect by deferring detail to start_review_shift rather than restating it.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the purpose in the first clause, then layers invocation timing, parameter sourcing, and termination handling in minimal sentences. Every sentence carries distinct information with no repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description correctly covers the return contract by pointing to start_review_shift's shape and its how_to_run guidance, and it documents the null-page terminal state. The only shortfall is reliance on another tool's description for return detail rather than being self-contained.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 67%: 'book' and 'after' are documented in the schema, and the description usefully ties them to 'next.book'/'next.after from the previous page', clarifying the chained-call dependency. However, 'volunteer_code' is left unexplained in both schema and description, so the description only partially compensates for the coverage gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Next page of the book being reviewed') and implicitly distinguishes itself from start_review_shift by being the continuation rather than the initiation. An agent can tell which of the two review tools to call without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit timing is given: call it straight after finishing a page until the user's chosen stretch is done, and again on request. It also names the terminal branch — when page is null, offer start_review_shift with new_book true — so the when-to-stop condition and the alternative tool are both spelled out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_bookGet BookA
Read-onlyIdempotent
Inspect

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 the record knows they differ the response also carries work_language and a translation_note, and text_role (original / period-translation / modern-translation / unclassified) says what kind of witness this is — 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 work's language is NOT RECORDED on this record. It is not a statement that the edition is in the work's own language (most records have never been checked; Risner's 1572 Latin Alhazen carries none, and the work is Arabic). Only text_role: "original" asserts that these are the author's own words in the author's language; text_role: "unclassified" means nobody has examined it, so do not infer the work's language from language, and do not conclude the library lacks a tradition because a language filter came back empty. 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; without it you get English.

NameRequiredDescriptionDefault
book_idYesThe book ID

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only cover the safety profile (readOnly/idempotent/non-destructive), and the description adds substantial non-obvious behavior: `text_role` semantics, the meaning of an absent `work_language` (not-recorded, not 'same as edition'), the `contains_works`/`insufficient-heads` behavior for multi-work volumes, and the `editions` language codes. This is exactly the kind of interpretive context annotations cannot carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the pipeline role and well-organized under labeled sections (LANGUAGE, MULTI-WORK VOLUMES, EDITIONS). It is long, and the language caveat is restated a few times ('do not infer the work's language' recurs), but nearly every sentence carries distinct operational meaning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the description carries the burden of explaining returns, and it does so thoroughly (summary, chapters, editions, contains_works, text_role). Combined with the pipeline positioning, an agent has everything needed to call it correctly and interpret the result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only one parameter (book_id) and schema coverage is 100%, so the schema already documents it fully; the description adds no syntax or format detail for book_id. The rich language discussion concerns response fields and other tools' `lang` parameter, not this tool's input, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb/role ('READ PIPELINE step 1 — DISCOVER') and explicitly enumerates what is returned (summary, chapter list, edition metadata, DOI, page counts, IIIF manifest, cover image). It positions itself precisely against siblings by naming get_book_text as 'step 2' and get_quote/get_quotes as 'step 3', so the agent can route without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit entry condition ('START HERE for any named work or author') and names alternatives with their selecting conditions (list_editions for an original-language witness, search_within_book for passages inside the book). It also states negative guidance: do not infer the work's language from `language`, and do not conclude a tradition is absent because a filter came back empty.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_book_textRead Book TextA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault
toNoEnd page number (inclusive). Recommended chunk size: 50 pages. If the response has truncated=true, use the next from/to from truncation_note.
fromNoStart page number (inclusive). Use with to for explicit page ranges.
langNoISO 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.
partNoPart number (1-based) for large chapters split into multiple parts
formatNojson (default, structured with per-page fields) or plain (concatenated text with page markers)
book_idYesThe book ID
chapterNoChapter index (0-based). Preferred over from/to — returns pre-structured chapter text with embedded [Page N] markers.
contentNoWhich text to include: ocr (original language), translation (English), or both (default)

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Massive behavioral context beyond annotations: truncation semantics, truncated flag, truncation_note for resuming, daily page budgets, auth tiers, per-page language fallback behavior, and the explicit warning not to infer end-of-book from pages_returned. Annotations already mark readOnly/idempotent, and the description adds significant operational detail.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but well-structured into pipeline, truncation, budget, and scope sections. Every sentence provides actionable information; no filler. Slightly dense, but the tool's complexity and the absence of an output schema justify the length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex 8-parameter read tool with no output schema, the description covers return signals (truncated, truncation_note, lang_coverage, page markers), usage patterns, budget limits, and authentication paths. Nothing critical an agent needs to call this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema covers 100% of parameters, so the baseline is 3. The description adds semantic value by recommending chapter over from/to, explaining truncation_note supplies next from/to values, and clarifying language resolution behavior. This goes beyond the schema descriptions, though the schema already carries substantial per-parameter meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states the action ('Read a book's text') and places it in the READ PIPELINE as step 2, distinguishing it from get_book (step 1) and get_quote/get_quotes (step 3). The verb+resource+stage is specific and unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit guidance: call get_book first, prefer chapter over from/to, use get_quote/get_quotes for citations, and use the dataset API for corpus-scale text. This gives an agent clear decision rules for when to use this tool versus siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_locusFind a Canonical Reference (Bekker / Stephanus)A
Read-onlyIdempotent
Inspect

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 number that exists in both systems returns Aristotle and Plato leaves together; check the system field on each.

NameRequiredDescriptionDefault
workNoThe 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.
systemNoOptional: "bekker" or "stephanus". Inferred from the work when omitted; do not guess it from the number, since the two ranges overlap.
referenceYesThe canonical reference: "1094a8", "1094a", "1447", "328b". A leading system name is accepted ("Bekker 1094a"), as is a work name ("Rep. 328b").

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, destructiveHint=false, and idempotentHint=true, but the description adds substantial behavioral detail beyond that: it explains that witnesses are only returned when the reference is printed on the leaf, that nothing is interpolated, that empty results mean no anchored leaf exists (not that the citation is wrong), and that line numbers are not resolved. It also discloses edge cases like shared pages and bare-number ambiguity across systems. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Though lengthy, every sentence adds value. The description is front-loaded with the core purpose, then usage, return values, limitations, and edge cases in a logical flow. It avoids fluff and uses plain-language warnings (e.g., 'LIMITS, stated plainly'). The structure is coherent despite being a single block of text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description must explain return values, and it does: it describes the Greek reference edition, English translation, scan page, reader URL, and quote_api link. It also covers behaviors like editions_searched and other_works_at_this_reference. Given the tool's complexity (two citation systems, edge cases, follow-up calls), the description is complete enough for an agent to select and invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description enriches the parameters significantly. It explains why 'work' is required for Stephanus numbers (they restart per volume) and that omitting it yields candidate dialogues. For 'system', it warns not to guess it from the number since ranges overlap. For 'reference', it clarifies accepted formats and the ambiguity of bare numbers. This adds meaning well beyond the schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource: 'Turn a CANONICAL CITATION into the actual leaves that carry it.' It clearly distinguishes itself from page-based lookup tools and explicitly names the citation systems (Bekker/Stephanus). It also differentiates from get_quote by explaining the tool's output is leaves, not verbatim text.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit when-to-use guidance: 'USE THIS FIRST whenever a passage arrives as a canonical reference rather than a page' and warns against deriving the page manually. It also gives a clear follow-up action: 'Then call get_quote with the returned book_id + page.' It mentions exclusions (e.g., line numbers are not resolved) and how to avoid misinterpretation (read other_works_at_this_reference), satisfying the highest bar.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_quoteGet QuoteA
Read-onlyIdempotent
Inspect

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], [citation.locator]. [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-original book by construction. TRANSLATED EDITIONS: original means the text printed on this leaf, which on a translated edition is the TRANSLATOR's language, not the author's. When the response carries translation_note, the chain is stated there — attribute the wording to the translator and do not offer the passage as evidence of what the author wrote in their own tongue. Call list_editions to find an original-language witness of the same work. For several pages of one book at once, use get_quotes.

NameRequiredDescriptionDefault
langNoISO 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. A page with no translation can be quoted in its OWN language: pass that code (e.g. "de" on a German page; a no_translation answer names it as original_lang) and the transcription comes back as `original` with text_source: "ocr_original" and lang set to that code: the source's own words, never ours (#7458).
pageYesPage number
book_idYesThe book ID
contextNoAlso 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_imageNoAlso 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.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only establish the read-only/idempotent profile, and the description layers on substantial behavior: the citation_link headline, page-break continuity risk (~1 in 5 prose boundaries, hyphen splits), text_source branching including the OCR/long-s caveat for English originals, romanized being apparatus not transcription, and lang fallback with lang_note. It also warns about a concrete failure mode (quoting a fragment as a complete thought = misattribution).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It is long (~450 words) but front-loaded with the identifying clause and organized under clear headers (PAGE BREAKS, NON-LATIN SCRIPTS, ENGLISH ORIGINALS, TRANSLATED EDITIONS). Almost every line carries operative instruction; the mild cost is repetition of the text_source/lang rules already present in the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the description must carry the return contract — and it does: citation_link, citation.locator, continuity fields, text_source, translation/translation_note, romanized, and a concrete render template. It is complete enough for an agent to format a correct citation on the first call.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the parameter descriptions are already detailed (lang especially), so the baseline is 3. The description adds workflow meaning on top: context is tied to the continuity fields and 'about to quote near a page edge', and include_image is scoped to when the user should SEE the leaf. Some of the lang/text_source content duplicates the schema, keeping this below a 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get the exact verbatim text of a single page plus its citation apparatus') and frames it within a named pipeline step (READ step 3 — CITE). It explicitly distinguishes itself from the sibling get_quotes ('For several pages of one book at once, use get_quotes') and from list_editions, so an agent can route without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a hard trigger ('ALWAYS use before putting text in quotation marks') plus conditional branches: call again with context: true when continuity flags are true, use get_quotes for multi-page, call list_editions for an original-language witness. When-to-use, when-to-recurse, and alternatives are all explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_quotesGet Quotes (batch)A
Read-onlyIdempotent
Inspect

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).

NameRequiredDescriptionDefault
toNoEnd page (inclusive) of a range. Use with from.
fromNoStart page (inclusive) of a range. Use with to.
langNoISO 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.
pagesNoExplicit list of page numbers (e.g. [12, 40, 41]). Use this OR from/to.
book_idYesThe book ID
include_imageNoAlso 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.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

An annotation already provides readOnlyHint and idempotentHint, but the description goes well beyond that by disclosing romanized-layer behavior, text_source semantics, mixed-edition handling, daily page-budget impact, and include_image's first-5-pages inline behavior. These are non-obvious behaviors an agent needs to know before calling the tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence carries load: purpose, invocation modes, limits, return-entry fields, edge cases, and budget/API exclusions. It is front-loaded with the core purpose and uses concrete examples like [12, 40, 41] without padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description takes on the burden of explaining return behavior, and it does: citation_link, romanized layer, text_source, quote.lang, and page_image_url are all named. It also covers mixed batch composition, daily budget, and the boundary against the dataset API, so an agent has enough context to invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although schema coverage is 100%, the description adds essential semantics not in the schema: pages is an alternative to from/to rather than additive, the 25-page maximum, per-page language resolution requiring the agent to read quote.lang, and concrete include_image behavior with inline image blocks versus page_image_url. This meaningfully improves parameter understanding.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Get verbatim text + citation_link for SEVERAL pages of a single book in one round-trip.' It clearly identifies the batch nature of the tool, distinguishing it from the singular sibling get_quote, and places it in context as 'READ PIPELINE step 3 — CITE.'

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains when to use it: to assemble a multi-passage dossier from several pages, with explicit page/range specification and a 25-page cap. It also excludes corpus-scale extraction by directing that to the dataset API. However, it does not explicitly say 'use get_quote for a single quote,' leaving that particular alternative to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_booksList BooksA
Read-onlyIdempotent
Inspect

BROWSES/FILTERS THE CATALOG by metadata (canonical author via author_id, title/author/summary words via search, language, category, year range, translation recency) — no page-text 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). To answer "do you hold X?" call check_duplicate: a listing that misses a title is not evidence of absence.

NameRequiredDescriptionDefault
sortNo
limitNoMax results (default 100, max 200)
offsetNoPagination offset. When truncated is true, call again with next_offset; a full page is not the whole holding (default 0).
searchNoRelevance-ranked word match over title (original, display and English), author, original-script name forms (e.g. Greek), AND the book's AI summary. A hit can name your term in neither title nor author, only in what the book discusses. Diacritic-insensitive. For exactly one person's books use author_id instead.
work_idNoEvery 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_toNoLatest edition year (inclusive).
categoryNo
languageNo
author_idNoCanonical 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_fromNoEarliest edition year (inclusive). Matches only books with a known numeric year — ~60% of the library.
edition_keyNoOther 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_editionNoISO 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.

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive/openWorld=false, so the safety profile is covered. The description adds genuinely non-structured behavior: no page-text matching, the exact return fields (title, author string + author_id + author_url, language, year, translation progress), and the caveat that an empty listing is not proof of absence. It stops short of discussing result volume or rate behavior, so it is strong but not exhaustive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the verb and scope, then when-to-use, then return shape, then sibling routing, then the absence caveat — each sentence carries distinct information with no restatement of the name. The caps and arrow separators are loud but function as scan anchors rather than filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 12-parameter, all-optional read tool with no output schema, the description covers purpose, selection, return fields, and the main semantic pitfalls (metadata-only, partial year coverage handled in schema). Nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 75%, but the description compensates where the schema is thin — notably the undocumented sort enum, which it glosses as 'translation recency' alongside year range, and it names the filter axes (canonical author via author_id, search words, language, category). The schema itself already carries rich per-parameter guidance (work_id vs title search, has_edition vs language), so this is additive rather than duplicative.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('browses/filters the catalog by metadata') and immediately bounds the scope with 'no page-text matching', which separates it from the passage/topic search siblings. It enumerates the filter dimensions and the returned fields, so an agent knows exactly what class of operation this is without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to pick it ('to see WHAT EXISTS by an author or in a tradition, or to enumerate a date range') and routes three named alternatives with their selecting conditions: search_library for relevance-ranked topics, search_translations/search_concept for passages, check_duplicate for 'do you hold X?'. It even warns that a miss here is not evidence of absence — a usage trap an agent would otherwise fall into.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_editionsList Editions of a WorkA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault
book_idNoAny edition you already have. Its work is looked up and the siblings returned.
work_idNoA work identifier, if you already have one (from get_book).

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds valuable context beyond annotations: for multi-volume collected works, the identifier refers to the set rather than a single text, and the response explicitly notes when this applies.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with a definition, then moves to parameter guidance, use cases, output summary, and a caveat. Every sentence earns its place, covering both what the tool does and how to use it without redundancy or fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description compensates by listing the returned fields per edition (language, date, page count, translation coverage). It also covers the multi-volume caveat and provides specific use cases. This makes the description functionally complete for a complex list tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already provides full descriptions for both parameters (100% coverage), so the baseline is 3. The description adds practical guidance: book_id can be 'the id of any edition you already found' and work_id is obtainable from get_book. This enriches parameter meaning beyond the schema alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a precise definition: 'Every edition of one work that the library holds — the other witnesses to the same text, across languages and centuries.' This clearly states the tool's function and distinguishes it from siblings like get_book or search_translations by focusing on editions of a single work.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

An explicit 'USE THIS when' section lists three concrete scenarios (checking a quotation against multiple witnesses, retrieving original-language text behind a translation, comparing passages across editions). It also references get_book for obtaining a work_id, but it does not name alternative tools to use instead or state when not to use this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_image_facetsList Image FacetsA
Read-onlyIdempotent
Inspect

List the legal values of search_images' type, subject, figure and symbol filters, with how many images carry each. Those filters are EXACT string matches on tags an AI extractor wrote, and each vocabulary runs to thousands of strings (e.g. "musical notes", "Jesus Christ", "medicinal plants"), so a guessed value usually matches nothing. Look it up here first. Call with no facet for the top values of all four; with facet + contains to find the exact spelling of a term ("ouro" → "ouroboros"). Counts cover book illustrations of visible books only (the museum-artwork collection is not counted), and only strings on 3 or more images are listed; the list is refreshed weekly. If contains finds nothing, the tag is absent or rare: use it as free text in search_images' query instead. No URL in this result is a browse page; link images from search_images results.

NameRequiredDescriptionDefault
facetNoWhich filter's vocabulary. Omit for the top values of all four.
limitNoValues per facet (default 100 with a facet, 25 without; max 500).
containsNoCase-insensitive substring to look for, e.g. "dragon". Matches are ordered by image count.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish read-only/idempotent safety, and the description adds substantial context beyond them: counts cover only book illustrations (museum-artwork collection excluded), only tags on 3+ images are listed, refresh cadence is weekly, and no returned URL is a browse page. This is exactly the kind of operational detail annotations cannot carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads purpose, then usage, then caveats in a logical sequence. Dense but almost every clause carries decision-relevant information; the closing URL warning is slightly tangential but still operationally useful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers call patterns, match semantics, coverage limits, staleness, and the failure fallback. With no output schema, the note that results contain counts and non-browse URLs adequately frames the return shape.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% so baseline is 3, but the description still adds meaning: it explains the semantic effect of omitting facet (top values of all four) and gives a concrete contains example ('ouro' -> 'ouroboros'). It does not restate the limit semantics, which the schema fully covers.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States exactly what is listed (legal values of the type/subject/figure/symbol filters of search_images) and why (exact-match tags with huge vocabularies). An agent can immediately distinguish it from sibling search_images, which it explicitly references.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when-to-use ('Look it up here first'), how to call it in each mode (no facet = top values; facet + contains = spelling lookup), and a named fallback ('use it as free text in search_images' query instead') for the no-match case.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

propose_collectionPropose a CollectionAInspect

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.

NameRequiredDescriptionDefault
nameNo
emailNo
titleYesTitle of the proposed collection (2-200 chars)
book_idsYesOrdered list of book ids to include (1-200). Get ids from search_library / list_books / get_book.
rationaleYesWhy these books belong together and what connects them (max 5000 chars)
suggested_slugNoOptional URL slug suggestion, e.g. "renaissance-astronomy"

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses important behavior beyond annotations: 'it does NOT create a public collection instantly; a curator reviews and approves it.' This adds meaning to the non-readOnly/non-destructive flags by clarifying the asynchronous review workflow. Does not mention auth or rate limits, but the review behavior is a significant disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and front-loaded with the main purpose, then quickly covers usage and key behavior. Every sentence earns its place: purpose, id sourcing, review process, and when-to-use. No redundant or filler content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers purpose, usage triggers, id sourcing, and review behavior, which is sufficient for a proposal tool. It lacks details about what happens after approval and doesn't explain optional name/email parameters, but these are minor given the lack of an output schema and the overall clarity. The tool's complexity is moderate and the description addresses the key usage questions.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema covers 4 of 6 parameters (title, book_ids, rationale, suggested_slug), and the description reinforces required parameters and adds value by directing users to get book ids from search_library/list_books/get_book. However, the optional parameters 'name' and 'email' have no schema description and are not mentioned in the description, leaving a semantic gap. The description adds partial value but doesn't fully compensate for the uncovered parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Propose a themed collection of books to the Source Library team' with specific components (title, rationale, book ids). It distinguishes itself from sibling tools by explicitly comparing to submit_feedback and share_findings and noting it does not create a public collection instantly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit usage context: 'Use this when the user has identified a coherent set of books worth grouping and wants to contribute that curation back.' It also tells where to get book IDs (search_library / list_books / get_book) and notes the review process, giving clear guidance on when to apply. No explicit 'when not to use' exclusions, but the context is strong.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

propose_correctionPropose a CorrectionAInspect

During a review shift, propose a correction to a page's transcription (field "ocr") or English (field "translation"). A correction is a list of exact span edits: each "find" must be copied exactly from the text the shift returned and occur once on the page (add surrounding words if it repeats); "replace" is the corrected text ("" deletes). Fix only what the scan or the original shows is wrong: misread letters, dropped or added words, a sentence the English skips. Do not restyle or modernise. Propose transcription fixes before translation fixes, as separate calls. Pass base_hash = page.text_version for that field. A proposal does NOT change the page: it is applied only after a second reader agrees, and the volunteer is credited. If the call says the page changed since it was loaded, say so and move on. drafted_by: "assistant" if you found and worded it in a book run, "volunteer" if the user supplied the wording, "assistant_accepted" if you drafted it and the user approved it specifically, "mixed" otherwise.

NameRequiredDescriptionDefault
nameNoHow the user wants to be credited (optional)
noteNoAnything the second reader should know (optional)
editsYesSpan edits (1-30).
fieldYes"ocr" for the transcription, "translation" for the English
item_idYespage.item_id from the shift
shift_idNo
base_hashYestext_version.ocr or text_version.translation from the page
drafted_byYes
volunteer_codeYes
assistant_modelYesYour own model name and version, copied exactly as your instructions or system prompt give it, and whether extended thinking is on. Write "unknown" rather than guess; a wrong name is worse than none.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations say readOnlyHint=false and destructiveHint=false, which is a slightly unusual gap, and the description resolves it by explaining that a proposal does not change the page and is applied only after a second reader agrees. It also adds the consequences (volunteer credited, stale base_hash rejection) and the field-sequencing rule, all of which go well beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded and mostly efficient, but the final drafted_by sentence is a dense run-on listing four enum values. It earns its keep but is the least scannable part and could be split. Otherwise every sentence carries operational weight.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description must cover intent, sequencing, edit format, and failure handling, and it does all of those for a 10-parameter tool. An agent has what it needs to decide whether and how to call this rather than a sibling.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 70%, so the schema already carries a fair amount. The description adds real value by defining the span-edit contract: find must be copied exactly, must occur once on the page, replacements may be empty to delete, and base_hash must be page.text_version for the chosen field. It also disambiguates the drafted_by enum values, which the schema leaves as bare strings.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific verb (propose a correction) and resource (page transcription or English), then immediately defines what a correction is operationally: a list of exact span edits. This distinguishes it clearly from siblings like submit_page_review, since the description explains that a proposal does not change the page until a second reader agrees.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly scopes use to a review shift, states the order of operations (propose transcription fixes before translation fixes, as separate calls), and defines when not to act ('Do not restyle or modernise'). It also gives the failure-handling path: if the page changed since load, say so and move on.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_conceptSearch by ConceptA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault
langNoISO 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.
limitNoMax passages (default 15, max 50)
queryYesA 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.
authorNoKeep only passages by these authors, e.g. ["Ficino"] or ["della Porta", "Agrippa"]. Matches by name: every word you give must start a word of the book's author field.
year_toNoRestrict to books published in or before this year.
languageNoFilter by a single original language
diversityNoHow the passages are spread. Default "tradition": each ten holds at most 2 passages per tradition family and per work, so a concept query returns several traditions and not one tradition's nearest pages (a clearly closer match is never passed over). "author": at most one per author and per work, for a cross-author survey. "off": plain nearest-first; use it when looking for one known passage. A quoted query or one naming a year defaults to "off". Each passage carries its book's `tradition` when it has one.
languagesNoFilter to any of these languages, e.g. ["Sanskrit", "Arabic", "Chinese"]. Use instead of language when targeting multiple traditions.
year_fromNoRestrict to books published in or after this year (filters out modern editions and translations).
max_per_bookNoCap on passages from any single book. Useful when one book dominates the conceptual neighborhood; for one passage per author or per work use max_per_author / max_per_work.
max_per_workNoHard cap on passages from one WORK (all printings and editions of it count together, via work_id), so seven printings of De occulta philosophia are one witness, not seven.
max_per_authorNoHard cap on passages from one author; the rest are DROPPED (unlike diversity, which only re-orders). Set 1 for "N quotes from N different authors".
exclude_authorsNoDrop passages by these authors, e.g. ["Agrippa"]. Use it to iterate a survey: run, see who dominates, exclude, run again.
exclude_languagesNoExclude these languages, e.g. ["Latin", "French", "German", "English"] to surface non-Western sources.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnly/idempotent/non-destructive), but the description adds substantial extra context: similarity score calibration bands, the rule that only 'translation' snippets may be quoted and never 'summary', the diversification behavior for max_per_book, and a cost warning. This is well beyond what the annotations convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the return shape and the 'PICK THIS when' trigger before any calibration detail, and the arrow-delimited segments make it scannable. It is nonetheless dense and long, with overlapping guidance (diversity vs max_per_book vs max_per_author) that could be trimmed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 14-parameter semantic search with no output schema, the description covers result nature, quote-eligibility of snippets, score interpretation, cost tradeoffs and cross-tradition query strategy. An agent has everything needed to call it correctly and read the results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and each of the 14 parameters is already documented in the schema with examples and edge cases (language vs languages, max_per_author dropping vs diversity re-ordering). The description's parameter notes ('Set max_per_book to diversify') largely restate the schema, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource+mechanism: 'RETURNS QUOTABLE PASSAGES matched by MEANING (cosine similarity on Gemini embeddings, 768d)'. It explicitly distinguishes itself from search_translations (exact words), search_library (book-level listing) and get_book, so an agent can route without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

States exactly when to pick this tool ('when the modern term won't literally appear in historical texts') with concrete examples, and names three alternatives with the conditions that select them. Also gives a cost-based exclusion ('reserve it for cross-corpus discovery').

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_imagesSearch ImagesA
Read-onlyIdempotent
Inspect

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 (exact tag strings; look them up with list_image_facets) 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).

NameRequiredDescriptionDefault
typeNoImage type (woodcut, engraving, emblem, diagram). Best-effort: the medium metadata on museum artworks is unnormalized, so treat results as ranked rather than strictly filtered.
limitNoMax results (default 20, max 50)
queryNoText search (e.g., "ouroboros", "tree of life")
figureNoEXACT, case-sensitive match on a figure tag ("Jesus Christ", "putti"). Look it up with list_image_facets.
offsetNoSkip 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).
symbolNoEXACT, case-sensitive match on a symbol tag ("ouroboros", "triangle"). Look it up with list_image_facets.
book_idNoOnly return images extracted from this book's pages. Excludes the museum-artwork collection (artworks do not belong to books).
subjectNoEXACT, case-sensitive match on an extracted subject tag ("alchemy", "medicinal plants"); a near-miss matches nothing. Look the string up with list_image_facets first, or put loose words in query instead.
year_toNoSee year_from — same reliability caution applies.
year_fromNoCAUTION: reliable only for book illustrations (source_type "book_illustration"). On museum-artwork records the year field is dirty — some works carry the date a photograph or upload was made (e.g. 2005) rather than the date of the work — so never draw a chronological conclusion from a year-filtered artwork result (#4288 tracks the cleanup). Undated artworks are excluded from any year-filtered search, not passed through.
include_thumbnail_base64NoEmbed 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.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnly/idempotent annotations, the description discloses rendering behavior on MCP Apps vs other clients, the inline-image return for the first few results, the meaning of an empty result under book_id (note field), the offset pagination contract, and the title_is_descriptive caveat with citation guidance. This is rich operational context annotations cannot convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with what the tool returns and how results are structured, and every later sentence carries usage-critical guidance. It is a single dense block and repeats some schema content, which keeps it from a 5, but there is little true filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 11-parameter, no-output-schema, open-ended search tool, the description covers result structure, pagination, filtering strategy, empty-result interpretation, client rendering differences, and citation rules. Nothing an agent needs in order to search and report correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the schema already documents offset, year_from caution, and exact-match tags, so much of the description repeats it. The description still adds meaning the schema does not: the interleaved two-lane result structure, the empty-result note semantics, and why include_thumbnail_base64 should not be requested from chat. Above the baseline 3, but not fully additive over the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence states a specific verb (Search) plus two quantified resources (200,000+ historical illustrations and 24,000+ artworks) with a breakdown of media types. It also distinguishes itself from siblings by naming list_image_facets as the companion lookup tool and clarifying that results interleave book-illustration and museum-artwork collections.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit routing is provided: narrow with type/subject/symbol or page with offset instead of raising limit; look up exact tag strings with list_image_facets; use book_id to restrict to extracted book images. It also states the when-not condition (offsets > 0 return only the gallery lane; book_id excludes artworks).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_librarySearch LibraryA
Read-onlyIdempotent
Inspect

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. To answer "do you hold X?" call check_duplicate, not this: a ranked list is not a holdings check.

NameRequiredDescriptionDefault
sortNo
limitNoMax results per page (default 10, max 100)
queryYesSearch query — prefer single distinctive concepts ("alchemy", "tree of life") over long natural-language phrases. Wrap in "double quotes" for exact phrase.
offsetNoPagination offset (use with limit to page through total_matches; default 0)
year_toNoPublication year range end
languageNoFilter by original language (e.g., Latin, German, Greek)
year_fromNoPublication year range start
has_translationNoOnly return books with translations

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), and the description adds genuinely new behavioral detail: what fields are searched (titles, authors, subjects, secondarily translated text) and the shape of results (total_matches, returned, offset for pagination). It also warns that results are ranked rather than exhaustive holdings, which prevents a real misuse pattern.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The most important fact — books, not passages — is front-loaded and capitalized, and the remaining sentences each carry a distinct routing rule or query tip. It is dense with arrows and parentheticals, but nothing is filler; the density is the only cost.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a filtered search tool with no output schema and 8 parameters, the description supplies the missing return-value contract (total_matches, returned, offset) and explicit sibling routing. An agent has everything needed to call it and interpret the response correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 88%, so parameters are already well documented; the description reinforces query syntax with concrete examples ('memory palace', 'ouroboros') and explains quoting for exact phrases. It also clarifies the offset/limit relationship to total_matches in the results, which the schema alone does not connect. Sort, year range, language, and has_translation filters are left to the schema, which is acceptable at this coverage level.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('RETURNS A LIST OF BOOKS (works on a topic) — NOT passages') and immediately contrasts with the passage-level siblings. An agent can distinguish this from search_translations, search_concept, and get_book without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit routing rules: use search_translations for quotable exact words, search_concept for meaning, get_book when an author/work is already named, list_books to find IDs, and check_duplicate for holdings questions. It also states the negative case ('a ranked list is not a holdings check'), leaving nothing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_translationsSearch TranslationsA
Read-onlyIdempotent
Inspect

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: a distinctive term ("wax tablet") or the sentence you are looking for both work; matching is by word, and a page that prints your words together and in order ranks above one that scatters them. Each passage carries phrase_match (0-1, absolute, not relative to the other results): 1 means the page prints your whole query in order at one place, 0 means your words occur only apart; when every passage is under about 0.2 the library probably does not print that sentence, so try search_concept. It is absent for a one-word query and for a passage found by meaning alone. found_by says which lane found the page: "keyword", "semantic", or "both" (the strongest signal). 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.

NameRequiredDescriptionDefault
langNoISO 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.
limitNoMax results per page (default 20, max 50)
queryYesA distinctive term ("harmony of the spheres", "active intellect") or the sentence you are looking for. A multi-word query matches pages printing ANY of its words, ranked so that pages printing them together come first (see phrase_match); wrap in "double quotes" to require the exact phrase.
authorNoKeep only passages by these authors, e.g. ["Ficino"] or ["della Porta", "Agrippa"]. Matches by name: every word you give must start a word of the book's author field.
offsetNoPagination offset (use with limit to page through total_matches; default 0)
book_idNoSearch within a specific book
year_toNo
languageNoFilter by a single original language
diversityNoRe-order the passages for spread. "author": at most one passage per author and per work in each ten, for a cross-author survey. "tradition": at most 2 per tradition family and per work. Default "off": passages come in relevance order. Nothing is dropped; later pages hold the rest.
languagesNoFilter to any of these languages, e.g. ["Sanskrit", "Arabic", "Chinese"]. Use instead of language when targeting multiple traditions.
year_fromNo
max_per_workNoHard cap on passages from one WORK (all printings and editions of it count together, via work_id), so seven printings of De occulta philosophia are one witness, not seven.
max_per_authorNoHard cap on passages from one author; the rest are DROPPED (unlike diversity, which only re-orders). Set 1 for "N quotes from N different authors".
exclude_authorsNoDrop passages by these authors, e.g. ["Agrippa"]. Use it to iterate a survey: run, see who dominates, exclude, run again.
exclude_languagesNoExclude these languages, e.g. ["Latin", "French", "German", "English"] to surface non-Western sources.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnly, idempotent, non-destructive), and the description adds substantial behavioral context beyond them: phrase_match is an absolute 0-1 score (not relative), its absence for one-word/meaning-only hits, the found_by lanes, snippet_type distinguishing verbatim translation/ocr from AI-generated summary, and pagination fields. This is genuine added value.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The text is long, but the complexity (15 params, no output schema) justifies most of it and it is front-loaded with the routing decision in caps and arrows. Some material (phrase_match, found_by, snippet_type) bleeds into return-value explanation that could be trimmed, so not a clean 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, 15 parameters and a complex corpus, the description compensates by describing return fields (phrase_match, found_by, snippet_type, total_matches, returned, offset), pagination, and the cross-cultural query strategy. Nothing an agent needs to select or invoke correctly appears missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 87%, so the schema carries most parameter documentation (diversity, max_per_work, max_per_author, exclude_authors, lang, etc.), which sets the baseline at 3. The description adds real meaning for query construction, notably the cross-cultural tip to search tradition-internal vocabulary (e.g. "jing"/"bindu" rather than "semen retention") for pre-modern topics, pushing it slightly above baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource (returns quotable page-level passages with citation URLs) matched by keyword/term, and explicitly names itself as the pick for finding quotes/evidence across the library. It repeatedly distinguishes itself from search_concept, search_library, search_within_book and get_book, so an agent can route without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use and when-not with named alternatives: use search_concept when the modern word won't literally appear, search_library to list books, search_within_book for one known book, get_book first if the user named an author/work. It also supplies query-construction guidance and a cross-cultural search tip, leaving little to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_within_bookSearch Within BookA
Read-onlyIdempotent
Inspect

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. Results are ordered by relevance within this book. Each carries score (0-1, ABSOLUTE, not relative to the other results, so a query the book cannot answer scores low everywhere): the higher of similarity (raw cosine from the meaning pass, calibrated like search_concept: 0.70+ strong, 0.55–0.70 verify, below 0.55 drift) and phrase_match (how much of a multi-word query the page prints in order at one place; 1 is all of it; a one-word query the page prints scores 1). Each also carries 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.

NameRequiredDescriptionDefault
langNoISO 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.
queryYesSearch query
offsetNoPagination offset. Each call returns up to 50 pages; when truncated is true, call again with next_offset (default 0).
book_idYesThe book ID to search within

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only say read-only/idempotent; the description adds substantive behavior beyond them — hybrid keyword plus top-~10 semantic retrieval interleaved by relevance, absolute score calibration thresholds (0.70/0.55), found_by semantics, and front-matter results ordered last. This is exactly the kind of non-obvious retrieval behavior an agent cannot get from annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core verb and the divergence to search_concept, and every sentence carries usable information. It is long and caps-heavy, bordering on dense, but no sentence is filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description compensates by explaining returned fields (score with calibration bands, phrase_match, found_by, is_front_matter), ordering rules, and that results carry page numbers and snippets ready to cite. An agent can interpret results without further documentation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3; the description still adds value by stressing that book_id is mandatory and that results are ordered by relevance within that book. It does not extend the lang or offset semantics beyond what the schema already documents.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource with scope: searches inside ONE book, requires book_id, and explicitly characterizes it as primarily lexical with a narrow scoped-semantic pass. It differentiates itself from search_concept and search_library by name and function.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit positive triggers ('know the wording', 'every page of one book mentioning a term'), explicit negative trigger ('searching from a paraphrase… USE search_concept INSTEAD'), and a prerequisite path (find the book via search_library or search_concept first).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

share_findingsShare FindingsAInspect

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).

NameRequiredDescriptionDefault
nameNo
emailNo
titleYesTitle of the dossier / thesis (2-300 chars)
summaryNoOptional prose summarizing the argument (max 5000 chars)
citationsYesOrdered list of supporting passages (1-50). Get book_id + page from get_quote / search_translations.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description reveals key behavioral details beyond the annotations: citations are references, not copied text, and the library re-renders canonical quotes to maintain authority. It also discloses that the submission goes to the team for review, which is important for setting expectations. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences long but information-dense, with every sentence contributing to understanding the tool's purpose, citation semantics, and review process. It is front-loaded with the main action, making it easy to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's moderate complexity and lack of an output schema, the description covers the essential behavior, key content structure, and the review outcome. However, it does not mention the optional name/email fields, which may be relevant for user identity, and leaves some ambiguity about what happens after submission beyond the review step.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 60% (3 of 5 params described). The description adds valuable context for the citations parameter (structure, reference-based, ordered list) and mentions the source for book_id/page, but it does not address the name and email parameters, which lack schema descriptions and are absent from the tool description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool shares a research dossier to the Source Library team, specifying the main components (title, optional summary, citations). It distinguishes the tool from sibling submit_feedback by describing it as a dossier-sharing action, not general feedback.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit 'Use this when' clause defines the exact scenario: when the user has assembled a thesis backed by passages across one or more books and wants to contribute it back. It also references submit_feedback as a similar mechanism and notes that submissions go to team review, not instant public pages.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

start_blind_checkStart a Blind Check (for readers of the language)A
Read-only
Inspect

OPTIONAL lane, only for a user who reads the original language and asks to judge pages themselves: up to five random pages from different books, each with scan, transcription and English. Here the USER is the reviewer: ask for THEIR verdict first, before any opinion of yours, then give your reading with exact quotes, let them accept or reject each point, and call submit_page_review with mode "blind" and their final verdict. Never choose the verdict for them. For everyone else use start_review_shift.

NameRequiredDescriptionDefault
pagesNoHow many pages (1-5, default 5).
languageNoOriginal language the user reads, e.g. "Latin".
volunteer_codeNo

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/destructive hints, but the description adds the interaction protocol that structured fields cannot convey: the USER is the reviewer, their verdict must be requested first, and the agent must never choose the verdict. It does not describe what the tool call itself returns as a handle/session object, which keeps it short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the gating condition ("OPTIONAL lane, only for...") before the workflow detail, and every clause carries operational weight. It is a dense run-on, but no sentence is discardable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, and the description compensates by stating what each page contains (scan, transcription, English) and the multi-turn flow through submit_page_review. It stops short of describing the immediate return payload or session handling, but nothing critical to correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 67%, so the schema already documents pages (1-5, default 5) and language. The description still adds meaning beyond it: pages are random and drawn from different books, and language determines which pages qualify. volunteer_code remains undocumented in both places.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource (start a blind check) and immediately defines the scope: up to five random pages from different books, each with scan, transcription and English. It also names the sibling it replaces for other users (start_review_shift), so the agent can distinguish the two without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when-to-use (only for a user who reads the original language and asks to judge pages themselves) and explicit when-not ("For everyone else use start_review_shift"). It also routes the follow-up call to submit_page_review with mode "blind".

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

start_review_shiftStart a Review ShiftA
Read-only
Inspect

Start a volunteer REVIEW SHIFT: the user lends their Claude (you) to Source Library to check one book, page by page, against its scans. Use when the user wants to help Source Library, says "start a shift" or "review pages", or asks how they can contribute. The user does NOT need to read the book's language: YOU do the checking (scan against transcription, transcription against English) and the user starts the shift, chooses how many pages, watches and asks questions. Returns ONE page: its scan (inline image), our transcription, our English, the last lines of the previous page, and next (pass to continue_review_shift). Follow first_time once, then how_to_run on every page, working through the stretch of pages without stopping between them. With no book, it resumes the user's last run (pass volunteer_code) or picks a book that needs checking; book takes an id, slug or reader URL if the user names one; new_book true skips the resume. Run shifts only while the user is in this conversation; never set one up to run on a schedule or from a script.

NameRequiredDescriptionDefault
bookNoA book the user wants to check: id, slug or sourcelibrary.org reader URL (optional).
languageNoPrefer books in this original language, e.g. "Latin" (optional; any language works, the user need not read it).
new_bookNoTrue to start a different book instead of resuming the last one.
volunteer_codeNoThe code from the user's earlier shift, if they have one. Omit on a first shift; one is issued.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover the safety profile (readOnlyHint=true, destructiveHint=false, openWorldHint=false), and the description adds context the annotations cannot: the exact return payload (inline scan image, transcription, English, previous-page tail, next handoff), the session-only constraint, and the resume-vs-fresh behavior via volunteer_code or new_book. It stops short of stating error/failure behavior or what happens if the conversation ends mid-shift, so not a full 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in the first clause, and the remaining sentences are dense but each carries load-bearing information (return shape, handoff protocol, resume logic, session restriction). It is long for a single paragraph and blends orchestration instructions into the description, which is a mild structure cost, but there is little dead text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Absent an output schema, the description compensates by describing exactly what one call returns and how it chains to continue_review_shift. All four optional parameters and the zero-required-param invocation are addressed. It is nearly complete for a complex orchestration tool; only failure modes and shift termination are unaddressed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline 3 applies, but the description adds inter-parameter semantics the schema lacks: no book means resume the last run or auto-pick a book needing checking, new_book skips the resume, and volunteer_code is only omitted on a first shift. book's accepted formats (id, slug, reader URL) are echoed from the schema, which is the only redundant sentence.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Start a volunteer REVIEW SHIFT') and immediately explains the mechanism: the user lends their Claude to check one book, page by page, against its scans. It explicitly separates itself from continue_review_shift ('next (pass to continue_review_shift)'), so an agent can distinguish it from its closest sibling without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit triggers ('wants to help Source Library', 'start a shift', 'review pages', 'asks how they can contribute') and explicit exclusions ('Run shifts only while the user is in this conversation; never set one up to run on a schedule or from a script'). It also routes the follow-up work to the sibling tool, so the when-to-use / when-to-hand-off boundary is fully drawn.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

submit_feedbackSubmit FeedbackAInspect

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.

NameRequiredDescriptionDefault
nameNo
emailNo
messageYesYour 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.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate this is a write operation (readOnlyHint=false) but are otherwise minimal. The description adds meaningful behavioral context beyond the annotations: submissions are reviewed by humans, past duplicate proposals waste reviewer time, and specific report formats are more actionable. This helps the agent understand the real-world impact and expectations of the submission.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and front-loaded with the core purpose, followed by actionable guidance. Each sentence contributes useful information, though the list of past duplicate proposals (IIIF manifests, Content Search, DTS) is slightly detailed. Overall, it is efficient without being overly verbose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple feedback submission tool with three parameters and no output schema, the description provides sufficient context for an agent to invoke it correctly. It explains the submission target, reviewer expectations, and how to maximize usefulness. The only minor gap is the absence of explicit clarification that name and email are optional, but the schema already encodes that.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 33%, so the description carries some responsibility for parameter meaning. It enriches the message parameter by specifying what content reviewers find valuable, such as noting which docs were checked and including record IDs/reproducing queries. However, it does not clarify the optional name and email parameters, which remain undocumented in both the schema and description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool submits feedback, bug reports, or feature requests to the Source Library team, using a specific verb and resource. It is distinct from sibling tools like search_library or propose_collection, so an agent can immediately identify its purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context for when to use the tool: for feedback, bugs, and feature requests. It also provides concrete usage guidance—read the referenced docs before proposing new functionality, state which docs were checked, and prefer actionable bug reports with record IDs and reproducing queries. It does not explicitly contrast with sibling tools, but the context is strong.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

submit_page_reviewSubmit a Page ReviewAInspect

Record the verdict on one page of a shift. mode "book-run" (start_review_shift / continue_review_shift): the verdict and findings are YOURS, from reading the scan and both texts; set user_looked true if the user checked anything on the page themselves. mode "blind" (start_blind_check): the verdict is the USER'S, given before your reading; put yours in assistant_verdict. Verdicts: both_sound (transcription matches the scan and the English matches the original), translation_drift (transcription right, English departs from it), transcription_off (the text does not match the scan), both_off, unclear (the scan or the text cannot be judged). Quote exact words in every finding. A review is evidence about the page; it does not change it.

NameRequiredDescriptionDefault
modeNo"book-run" unless the page came from start_blind_check.
nameNoHow the user wants to be credited (optional).
noteNoAnything a later reader should know (optional, max 2000 chars).
book_idNorun.book_id (book run)
item_idYespage.item_id (book run) or the item's item_id (blind check)
verdictYesbook-run: your verdict. blind: the user's final verdict.
shift_idNoshift_id (blind check only)
page_numberNopage.page_number (book run)
user_lookedNobook-run: true if the user checked something on this page themselves.
text_versionNopage.text_version, passed back unchanged.
first_verdictNoblind: the user's verdict before your reading, if it changed.
volunteer_codeYes
assistant_modelYesYour own model name and version, copied exactly as your instructions or system prompt give it, and whether extended thinking is on. Write "unknown" rather than guess; a wrong name is worse than none.
reader_languagesNoLanguages the user says they read, if they said.
assistant_verdictNoYour own verdict (blind mode; in book-run it equals verdict).
assistant_findingsNoProblems found, each with an exact quote (max 12).
verdict_before_assistantNoblind: true if the user committed to a verdict before seeing your reading.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare write semantics (readOnlyHint=false, idempotentHint=false, destructiveHint=false), so the safety profile is covered. The description adds meaningful semantics beyond that: a review is an evidence record that "does not change" the page, and findings must quote exact words. It does not describe what happens on duplicate submits or failure modes, so it stops short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single dense paragraph that front-loads the core action before branching into mode-specific rules and verdict vocabulary. It is efficient, though the run-on mode/verdict enumeration would be easier to scan if split into labeled lines.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 17-parameter tool with nested findings objects and no output schema, the description covers the mode-dependent branching, verdict taxonomy, and quoting requirement well. It omits error/retry behavior and duplicate-submission handling (relevant given idempotentHint=false), which keeps it just shy of complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 94%, so the baseline is 3, but the description adds cross-field meaning that the schema documents in isolation: the relationship between verdict, first_verdict, assistant_verdict, and verdict_before_assistant under each mode, plus the requirement that findings quote source words. This is genuine added value over per-field descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Record the verdict on one page of a shift") and immediately differentiates the two operating modes by naming the sibling tools that produce each (start_review_shift/continue_review_shift vs start_blind_check). An agent can distinguish this from share_findings and propose_correction without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly ties each mode to its originating sibling tool and specifies whose verdict applies in each case ("mode 'book-run'... the verdict and findings are YOURS" vs "mode 'blind'... the verdict is the USER'S"). It also states the precondition for user_looked and where the assistant's own verdict goes when it differs.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 2 tool updates
    • Changedlist_books1 field changed
      • addedInput schema / properties / offset
        Added value: +{
        +  "description": "Pagination offset. When truncated is true, call again with next_offset; a full page is not the whole holding (default 0).",
        +  "type": "number"
        +}
    • Changedsearch_within_book1 field changed
      • addedInput schema / properties / offset
        Added value: +{
        +  "description": "Pagination offset. Each call returns up to 50 pages; when truncated is true, call again with next_offset (default 0).",
        +  "type": "number"
        +}
  2. 1 tool update
    • Changedget_quote1 field changed
      • changedInput schema / properties / lang / description
        Previous value: -"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."New value: +"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. A page with no translation can be quoted in its OWN language: pass that code (e.g. \"de\" on a German page; a no_translation answer names it as original_lang) and the transcription comes back as `original` with text_source: \"ocr_original\" and lang set to that code: the source's own words, never ours (#7458)."
  3. 1 tool update
    • Changedsearch_images1 field changed
      • changedInput schema / properties / year_from / description
        Previous value: -"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)."New value: +"CAUTION: reliable only for book illustrations (source_type \"book_illustration\"). On museum-artwork records the year field is dirty — some works carry the date a photograph or upload was made (e.g. 2005) rather than the date of the work — so never draw a chronological conclusion from a year-filtered artwork result (#4288 tracks the cleanup). Undated artworks are excluded from any year-filtered search, not passed through."
  4. 11 tool updates
    • Addedcheck_duplicate
    • Addedcontinue_review_shift
    • Changedlist_books1 field changed
      • changedInput schema / properties / search / description
        Previous value: -"Free-text filter matching title or author (relevance-ranked, may include title matches). For exactly one person's books use author_id instead."New value: +"Relevance-ranked word match over title (original, display and English), author, original-script name forms (e.g. Greek), AND the book's AI summary. A hit can name your term in neither title nor author, only in what the book discusses. Diacritic-insensitive. For exactly one person's books use author_id instead."
    • Addedlist_image_facets
    • Changedpropose_correction6 fields changed
      • changedInput schema / properties / assistant_model / description
        Previous value: -"Your model name, if known"New value: +"Your own model name and version, copied exactly as your instructions or system prompt give it, and whether extended thinking is on. Write \"unknown\" rather than guess; a wrong name is worse than none."
      • changedInput schema / properties / base_hash / description
        Previous value: -"text_version.ocr or text_version.translation from the item"New value: +"text_version.ocr or text_version.translation from the page"
      • changedInput schema / properties / drafted_by / enum
        Previous value: -[
        -  "volunteer",
        -  "assistant_accepted",
        -  "mixed"
        -]New value: +[
        +  "assistant",
        +  "volunteer",
        +  "assistant_accepted",
        +  "mixed"
        +]
      • changedInput schema / properties / item_id / description
        Previous value: -"item_id from start_review_shift"New value: +"page.item_id from the shift"
      • removedInput schema / properties / volunteer_code / description
        Removed value: -"volunteer_code from start_review_shift"
      • changedInput schema / required
        Previous value: -[
        -  "item_id",
        -  "field",
        -  "base_hash",
        -  "edits",
        -  "volunteer_code",
        -  "drafted_by"
        -]New value: +[
        +  "item_id",
        +  "field",
        +  "base_hash",
        +  "edits",
        +  "volunteer_code",
        +  "drafted_by",
        +  "assistant_model"
        +]
    • Changedsearch_concept5 fields changed
      • addedInput schema / properties / author
        Added value: +{
        +  "description": "Keep only passages by these authors, e.g. [\"Ficino\"] or [\"della Porta\", \"Agrippa\"]. Matches by name: every word you give must start a word of the book's author field.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedInput schema / properties / exclude_authors
        Added value: +{
        +  "description": "Drop passages by these authors, e.g. [\"Agrippa\"]. Use it to iterate a survey: run, see who dominates, exclude, run again.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedInput schema / properties / max_per_author
        Added value: +{
        +  "description": "Hard cap on passages from one author; the rest are DROPPED (unlike diversity, which only re-orders). Set 1 for \"N quotes from N different authors\".",
        +  "type": "number"
        +}
      • changedInput schema / properties / max_per_book / description
        Previous value: -"Cap on passages from any single book. Useful when one book dominates the conceptual neighborhood; set to 1–2 for diverse author/work coverage."New value: +"Cap on passages from any single book. Useful when one book dominates the conceptual neighborhood; for one passage per author or per work use max_per_author / max_per_work."
      • addedInput schema / properties / max_per_work
        Added value: +{
        +  "description": "Hard cap on passages from one WORK (all printings and editions of it count together, via work_id), so seven printings of De occulta philosophia are one witness, not seven.",
        +  "type": "number"
        +}
    • Changedsearch_images3 fields changed
      • addedInput schema / properties / figure / description
        Added value: +"EXACT, case-sensitive match on a figure tag (\"Jesus Christ\", \"putti\"). Look it up with list_image_facets."
      • addedInput schema / properties / subject / description
        Added value: +"EXACT, case-sensitive match on an extracted subject tag (\"alchemy\", \"medicinal plants\"); a near-miss matches nothing. Look the string up with list_image_facets first, or put loose words in query instead."
      • addedInput schema / properties / symbol / description
        Added value: +"EXACT, case-sensitive match on a symbol tag (\"ouroboros\", \"triangle\"). Look it up with list_image_facets."
    • Changedsearch_translations6 fields changed
      • addedInput schema / properties / author
        Added value: +{
        +  "description": "Keep only passages by these authors, e.g. [\"Ficino\"] or [\"della Porta\", \"Agrippa\"]. Matches by name: every word you give must start a word of the book's author field.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • changedInput schema / properties / diversity / description
        Previous value: -"Re-order the passages for spread. \"author\": at most one passage per author and per work in each ten, for a cross-author survey. \"tradition\": at most 2 per tradition family and per work. Default \"off\": keyword results come in match order. Nothing is dropped; later pages hold the rest."New value: +"Re-order the passages for spread. \"author\": at most one passage per author and per work in each ten, for a cross-author survey. \"tradition\": at most 2 per tradition family and per work. Default \"off\": passages come in relevance order. Nothing is dropped; later pages hold the rest."
      • addedInput schema / properties / exclude_authors
        Added value: +{
        +  "description": "Drop passages by these authors, e.g. [\"Agrippa\"]. Use it to iterate a survey: run, see who dominates, exclude, run again.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedInput schema / properties / max_per_author
        Added value: +{
        +  "description": "Hard cap on passages from one author; the rest are DROPPED (unlike diversity, which only re-orders). Set 1 for \"N quotes from N different authors\".",
        +  "type": "number"
        +}
      • addedInput schema / properties / max_per_work
        Added value: +{
        +  "description": "Hard cap on passages from one WORK (all printings and editions of it count together, via work_id), so seven printings of De occulta philosophia are one witness, not seven.",
        +  "type": "number"
        +}
      • changedInput schema / properties / query / description
        Previous value: -"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."New value: +"A distinctive term (\"harmony of the spheres\", \"active intellect\") or the sentence you are looking for. A multi-word query matches pages printing ANY of its words, ranked so that pages printing them together come first (see phrase_match); wrap in \"double quotes\" to require the exact phrase."
    • Addedstart_blind_check
    • Changedstart_review_shift4 fields changed
      • addedInput schema / properties / book
        Added value: +{
        +  "description": "A book the user wants to check: id, slug or sourcelibrary.org reader URL (optional).",
        +  "type": "string"
        +}
      • changedInput schema / properties / language / description
        Previous value: -"Original language the user reads, e.g. \"Latin\", \"Greek\", \"Arabic\", \"German\", \"Chinese\", \"Tibetan\". Omit to accept any language, but ask the user first which languages they read."New value: +"Prefer books in this original language, e.g. \"Latin\" (optional; any language works, the user need not read it)."
      • addedInput schema / properties / new_book
        Added value: +{
        +  "description": "True to start a different book instead of resuming the last one.",
        +  "type": "boolean"
        +}
      • removedInput schema / properties / pages
        Removed value: -{
        -  "description": "How many pages (1-5, default 5).",
        -  "type": "number"
        -}
    • Changedsubmit_page_review19 fields changed
      • changedInput schema / properties / assistant_findings / description
        Previous value: -"Problems you pointed out, each with the user's response (max 12)."New value: +"Problems found, each with an exact quote (max 12)."
      • changedInput schema / properties / assistant_findings / items / properties / problem / description
        Previous value: -"What is wrong (max 500 chars)"New value: +"What is wrong, and what the scan or original shows (max 500 chars)"
      • addedInput schema / properties / assistant_findings / items / properties / user_agreed / description
        Added value: +"Only if the user actually weighed in on this point"
      • changedInput schema / properties / assistant_model / description
        Previous value: -"Your model name, if known (for analysis only)."New value: +"Your own model name and version, copied exactly as your instructions or system prompt give it, and whether extended thinking is on. Write \"unknown\" rather than guess; a wrong name is worse than none."
      • changedInput schema / properties / assistant_verdict / description
        Previous value: -"Your own verdict on the page."New value: +"Your own verdict (blind mode; in book-run it equals verdict)."
      • addedInput schema / properties / book_id
        Added value: +{
        +  "description": "run.book_id (book run)",
        +  "type": "string"
        +}
      • changedInput schema / properties / first_verdict / description
        Previous value: -"The verdict the user gave before your reading, if it differs from the final one."New value: +"blind: the user's verdict before your reading, if it changed."
      • changedInput schema / properties / item_id / description
        Previous value: -"item_id from start_review_shift"New value: +"page.item_id (book run) or the item's item_id (blind check)"
      • addedInput schema / properties / mode
        Added value: +{
        +  "description": "\"book-run\" unless the page came from start_blind_check.",
        +  "enum": [
        +    "book-run",
        +    "blind"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / note / description
        Previous value: -"The user's own words on what is wrong or uncertain (optional, max 2000 chars)."New value: +"Anything a later reader should know (optional, max 2000 chars)."
      • addedInput schema / properties / page_number
        Added value: +{
        +  "description": "page.page_number (book run)",
        +  "type": "number"
        +}
      • changedInput schema / properties / reader_languages / description
        Previous value: -"Languages the user says they read, e.g. \"Latin, Italian\"."New value: +"Languages the user says they read, if they said."
      • changedInput schema / properties / shift_id / description
        Previous value: -"shift_id from start_review_shift"New value: +"shift_id (blind check only)"
      • changedInput schema / properties / text_version / description
        Previous value: -"text_version from the item, passed back unchanged."New value: +"page.text_version, passed back unchanged."
      • addedInput schema / properties / user_looked
        Added value: +{
        +  "description": "book-run: true if the user checked something on this page themselves.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / verdict / description
        Previous value: -"The user's final verdict."New value: +"book-run: your verdict. blind: the user's final verdict."
      • changedInput schema / properties / verdict_before_assistant / description
        Previous value: -"True if the user committed to a verdict before seeing your reading."New value: +"blind: true if the user committed to a verdict before seeing your reading."
      • removedInput schema / properties / volunteer_code / description
        Removed value: -"volunteer_code from start_review_shift"
      • changedInput schema / required
        Previous value: -[
        -  "item_id",
        -  "volunteer_code",
        -  "verdict",
        -  "verdict_before_assistant"
        -]New value: +[
        +  "item_id",
        +  "volunteer_code",
        +  "verdict",
        +  "assistant_model"
        +]
  5. 1 tool update
    • Addedpropose_correction
  6. 2 tool updates
    • Addedstart_review_shift
    • Addedsubmit_page_review
  7. 2 tool updates
    • Changedsearch_concept1 field changed
      • addedInput schema / properties / diversity
        Added value: +{
        +  "description": "How the passages are spread. Default \"tradition\": each ten holds at most 2 passages per tradition family and per work, so a concept query returns several traditions and not one tradition's nearest pages (a clearly closer match is never passed over). \"author\": at most one per author and per work, for a cross-author survey. \"off\": plain nearest-first; use it when looking for one known passage. A quoted query or one naming a year defaults to \"off\". Each passage carries its book's `tradition` when it has one.",
        +  "enum": [
        +    "tradition",
        +    "author",
        +    "off"
        +  ],
        +  "type": "string"
        +}
    • Changedsearch_translations1 field changed
      • addedInput schema / properties / diversity
        Added value: +{
        +  "description": "Re-order the passages for spread. \"author\": at most one passage per author and per work in each ten, for a cross-author survey. \"tradition\": at most 2 per tradition family and per work. Default \"off\": keyword results come in match order. Nothing is dropped; later pages hold the rest.",
        +  "enum": [
        +    "tradition",
        +    "author",
        +    "off"
        +  ],
        +  "type": "string"
        +}
  8. 1 tool update
    • Changedsearch_images1 field changed
      • removedInput schema / properties / iconclass
        Removed value: -{
        -  "description": "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 matching images, NOT that the subject is absent from the corpus — retry with a text query before concluding anything. Book-illustration lane only (artworks are excluded when this filter is set). Matching results return their notations in an iconclass array.",
        -  "type": "string"
        -}
  9. 1 tool update
    • Changedlist_books1 field changed
      • addedInput schema / properties / work_id
        Added value: +{
        +  "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.",
        +  "type": "string"
        +}
  10. 1 tool update
    • Changedlist_books1 field changed
      • addedInput schema / properties / edition_key
        Added value: +{
        +  "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.",
        +  "type": "string"
        +}
  11. 1 tool update
    • Changedlist_books4 fields changed
      • addedInput schema / properties / author_id
        Added value: +{
        +  "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.",
        +  "type": "string"
        +}
      • changedInput schema / properties / search / description
        Previous value: -"Filter by title or author"New value: +"Free-text filter matching title or author (relevance-ranked, may include title matches). For exactly one person's books use author_id instead."
      • addedInput schema / properties / year_from
        Added value: +{
        +  "description": "Earliest edition year (inclusive). Matches only books with a known numeric year — ~60% of the library.",
        +  "type": "number"
        +}
      • addedInput schema / properties / year_to
        Added value: +{
        +  "description": "Latest edition year (inclusive).",
        +  "type": "number"
        +}
  12. 1 tool update
    • Changedsearch_images3 fields changed
      • addedInput schema / properties / iconclass
        Added value: +{
        +  "description": "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 matching images, NOT that the subject is absent from the corpus — retry with a text query before concluding anything. Book-illustration lane only (artworks are excluded when this filter is set). Matching results return their notations in an iconclass array.",
        +  "type": "string"
        +}
      • addedInput schema / properties / year_from / description
        Added value: +"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)."
      • addedInput schema / properties / year_to / description
        Added value: +"See year_from — same reliability caution applies."
  13. 1 tool update
    • Changedsearch_images1 field changed
      • addedInput schema / properties / offset
        Added value: +{
        +  "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).",
        +  "type": "number"
        +}
  14. 7 tool updates
    • Changedget_book_text1 field changed
      • addedInput schema / properties / lang
        Added value: +{
        +  "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.",
        +  "type": "string"
        +}
    • Changedget_quote1 field changed
      • addedInput schema / properties / lang
        Added value: +{
        +  "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.",
        +  "type": "string"
        +}
    • Changedget_quotes1 field changed
      • addedInput schema / properties / lang
        Added value: +{
        +  "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.",
        +  "type": "string"
        +}
    • Changedlist_books1 field changed
      • addedInput schema / properties / has_edition
        Added value: +{
        +  "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.",
        +  "type": "string"
        +}
    • Changedsearch_concept1 field changed
      • addedInput schema / properties / lang
        Added value: +{
        +  "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.",
        +  "type": "string"
        +}
    • Changedsearch_translations1 field changed
      • addedInput schema / properties / lang
        Added value: +{
        +  "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.",
        +  "type": "string"
        +}
    • Changedsearch_within_book1 field changed
      • addedInput schema / properties / lang
        Added value: +{
        +  "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.",
        +  "type": "string"
        +}

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Semantic search over 4.6 million text chunks from 20,000+ classical philosophy and humanities works (pre-1928). Covers Aristotle, Plato, Kant, Hegel, Nietzsche and hundreds more. Multilingual: English, German, Latin, French, Italian, Greek, Russian.
    3
    3
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables agentic hybrid search over a curated corpus of philosophical and spiritual texts, returning original passages with precise references so models can search, read, quote, and translate them.
    1
    GPL 3.0
  • A
    license
    A
    quality
    D
    maintenance
    Provides access to philosophy texts including scholarly papers from PhilPapers/PhilArchive and classic books from Project Gutenberg, SEP, and other open-access sources, all without requiring an API key.
    17
    10
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Self-hosted read-only MCP server over a local library of ancient-text corpora — 2.47M documents and 118M passages from 258 sources (cuneiform, Classical, biblical, medieval and more), with the license class tracked on every passage. 14 research tools: full-text search, concordance, passage display, dictionary definitions, etymologies, cognates, parallel passages, text alignment, place lookup etc
    2
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.