Skip to main content
Glama

Server Details

Search books and authors, fetch editions, browse subjects, and resolve cover images.

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 57 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
Repository
cyanheads/openlibrary-mcp-server
GitHub Stars
4
Server Listing
@cyanheads/openlibrary-mcp-server

TDQS

A4.5/5.0

Scored across 10 tools

Disambiguation5/5

Every tool has a clearly distinct purpose: author detail, author works, cover URL, edition resolution, edition listing, work detail, subject browse, and three separate searches (authors, books, full-text). Descriptions explicitly cross-reference when to use which, so an agent should not confuse them.

Naming Consistency5/5

All tools share the openlibrary_ prefix and follow a consistent verb_noun pattern: get_* for lookups and search_* for queries. The singular/plural pair get_edition and get_editions is predictable and backed by distinct nouns.

Tool Count5/5

10 tools is squarely within the ideal range for a focused domain. Each tool covers a distinct bibliographic operation with no redundancy or padding.

Completeness5/5

The server covers the core Open Library read API completely: author lookup and works, work and edition resolution, edition listing by work, subject browsing, cover URL generation, and three search modes including full-text. There are no obvious gaps for a read-only metadata server.

Available Tools

10 tools
openlibrary_get_authorGet AuthorA
Read-onlyIdempotent
Inspect

Fetch author detail by Open Library Author ID (OL…A). Returns bio, birth/death dates, photo IDs, and linked identifiers from Wikidata, VIAF, ISNI, Goodreads, and LibraryThing. Use openlibrary_search_authors to find an author ID first.

ParametersJSON Schema
NameRequiredDescriptionDefault
author_idYesOpen Library Author ID. Format: OL…A (e.g., "OL24638A"). A leading "/authors/" prefix is stripped if provided.

Output Schema

ParametersJSON Schema
NameRequiredDescription
bioNoAuthor biography. Absent when not provided.
nameNoPrimary author name.
errorNoPresent when the call failed. Absent on success.
noticeNoSet when the requested author ID was merged into a different canonical ID.
author_idNoCanonical Open Library Author ID (OL…A).
photo_idsNoNumeric photo IDs. Pass to openlibrary_get_cover_url with target "author" and id_type "id".
birth_dateNoBirth date string. Absent when not recorded.
death_dateNoDeath date string. Absent when not recorded.
remote_idsNoRemote identifiers for cross-referencing with other databases.
fuller_nameNoFull name including middle names. Absent when not recorded.
personal_nameNoPersonal or given name. Absent when not recorded.

TDQS

A4.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, openWorldHint, and idempotentHint, so the core behavioral profile is covered. The description adds a helpful list of returned identifiers but does not disclose additional behavioral traits such as rate limits, authentication, or failure modes; this is acceptable given the strong annotation coverage.

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 compact and front-loaded: it states the action, ID format, return fields, and prerequisite in three focused sentences. Every sentence contributes useful information, and there is no redundant or filler content.

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 simple read-only tool with one required parameter and an output schema, the description covers all necessary context: what the tool does, what the ID looks like, what data will be returned, and how to first find the ID. No critical information is missing.

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?

There is only one parameter and schema description coverage is 100%, so the schema already documents the ID format and prefix-stripping behavior. The description repeats this information rather than adding substantially new parameter semantics, warranting the baseline score.

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 uses a specific verb ('Fetch') and resource ('author detail') and identifies the exact ID format (OL…A). It also lists the returned data, making the tool's purpose distinct from sibling tools like openlibrary_get_author_works and openlibrary_search_authors.

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 explicitly instructs the agent to use openlibrary_search_authors first to obtain an author ID, which defines the correct entry condition. This provides clear guidance on the prerequisite workflow without leaving the agent to infer when this tool should be used.

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

openlibrary_get_author_worksGet Author WorksA
Read-only
Inspect

List works by an author. Returns titles, cover IDs, and work OLIDs for drilling into editions or details. Use openlibrary_get_author for author bio and details, or openlibrary_get_editions to explore specific printings.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax works to return.
offsetNoZero-based offset for pagination.
author_idYesOpen Library Author ID (OL…A). A leading "/authors/" prefix is stripped if provided.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
totalNoTotal works by this author.
worksNoWorks by this author, up to limit.
noticeNoSet when the requested author ID was merged into a different canonical ID.
offsetNoZero-based offset of the first returned result — echoes the requested offset, so an empty page still records the offset that produced it.
author_idNoOpen Library Author ID.
totalCountNoTotal works by this author across all pages.

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, so the read-only nature is known. The description adds value by disclosing the specific return fields (titles, cover IDs, work OLIDs) and the intent to drill into editions, which is behavioral context beyond the schema. It doesn't mention pagination or side effects, but those are covered by schema and annotations, so no gap significant enough to lower further.

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?

Two sentences with zero waste. The core purpose is front-loaded, return fields are listed concisely, and the alternative-tool guidance is compact and actionable. Every sentence earns its place.

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?

The description fully covers what an agent needs to decide whether to use this tool: it states the purpose, return values, and when to prefer siblings. An output schema exists, so detailed return structure is covered there. With annotations covering safety and schema covering parameters, nothing essential is missing.

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 parameter (author_id, limit, offset) already has clear descriptions in the schema. The tool description adds no additional parameter semantics beyond what the schema provides, so the baseline of 3 is appropriate.

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 ('List works by an author') and enumerates the return fields (titles, cover IDs, work OLIDs). It explicitly distinguishes itself from sibling tools openlibrary_get_author (bio/details) and openlibrary_get_editions (printings), making its purpose unambiguous without opening schemas.

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 routing guidance: 'Use openlibrary_get_author for author bio and details, or openlibrary_get_editions to explore specific printings.' This tells an agent exactly when to choose this tool versus alternatives, 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.

openlibrary_get_cover_urlGet Cover URLA
Read-onlyIdempotent
Inspect

Resolve a cover image URL for a book or author photo. Returns a direct HTTPS URL in the requested size (S/M/L). The Covers API always returns HTTP 200 — missing covers return a 1×1 placeholder GIF, not a 404 — so the identifier format is validated locally first: "id" must be numeric, "isbn" 10 or 13 digits (an ISBN-10 may end in an X check digit), "olid" an edition OLID (OL…M) for target "book" and an author OLID (OL…A) for target "author". Identifiers with path separators or control characters, and author-by-ISBN lookups, are rejected before any request. URLs can be embedded in markdown as cover.

ParametersJSON Schema
NameRequiredDescriptionDefault
sizeNoImage size. S = small (~45px tall), M = medium (~150px tall), L = large (~400px tall).M
targetNo"book" returns a book cover from covers.openlibrary.org/b/. "author" returns an author photo from covers.openlibrary.org/a/ — use with id_type "id" (photo_id) or "olid" (author OLID).book
id_typeYes"id" is the numeric cover_i / cover ID from search or work results. "isbn" and "olid" look up the cover from those identifiers.
identifierYesThe identifier value, validated against id_type before the URL is built. For "id": a numeric cover or photo ID from work/edition/author data. For "isbn": 10 or 13 digits, hyphens optional — an ISBN-10 may end in an X check digit (e.g., 080442957X). For "olid": an edition OLID (OL…M) for target "book", an author OLID (OL…A) for target "author".

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlNoDirect HTTPS URL to the cover image. The Covers API returns HTTP 200 for all requests — a 1×1 placeholder GIF is returned when no cover exists for the identifier.
noteNoReminder that the URL always returns HTTP 200; a placeholder GIF is served when no cover exists.
errorNoPresent when the call failed. Absent on success.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already mark readOnly and idempotent, but the description adds critical non-obvious behavior: the Covers API always returns HTTP 200, missing covers return a placeholder GIF, identifiers are validated locally before any request, and author-by-ISBN lookups are rejected. This goes well beyond what annotations provide.

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 front-loaded with the core purpose and then layers behavioral and validation detail. It is longer than typical but every sentence conveys necessary information; the density is justified by the number of validation edge cases, though it could be broken into clearer subsections.

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 output (HTTPS URL, size), behavioral quirks (placeholder, always-200), and validation rules, and an output schema exists. The only notable omission is what happens when validation rejects an identifier (the error path), and the exact URL format is not elaborated, though this may be in the output schema.

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?

Even though schema coverage is 100%, the description enriches parameters materially: it defines local validation rules, ISBN-10 X check digit, valid OLID suffixes per target, and explicit rejection categories (path separators, control characters, author-by-ISBN). These are not present in the schema descriptions and are essential for correct invocation.

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 a specific verb ('Resolve') and resource ('cover image URL'), distinguishes book vs author, and immediately differentiates itself from sibling data-fetching and search tools. An agent can tell this is the only tool that produces cover URLs without inspecting schemas.

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 implies usage context by describing exactly what the tool returns (direct HTTPS URL in S/M/L) and sets expectations about validation. However, it does not explicitly compare with alternatives or state when not to use it, though no sibling tool competes for the same purpose.

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

openlibrary_get_editionGet EditionA
Read-onlyIdempotent
Inspect

Resolve one or more editions by identifier: ISBN-10, ISBN-13, OCLC, LCCN, or Open Library Edition ID (OL…M). Every identifier in a call shares one id_type — pass id_type "isbn" for both ISBN-10 and ISBN-13. Up to 50 identifiers resolve in a single upstream request, so a bibliography or shelf export costs one call rather than one per book; a large batch is a large response, so ask for what you need. Returns full edition metadata including authors, publisher, language, all identifier types, and the parent work ID, with author names inline and no secondary lookup; when the edition record itself lists no authors, they are recovered from the parent work and marked as such, and a notice names any edition whose recovery failed. Partial success is the norm — identifiers that resolve come back in editions, the rest are listed in unresolved with a reason, and the call fails only when nothing resolved.

ParametersJSON Schema
NameRequiredDescriptionDefault
id_typeYesIdentifier type shared by every entry in identifiers. "isbn" handles both ISBN-10 and ISBN-13. "olid" is the native Open Library edition ID (OL…M). Mixing types within one call is not supported — issue one call per type.
identifiersYesIdentifiers to resolve, 1–50, all of the type named by id_type. Resolved editions come back in request order.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
noticeNoPresent when author lookups for some editions failed or were skipped: names those editions, whose authors are missing or shown by author ID. Absent when every lookup completed.
editionsNoEditions that resolved, in request order. Shorter than identifiers when any entry missed.
unresolvedNoIdentifiers that produced no edition. Empty when every identifier resolved; never overlaps editions.

TDQS

A4.5/5.0
Behavior5/5

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

The description goes well beyond the readOnlyHint, openWorldHint, and idempotentHint annotations by disclosing partial success behavior, the unresolved list with reasons, the failure condition ('fails only when nothing resolved'), and the author-recovery fallback from the parent work. This is rich, accurate behavioral context that an agent needs to interpret results correctly.

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 earns its place: purpose, identifier-type rule, batching guidance, return contents, author fallback, and partial-success behavior. It is front-loaded with the core action and avoids filler or repetition.

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?

Given the two parameters, the annotations, and the presence of an output schema, the description covers everything an agent needs: input constraints, batching limits, response ordering, partial success, failure semantics, and author fallback. Nothing critical is missing for correct invocation and interpretation.

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%, so the schema already documents both parameters thoroughly. The description reinforces key semantics like id_type 'isbn' covering both ISBN-10 and ISBN-13 and the 50-item cap, but it does not add substantial meaning beyond the schema. Baseline 3 is appropriate.

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: 'Resolve one or more editions by identifier,' and enumerates the exact identifier types accepted. This clearly distinguishes it from sibling tools like openlibrary_get_work or openlibrary_get_editions, which target different resources or operations. The scope is unambiguous.

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: when you have identifiers such as ISBNs or OLIDs and want full edition metadata in a batched call. It notes that a bibliography or shelf export costs one call rather than one per book, which implies batch usage. It does not explicitly name alternatives or state when not to use it, so it falls just short of a 5.

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

openlibrary_get_editionsGet EditionsA
Read-onlyIdempotent
Inspect

List editions of a work — different publishers, languages, formats, and print runs. Returns ISBNs, publisher, language, page count, and edition OLIDs. Use after openlibrary_get_work or openlibrary_search_books to find a specific printing. A merged work ID resolves to the work it was merged into. To reach a work from an ISBN, call openlibrary_get_edition with id_type "isbn" — its work_id output is the parent work.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax editions to return. Prefer 10–20 for exploration.
offsetNoZero-based offset for pagination.
work_idYesOpen Library Work ID. Format: OL…W (e.g., "OL45804W"), optionally prefixed "/works/". Not an ISBN — resolve an ISBN to its work with openlibrary_get_edition (id_type "isbn").

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
totalNoTotal editions for this work.
noticeNoSet when the requested work ID was merged into a different canonical ID.
offsetNoZero-based offset of the first returned result — echoes the requested offset, so an empty page still records the offset that produced it.
work_idNoCanonical Open Library Work ID the editions were found under — differs from the requested work_id when that ID was merged into this work.
editionsNoEditions of the work, up to limit.
totalCountNoTotal editions for this work across all pages.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnly, openWorld, and idempotent hints, so the safety profile is covered. The description adds useful behavioral context beyond annotations, notably that a merged work ID resolves to the work it was merged into and that the output includes specific edition fields.

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?

Four sentences, each earning its place: core purpose, output contents, usage sequencing, and edge-case routing. Slightly denser than the minimum, but still efficiently front-loaded and free of 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?

Combined with a rich input schema, an output schema, and clear annotations, the description covers the essential workflow, edge cases, and alternatives. Nothing an agent needs to select and invoke this tool correctly is missing.

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%, with each parameter (work_id, limit, offset) already well documented including patterns, defaults, and ranges. The description's parameter-related content largely repeats the schema's guidance about ISBNs versus work IDs, so it adds no significant semantic value beyond 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 description opens with a specific verb and resource: 'List editions of a work', then enumerates what is returned (ISBNs, publisher, language, page count, edition OLIDs). This clearly distinguishes it from singular openlibrary_get_edition and other siblings.

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 sequencing is provided: 'Use after openlibrary_get_work or openlibrary_search_books to find a specific printing.' It also names the alternative path for ISBN-to-work resolution by calling openlibrary_get_edition, giving agents concrete routing guidance.

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

openlibrary_get_subjectGet SubjectA
Read-only
Inspect

Browse works by subject. Returns matching works with edition counts and cover IDs, plus the total work count for the subject. Case and spacing are normalized before lookup, so "Science Fiction" and "science_fiction" are the same request. Subject tags are user-contributed and the vocabulary varies — when a subject returns no works, try a different word form (singular/plural), a synonym, or a broader term.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax works to return. Subject pages typically show 12 at a time.
offsetNoZero-based offset for pagination.
subjectYesSubject name. Normalized before lookup — lowercased with spaces converted to underscores (e.g., "Science Fiction" → "science_fiction") — so varying case or spacing does not change the result.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
worksNoWorks under this subject, up to limit.
noticeNoRecovery guidance when work_count is 0 — echoes the subject and suggests alternatives. Absent when works are found.
offsetNoZero-based offset of the first returned result — echoes the requested offset, so an empty page still records the offset that produced it.
totalCountNoTotal works tagged with this subject across all pages.
work_countNoTotal works tagged with this subject.
subject_keyNoNormalized subject key (lowercase, underscores).
subject_nameNoCanonical subject name as stored on Open Library.

TDQS

A4.5/5.0
Behavior5/5

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

The description adds meaningful runtime behavior beyond the annotations: case and spacing normalization, user-contributed subject vocabulary, and a no-results fallback strategy. These are non-obvious behavioral details that affect how an agent interprets results. It does not contradict the readOnlyHint or openWorldHint 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?

Four sentences, each earning its place: scope, return contents, normalization behavior, and fallback advice. The description is compact, front-loaded, and contains no 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?

Given the read-only and open-world annotations, plus an output schema, the description covers all essential call context: what is returned, how lookup behaves, and what to do when no works match. Nothing critical is missing for selecting and invoking the tool correctly.

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%, so the baseline is 3. The limit, offset, and subject parameters are already fully documented in the schema, and the description mostly repeats the normalization semantics for subject without adding new parameter-level detail.

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 'Browse works by subject,' naming both the operation and the resource, then specifies the concrete output: matching works with edition counts, cover IDs, and total work count. This clearly separates it from sibling tools like openlibrary_get_work, openlibrary_get_author, and openlibrary_search_books.

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 clearly frames when to use the tool for subject-based browsing and gives explicit guidance for empty results: try a different word form, synonym, or broader term. It does not explicitly state when to prefer a sibling search tool, so it lacks full when-not guidance.

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

openlibrary_get_workGet WorkA
Read-onlyIdempotent
Inspect

Fetch a work by Open Library Work ID (OL…W). Returns title, description, subjects, cover IDs, and linked author IDs for follow-up lookups. Works represent the abstract book concept independent of any specific edition. A merged work ID resolves to the work it was merged into. To reach a work from an ISBN, call openlibrary_get_edition with id_type "isbn" — its work_id output is the parent work. Note: author names are not included — use openlibrary_get_author or openlibrary_search_books for names.

ParametersJSON Schema
NameRequiredDescriptionDefault
work_idYesOpen Library Work ID. Format: OL…W (e.g., "OL45804W"), optionally prefixed "/works/". Not an ISBN — resolve an ISBN to its work with openlibrary_get_edition (id_type "isbn").

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
titleNoWork title.
noticeNoSet when the requested work ID was merged into a different canonical ID, and when the text output caps a long subject list (naming the omitted count and the complete array in structuredContent). Absent when neither applies.
createdNoISO 8601 creation timestamp. Absent when not available.
work_idNoCanonical Open Library Work ID (OL…W) — differs from the requested work_id when that ID was merged into this work.
subjectsNoSubject tags for this work.
cover_idsNoNumeric cover IDs. Pass to openlibrary_get_cover_url with id_type "id".
author_idsNoOpen Library Author IDs (OL…A). Use openlibrary_get_author for names and bio.
descriptionNoWork description or blurb. Absent when not provided.
last_modifiedNoISO 8601 last-modified timestamp. Absent when not available.
subject_timesNoTime period subjects.
subject_peopleNoPeople subjects.
subject_placesNoGeographic subjects.

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already establish read-only, idempotent, and open-world behavior. The description adds valuable behavioral context beyond them: merged work IDs resolve to their merged target, and author names are deliberately excluded from the response. This is meaningful disclosure that helps the agent set expectations.

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 compact and front-loaded with the essential action and return shape. Each sentence earns its place: core purpose, output fields, edition distinction, merged-ID behavior, ISBN routing, and the author-name caveat. No filler or repetition.

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 an output schema present, the description does not need to enumerate return details further. It covers the key edge cases an agent will encounter — ISBN lookup routing, merged works, and missing author names — making the tool fully callable in context.

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 thoroughly documents work_id format and examples. The description still adds semantic value by explaining how an ISBN can lead to a work_id via openlibrary_get_edition, and by reinforcing that the parameter is not an ISBN.

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: 'Fetch a work by Open Library Work ID'. It names the returned fields and explicitly contrasts works with editions, distinguishing it from openlibrary_get_edition and openlibrary_get_editions.

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 gives concrete routing guidance: use openlibrary_get_edition with id_type 'isbn' when starting from an ISBN, and use openlibrary_get_author or openlibrary_search_books when author names are needed. It also explains the merged-work resolution behavior, leaving little ambiguity about when to call this tool.

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

openlibrary_search_authorsSearch AuthorsA
Read-only
Inspect

Search Open Library authors by name. Returns Open Library Author IDs, names, birth/death dates, top works, and subject associations. Use author IDs for openlibrary_get_author (bio, remote IDs) or openlibrary_get_author_works (list of works).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax results to return.
queryYesAuthor name search query. Partial names and alternate names work.
offsetNoZero-based offset for pagination.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
totalNoTotal matching authors across all pages.
noticeNoGuidance when the page is empty (how to vary a name that matched nothing, or which offset to retry when offset ran past the end) or when the text output capped a per-author list. Absent when neither applies.
offsetNoZero-based offset of the first returned result — echoes the requested offset, so an empty page still records the offset that produced it.
authorsNoMatching authors, up to limit.
totalCountNoTotal matching authors across all pages — the upstream match count, reported even when this page is empty because offset ran past the end.

TDQS

A3.9/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, covering the safety profile. The description adds the return field list (IDs, names, dates, works, subjects) but not deeper behavior like rate limits, ordering, or result richness. With annotation coverage, this is adequate but not rich.

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?

Two sentences, no filler. Purpose and result fields in the first sentence; usage guidance in the second. Efficient and front-loaded, though the second sentence could arguably be part of usage guidelines rather than purpose, it doesn't waste words.

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 an output schema exists and annotations cover safety, the description provides the key context: what fields appear in results and how to consume them with sibling tools. Pagination behaviors are in the schema. Nothing critical is missing for an agent to call it correctly.

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 100% for all three parameters; the description adds nothing beyond what the schema already states (e.g., 'Partial names and alternate names work' is duplicated from the query description). Baseline 3 is appropriate because the schema does the heavy lifting.

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: 'Search Open Library authors by name.' Clearly distinguishes itself from sibling retrieval tools by naming the follow-up tools (openlibrary_get_author, openlibrary_get_author_works) that consume its output. Immediate clarity on what it does and how it fits.

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 context on how to use the returned author IDs for subsequent tool calls, which tells the agent why this tool exists. Doesn't explicitly state when not to use it vs. search_books, but the mention of alternatives creates a clear usage path. Minor gap: no exclusions or conditions.

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

openlibrary_search_booksSearch BooksA
Read-only
Inspect

Full-text book search across Open Library works. Supports field filters (title, author, subject, publisher, ISBN, language) and returns work-level records with edition counts, cover IDs, and reading availability. Use query for general search or combine specific field filters. Results are work-level — drill into editions via openlibrary_get_editions.

ParametersJSON Schema
NameRequiredDescriptionDefault
isbnNoFind works that have editions with this ISBN (10 or 13 digits, hyphens ignored).
sortNoSort order. "relevance" uses Solr scoring. "new"/"old" sort by first publish year. "rating" by average community rating. "editions" by edition count.relevance
limitNoMax results to return. Higher values increase response size; prefer 10–20 for exploration.
queryNoFull-text search query. Supports Solr field prefixes: title:, author:, subject:, publisher:, isbn:, language:. Omit to use the filter parameters instead.
titleNoFilter by title. Matched against work title and alternative titles.
authorNoFilter by author name. Partial names work.
offsetNoZero-based offset for pagination.
subjectNoFilter by subject tag (e.g., "science fiction", "history").
languageNoRestrict results to one language. Takes a 3-letter MARC code (e.g., "eng", "fre", "ger", "chi") — the same vocabulary openlibrary_get_edition and openlibrary_get_editions return. A 2-letter ISO 639-1 code (e.g., "en", "fr") is accepted and translated to its MARC equivalent; an unrecognized 2-letter code is rejected rather than silently ignored. The equivalent in-query form is language:eng.
publisherNoFilter by publisher name. Partial names work (e.g., "Penguin").
include_availabilityNoInclude live reading availability from Internet Archive (borrow/read status). Adds ~200ms latency. Use when the user needs to know if they can read the book online.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
totalNoTotal matching works across all pages.
worksNoMatching works, up to limit.
noticeNoGuidance when the page is empty (how to broaden a query that matched nothing, or which offset to retry when offset ran past the end) or when the text output capped a per-work list. Absent when neither applies.
offsetNoZero-based offset of the first returned result.
queryEchoNoThe effective search criteria as the server interpreted them — query string plus any active field filters. Absent when only a bare query is used.
totalCountNoTotal matching works across all pages — the upstream match count, reported even when this page is empty because offset ran past the end.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already mark readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds behavioral detail beyond that, such as returning work-level records, edition counts, cover IDs, reading availability, and the ~200ms latency when include_availability is enabled. This gives the agent a clearer expectation of what is returned and the cost of a parameter.

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 two sentences, front-loaded with the purpose and key distinctions. It wastes no words and covers the essential behavioral aspects concisely. The structure is efficient and readable.

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?

Given the tool's complexity (11 parameters but all schema-covered) and the presence of an output schema, the description fully covers what an agent needs: the resource, the filtering capabilities, the output shape, and the relationship to sibling tools. Nothing material is missing.

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%, so each parameter is fully documented in the schema. The description adds a small bit of guidance ('Use query for general search or combine specific field filters') and clarifies the available sorts and filters, but it does not significantly extend the meaning beyond the schema's descriptions. Baseline 3 is appropriate.

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 function: full-text search across Open Library works with field filters. It names the resource (Open Library works), the verb (search), and explicitly contrasts with siblings like openlibrary_search_authors and openlibrary_search_inside, making it easy for an agent to select the right tool.

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?

It provides explicit guidance on when to use this tool: 'Use query for general search or combine specific field filters.' It also instructs on the relationship with openlibrary_get_editions, saying 'drill into editions via openlibrary_get_editions.' Additionally, it notes the purpose of include_availability ('Use when the user needs to know if they can read the book online'), which is actionable.

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

openlibrary_search_insideSearch Inside BooksA
Read-only
Inspect

Search the full text of books scanned by the Internet Archive — the "which book contains this passage?" lookup that the metadata tools cannot answer. Quote a phrase for an exact-phrase match; bare terms match anywhere in the text. Each result is an Internet Archive item with the matching passages as snippets, plus a relevance score. The full-text index is far slower than the metadata endpoints, and a search usually takes 10–30 seconds. Use it when the passage is the question, and use openlibrary_search_books to search by title, author, or subject. Results key on Internet Archive items rather than Open Library works: chain the returned ia_identifier to archive.org, or match it against the ia_identifiers on openlibrary_search_books results to reach the catalogue record.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax matching items to return. Each carries its own snippets, so higher values grow the response quickly — prefer 10–20.
queryYesText to find inside scanned books. Wrap in double quotes for an exact-phrase match (e.g., "the spice must flow"); unquoted terms match independently and return far broader results.
offsetNoZero-based offset for pagination.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
totalNoTotal matching Internet Archive items across all pages.
noticeNoGuidance when the page is empty (how to broaden a query that matched nothing, or which offset to retry when offset ran past the end) or when the text output capped a per-item snippet list. Absent when neither applies.
offsetNoZero-based offset of the first returned match.
matchesNoMatching items, up to limit, ordered by relevance.
totalCountNoTotal matching items across all pages — the upstream match count, reported even when this page is empty because offset ran past the end.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations provide readOnlyHint and openWorldHint, but the description adds significant behavioral context: the index is 'far slower than the metadata endpoints' and takes 10–30 seconds, and results key on Internet Archive items rather than Open Library works. These details go beyond annotations and help set expectations for latency and result semantics. No contradiction exists.

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 dense but well-organized: purpose first, then usage, performance, and alternative routing. Every sentence contributes information—no filler. It is a bit long but justified by the complexity of the tool's behavior (exact-phrase syntax, IA vs OL item distinction, speed caveat). Front-loading the core purpose and differentiation is effective.

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?

Given the output schema (not shown but present) and annotations covering readOnly and openWorld, the description is complete for agent use. It covers what the tool does, how to phrase queries, what results look like (IA items with snippets and relevance), how to connect to catalogue records, and performance expectations. Nothing an agent needs to call 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?

The schema already describes all three parameters (100% coverage), but the description adds value beyond that. It explains that quoting in query yields exact-phrase matches and unquoted terms match independently, and advises on limit values ('prefer 10–20') because larger responses grow quickly. These are practical details not in the schema, so the description meaningfully enhances 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 clearly states the tool performs full-text search within scanned books, using the exact phrase 'Search the full text of books scanned by the Internet Archive'. It explicitly differentiates from sibling tools by calling it 'the metadata tools cannot answer' and names openlibrary_search_books as the alternative for metadata queries, so an agent can immediately tell it apart.

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 guidance is given: 'Use it when the passage is the question, and use openlibrary_search_books to search by title, author, or subject.' It also explains how to chain results to the catalogue via ia_identifier, and notes performance expectations (10–30 seconds). This is clear, actionable direction with alternatives and exclusions.

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. 9 tool updates
    • Changedopenlibrary_get_author1 field changed
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `not_found`: Author ID does not exist on Open Library. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `not_found`: Author ID does not exist on Open Library, names a record that is not an author (a work or edition OLID), or redirects to no reachable author. Other values are possible when a failure originates below the handler."
    • Changedopenlibrary_get_author_works3 fields changed
      • changedOutput schema / anyOf
        Previous value: -[
        -  {
        -    "not": {
        -      "required": [
        -        "error"
        -      ]
        -    },
        -    "required": [
        -      "total",
        -      "author_id",
        -      "works"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "error"
        -    ]
        -  }
        -]New value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "total",
        +      "offset",
        +      "author_id",
        +      "works"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `not_found`: Author ID does not exist on Open Library. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `not_found`: Author ID does not exist on Open Library, names a record that is not an author (a work or edition OLID), or redirects to no reachable author. Other values are possible when a failure originates below the handler."
      • addedOutput schema / properties / offset
        Added value: +{
        +  "description": "Zero-based offset of the first returned result — echoes the requested offset, so an empty page still records the offset that produced it.",
        +  "type": "number"
        +}
    • Changedopenlibrary_get_cover_url1 field changed
      • changedInput schema / properties / identifier / description
        Previous value: -"The identifier value, validated against id_type before the URL is built. For \"id\": a numeric cover or photo ID from work/edition/author data. For \"isbn\": 10 or 13 digits, hyphens optional. For \"olid\": an edition OLID (OL…M) for target \"book\", an author OLID (OL…A) for target \"author\"."New value: +"The identifier value, validated against id_type before the URL is built. For \"id\": a numeric cover or photo ID from work/edition/author data. For \"isbn\": 10 or 13 digits, hyphens optional — an ISBN-10 may end in an X check digit (e.g., 080442957X). For \"olid\": an edition OLID (OL…M) for target \"book\", an author OLID (OL…A) for target \"author\"."
    • Changedopenlibrary_get_edition5 fields changed
      • changedInput schema / properties / identifiers / items / description
        Previous value: -"One identifier value. For ISBN: 10 or 13 digits, hyphens optional. For OCLC: numeric string. For LCCN: string as-is. For OLID: Open Library edition ID (e.g., OL7353617M)."New value: +"One identifier value. For ISBN: 10 or 13 digits, hyphens optional — an ISBN-10 may end in an X check digit (e.g., 080442957X). For OCLC: numeric string. For LCCN: string as-is. For OLID: Open Library edition ID (e.g., OL7353617M)."
      • changedOutput schema / properties / editions / items / properties / authors / description
        Previous value: -"Authors credited for this edition. Empty only when neither the edition nor its parent work records an author."New value: +"Authors credited for this edition. Empty when neither the edition nor its parent work records an author, or when the lookup of the parent work failed or was skipped — the notice names those editions."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `not_found`: No identifier in the batch resolved to an edition. `invalid_identifier`: Every identifier in the batch is malformed for the specified id_type. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `not_found`: No identifier in the batch resolved to an edition. `invalid_identifier`: Every identifier in the batch is malformed for the specified id_type. `upstream_unavailable`: Open Library's batch edition lookup answered with an HTTP error status other than 429, or with an HTML page instead of JSON. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "not_found",
        -  "invalid_identifier"
        -]New value: +[
        +  "not_found",
        +  "invalid_identifier",
        +  "upstream_unavailable"
        +]
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Present when author lookups for some editions failed or were skipped: names those editions, whose authors are missing or shown by author ID. Absent when every lookup completed.",
        +  "type": "string"
        +}
    • Changedopenlibrary_get_editions8 fields changed
      • changedInput schema / properties / work_id / description
        Previous value: -"Open Library Work ID (OL…W). A leading \"/works/\" prefix is stripped if provided."New value: +"Open Library Work ID. Format: OL…W (e.g., \"OL45804W\"), optionally prefixed \"/works/\". Not an ISBN — resolve an ISBN to its work with openlibrary_get_edition (id_type \"isbn\")."
      • addedInput schema / properties / work_id / pattern
        Added value: +"^(?:\\/works\\/)?OL\\d+W$"
      • changedOutput schema / anyOf
        Previous value: -[
        -  {
        -    "not": {
        -      "required": [
        -        "error"
        -      ]
        -    },
        -    "required": [
        -      "total",
        -      "work_id",
        -      "editions"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "error"
        -    ]
        -  }
        -]New value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "total",
        +      "offset",
        +      "work_id",
        +      "editions"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • changedOutput schema / properties / editions / items / properties / work_id / description
        Previous value: -"Parent Work ID. Usually matches the requested work_id."New value: +"Parent Work ID. Usually matches the top-level work_id."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `not_found`: Work ID does not exist on Open Library. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `not_found`: Work ID does not exist on Open Library, or it redirects to no reachable work. Other values are possible when a failure originates below the handler."
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Set when the requested work ID was merged into a different canonical ID.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / offset
        Added value: +{
        +  "description": "Zero-based offset of the first returned result — echoes the requested offset, so an empty page still records the offset that produced it.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / work_id / description
        Previous value: -"Open Library Work ID."New value: +"Canonical Open Library Work ID the editions were found under — differs from the requested work_id when that ID was merged into this work."
    • Changedopenlibrary_get_subject2 fields changed
      • changedOutput schema / anyOf
        Previous value: -[
        -  {
        -    "not": {
        -      "required": [
        -        "error"
        -      ]
        -    },
        -    "required": [
        -      "subject_name",
        -      "subject_key",
        -      "work_count",
        -      "works"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "error"
        -    ]
        -  }
        -]New value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "subject_name",
        +      "subject_key",
        +      "work_count",
        +      "offset",
        +      "works"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / offset
        Added value: +{
        +  "description": "Zero-based offset of the first returned result — echoes the requested offset, so an empty page still records the offset that produced it.",
        +  "type": "number"
        +}
    • Changedopenlibrary_get_work5 fields changed
      • changedInput schema / properties / work_id / description
        Previous value: -"Open Library Work ID. Format: OL…W (e.g., \"OL45804W\"). A leading \"/works/\" prefix is stripped if provided."New value: +"Open Library Work ID. Format: OL…W (e.g., \"OL45804W\"), optionally prefixed \"/works/\". Not an ISBN — resolve an ISBN to its work with openlibrary_get_edition (id_type \"isbn\")."
      • addedInput schema / properties / work_id / pattern
        Added value: +"^(?:\\/works\\/)?OL\\d+W$"
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `not_found`: Work ID does not exist on Open Library. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `not_found`: Work ID does not exist on Open Library, or it redirects to no reachable work. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / notice / description
        Previous value: -"Disclosure when the text output caps a long list — names the omitted count and points to the complete array in structuredContent. Absent when nothing was capped."New value: +"Set when the requested work ID was merged into a different canonical ID, and when the text output caps a long subject list (naming the omitted count and the complete array in structuredContent). Absent when neither applies."
      • changedOutput schema / properties / work_id / description
        Previous value: -"Canonical Open Library Work ID (OL…W)."New value: +"Canonical Open Library Work ID (OL…W) — differs from the requested work_id when that ID was merged into this work."
    • Changedopenlibrary_search_books2 fields changed
      • changedOutput schema / properties / works / items / properties / availability / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "available_to_borrow": {
        -        "description": "True when the book can be borrowed.",
        -        "type": "boolean"
        -      },
        -      "available_to_browse": {
        -        "description": "True when the book can be browsed for free.",
        -        "type": "boolean"
        -      },
        -      "available_to_waitlist": {
        -        "description": "True when a waitlist is available.",
        -        "type": "boolean"
        -      },
        -      "is_lendable": {
        -        "description": "True when the book can be lent.",
        -        "type": "boolean"
        -      },
        -      "is_previewable": {
        -        "description": "True when a limited preview is available.",
        -        "type": "boolean"
        -      },
        -      "is_readable": {
        -        "description": "True when the book is freely readable online.",
        -        "type": "boolean"
        -      },
        -      "is_restricted": {
        -        "description": "True when access is restricted.",
        -        "type": "boolean"
        -      },
        -      "openlibrary_edition": {
        -        "description": "Edition OLID the availability check was resolved against.",
        -        "type": "string"
        -      },
        -      "status": {
        -        "description": "Availability status string from Internet Archive.",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "status",
        -      "available_to_browse",
        -      "available_to_borrow",
        -      "available_to_waitlist",
        -      "is_readable",
        -      "is_lendable",
        -      "is_previewable",
        -      "is_restricted"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "available_to_borrow": {
        +        "description": "True when the book can be borrowed. Absent when not reported.",
        +        "type": "boolean"
        +      },
        +      "available_to_browse": {
        +        "description": "True when the book can be browsed for free. Absent when not reported.",
        +        "type": "boolean"
        +      },
        +      "available_to_waitlist": {
        +        "description": "True when a waitlist is available. Absent when not reported.",
        +        "type": "boolean"
        +      },
        +      "is_lendable": {
        +        "description": "True when the book can be lent. Absent when not reported.",
        +        "type": "boolean"
        +      },
        +      "is_previewable": {
        +        "description": "True when a limited preview is available. Absent when not reported.",
        +        "type": "boolean"
        +      },
        +      "is_readable": {
        +        "description": "True when the book is freely readable online. Absent when not reported.",
        +        "type": "boolean"
        +      },
        +      "is_restricted": {
        +        "description": "True when access is restricted. Absent when not reported.",
        +        "type": "boolean"
        +      },
        +      "openlibrary_edition": {
        +        "description": "Edition OLID the availability check was resolved against. Absent when not reported.",
        +        "type": "string"
        +      },
        +      "status": {
        +        "description": "Availability status from Internet Archive, e.g. \"open\" (freely readable), \"borrow_available\", \"borrow_unavailable\", \"private\", or \"error\" (the lending lookup failed, so no flags accompany it). \"unknown\" when Open Library sent no status.",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "status"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedOutput schema / properties / works / items / properties / availability / description
        Previous value: -"Live reading availability from Internet Archive. Present when include_availability is true and the work has an Internet Archive item. Null when include_availability is true but no IA item exists."New value: +"Live reading availability from Internet Archive, present when include_availability is true. Open Library leaves flags out for some works — an absent flag is unknown, not false. Null means no availability was returned for the work: always so without an Internet Archive item, and sometimes so for a work that has one."
    • Changedopenlibrary_search_inside2 fields changed
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode."New value: +"Machine-readable failure mode. Declared by this tool: `upstream_unavailable`: Open Library's full-text search answered HTTP 200 without a result set — no hits object carrying a total. Other values are possible when a failure originates below the handler."
      • addedOutput schema / properties / error / properties / data / properties / reason / examples
        Added value: +[
        +  "upstream_unavailable"
        +]
  2. 10 tool updates
    • Changedopenlibrary_get_author6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "author_id",
        +      "name",
        +      "photo_ids",
        +      "remote_ids"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `not_found`: Author ID does not exist on Open Library. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "not_found"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "author_id",
        -  "name",
        -  "photo_ids",
        -  "remote_ids"
        -]
    • Changedopenlibrary_get_author_works6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "total",
        +      "author_id",
        +      "works"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `not_found`: Author ID does not exist on Open Library. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "not_found"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "total",
        -  "author_id",
        -  "works"
        -]
    • Changedopenlibrary_get_cover_url6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "url",
        +      "note"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `invalid_identifier`: The identifier contains path separators, \"..\", or control characters, or does not match the format its id_type expects. `invalid_target`: The id_type is not valid for the target — an author photo cannot be resolved by ISBN. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "invalid_identifier",
        +            "invalid_target"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "url",
        -  "note"
        -]
    • Changedopenlibrary_get_edition6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "editions",
        +      "unresolved"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `not_found`: No identifier in the batch resolved to an edition. `invalid_identifier`: Every identifier in the batch is malformed for the specified id_type. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "not_found",
        +            "invalid_identifier"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "editions",
        -  "unresolved"
        -]
    • Changedopenlibrary_get_editions6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "total",
        +      "work_id",
        +      "editions"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `not_found`: Work ID does not exist on Open Library. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "not_found"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "total",
        -  "work_id",
        -  "editions"
        -]
    • Changedopenlibrary_get_subject6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "subject_name",
        +      "subject_key",
        +      "work_count",
        +      "works"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode.",
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "subject_name",
        -  "subject_key",
        -  "work_count",
        -  "works"
        -]
    • Changedopenlibrary_get_work6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "work_id",
        +      "title",
        +      "subjects",
        +      "subject_places",
        +      "subject_times",
        +      "subject_people",
        +      "cover_ids",
        +      "author_ids"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `not_found`: Work ID does not exist on Open Library. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "not_found"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "work_id",
        -  "title",
        -  "subjects",
        -  "subject_places",
        -  "subject_times",
        -  "subject_people",
        -  "cover_ids",
        -  "author_ids"
        -]
    • Changedopenlibrary_search_authors6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "total",
        +      "offset",
        +      "authors"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode.",
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "total",
        -  "offset",
        -  "authors"
        -]
    • Changedopenlibrary_search_books6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "total",
        +      "offset",
        +      "works"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `unknown_language_code`: A 2-letter language value has no MARC equivalent, so no filter could be applied. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "unknown_language_code"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "total",
        -  "offset",
        -  "works"
        -]
    • Changedopenlibrary_search_inside6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "total",
        +      "offset",
        +      "matches"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode.",
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "total",
        -  "offset",
        -  "matches"
        -]
  3. 2 tool updates
    • Changedopenlibrary_get_author1 field changed
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Set when the requested author ID was merged into a different canonical ID.",
        +  "type": "string"
        +}
    • Changedopenlibrary_get_author_works1 field changed
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Set when the requested author ID was merged into a different canonical ID.",
        +  "type": "string"
        +}
  4. 3 tool updates
    • Changedopenlibrary_get_cover_url1 field changed
      • changedInput schema / properties / identifier / description
        Previous value: -"The identifier value. For \"id\": numeric cover ID from work/edition data. For \"isbn\": 10 or 13 digits, hyphens stripped. For \"olid\": edition OLID (OL…M) or author OLID (OL…A) when target is \"author\"."New value: +"The identifier value, validated against id_type before the URL is built. For \"id\": a numeric cover or photo ID from work/edition/author data. For \"isbn\": 10 or 13 digits, hyphens optional. For \"olid\": an edition OLID (OL…M) for target \"book\", an author OLID (OL…A) for target \"author\"."
    • Changedopenlibrary_get_edition23 fields changed
      • changedInput schema / properties / id_type / description
        Previous value: -"Identifier type. \"isbn\" handles both ISBN-10 and ISBN-13. \"olid\" is the native Open Library edition ID (OL…M)."New value: +"Identifier type shared by every entry in identifiers. \"isbn\" handles both ISBN-10 and ISBN-13. \"olid\" is the native Open Library edition ID (OL…M). Mixing types within one call is not supported — issue one call per type."
      • removedInput schema / properties / identifier
        Removed value: -{
        -  "description": "The identifier value. For ISBN: 10 or 13 digits, hyphens stripped. For OCLC: numeric string. For LCCN: string as-is. For OLID: Open Library edition ID (e.g., OL7353617M).",
        -  "type": "string"
        -}
      • addedInput schema / properties / identifiers
        Added value: +{
        +  "description": "Identifiers to resolve, 1–50, all of the type named by id_type. Resolved editions come back in request order.",
        +  "items": {
        +    "description": "One identifier value. For ISBN: 10 or 13 digits, hyphens optional. For OCLC: numeric string. For LCCN: string as-is. For OLID: Open Library edition ID (e.g., OL7353617M).",
        +    "type": "string"
        +  },
        +  "maxItems": 50,
        +  "minItems": 1,
        +  "type": "array"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "identifier",
        -  "id_type"
        -]New value: +[
        +  "identifiers",
        +  "id_type"
        +]
      • removedOutput schema / properties / authors
        Removed value: -{
        -  "description": "Authors credited for this edition. Empty only when neither the edition nor its parent work records an author.",
        -  "items": {
        -    "additionalProperties": false,
        -    "description": "An author contributor for this edition.",
        -    "properties": {
        -      "author_id": {
        -        "description": "Open Library Author ID (OL…A). Use openlibrary_get_author for bio and details.",
        -        "type": "string"
        -      },
        -      "name": {
        -        "description": "Author display name.",
        -        "type": "string"
        -      },
        -      "source": {
        -        "description": "\"edition\" = the attribution is recorded on this edition record. \"work\" = the edition records no authors of its own and this credit comes from the parent work, which covers every edition of the same text.",
        -        "enum": [
        -          "edition",
        -          "work"
        -        ],
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "name",
        -      "source"
        -    ],
        -    "type": "object"
        -  },
        -  "type": "array"
        -}
      • removedOutput schema / properties / cover_ids
        Removed value: -{
        -  "description": "Numeric cover IDs for openlibrary_get_cover_url.",
        -  "items": {
        -    "type": "number"
        -  },
        -  "type": "array"
        -}
      • removedOutput schema / properties / description
        Removed value: -{
        -  "description": "Edition description. Absent when not provided.",
        -  "type": "string"
        -}
      • removedOutput schema / properties / ebook_url
        Removed value: -{
        -  "description": "Internet Archive URL for reading/borrowing. Present when an IA item exists.",
        -  "type": "string"
        -}
      • removedOutput schema / properties / edition_id
        Removed value: -{
        -  "description": "Open Library Edition ID (OL…M).",
        -  "type": "string"
        -}
      • addedOutput schema / properties / editions
        Added value: +{
        +  "description": "Editions that resolved, in request order. Shorter than identifiers when any entry missed.",
        +  "items": {
        +    "additionalProperties": false,
        +    "description": "A resolved edition record.",
        +    "properties": {
        +      "authors": {
        +        "description": "Authors credited for this edition. Empty only when neither the edition nor its parent work records an author.",
        +        "items": {
        +          "additionalProperties": false,
        +          "description": "An author contributor for this edition.",
        +          "properties": {
        +            "author_id": {
        +              "description": "Open Library Author ID (OL…A). Use openlibrary_get_author for bio and details.",
        +              "type": "string"
        +            },
        +            "name": {
        +              "description": "Author display name.",
        +              "type": "string"
        +            },
        +            "source": {
        +              "description": "\"edition\" = the attribution is recorded on this edition record. \"work\" = the edition records no authors of its own and this credit comes from the parent work, which covers every edition of the same text.",
        +              "enum": [
        +                "edition",
        +                "work"
        +              ],
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "name",
        +            "source"
        +          ],
        +          "type": "object"
        +        },
        +        "type": "array"
        +      },
        +      "cover_ids": {
        +        "description": "Numeric cover IDs for openlibrary_get_cover_url.",
        +        "items": {
        +          "type": "number"
        +        },
        +        "type": "array"
        +      },
        +      "description": {
        +        "description": "Edition description. Absent when not provided.",
        +        "type": "string"
        +      },
        +      "ebook_url": {
        +        "description": "Internet Archive URL for reading/borrowing. Present when an IA item exists.",
        +        "type": "string"
        +      },
        +      "edition_id": {
        +        "description": "Open Library Edition ID (OL…M).",
        +        "type": "string"
        +      },
        +      "isbn_10": {
        +        "description": "ISBN-10 identifiers.",
        +        "items": {
        +          "type": "string"
        +        },
        +        "type": "array"
        +      },
        +      "isbn_13": {
        +        "description": "ISBN-13 identifiers.",
        +        "items": {
        +          "type": "string"
        +        },
        +        "type": "array"
        +      },
        +      "language": {
        +        "description": "3-letter ISO language code (e.g., \"eng\"). Absent when not recorded.",
        +        "type": "string"
        +      },
        +      "lc_classifications": {
        +        "description": "Library of Congress call numbers (e.g., \"TL685.7 .M366 2008\") — shelving classifications describing the subject, not identifiers. Not usable as a lookup value anywhere.",
        +        "items": {
        +          "type": "string"
        +        },
        +        "type": "array"
        +      },
        +      "lccn": {
        +        "description": "Library of Congress Control Numbers (e.g., \"2008478952\") — lookupable identifiers; each one resolves this edition back through this tool with id_type \"lccn\".",
        +        "items": {
        +          "type": "string"
        +        },
        +        "type": "array"
        +      },
        +      "oclc": {
        +        "description": "OCLC/WorldCat numbers.",
        +        "items": {
        +          "type": "string"
        +        },
        +        "type": "array"
        +      },
        +      "page_count": {
        +        "description": "Page count. Absent when not recorded.",
        +        "type": "number"
        +      },
        +      "publish_date": {
        +        "description": "Publication date string. Absent when not recorded.",
        +        "type": "string"
        +      },
        +      "publishers": {
        +        "description": "Publisher names.",
        +        "items": {
        +          "type": "string"
        +        },
        +        "type": "array"
        +      },
        +      "title": {
        +        "description": "Edition title.",
        +        "type": "string"
        +      },
        +      "work_id": {
        +        "description": "Parent Work ID (OL…W). Use openlibrary_get_work for work-level metadata.",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "edition_id",
        +      "title",
        +      "authors",
        +      "publishers",
        +      "isbn_10",
        +      "isbn_13",
        +      "oclc",
        +      "lccn",
        +      "lc_classifications",
        +      "cover_ids"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • removedOutput schema / properties / isbn_10
        Removed value: -{
        -  "description": "ISBN-10 identifiers.",
        -  "items": {
        -    "type": "string"
        -  },
        -  "type": "array"
        -}
      • removedOutput schema / properties / isbn_13
        Removed value: -{
        -  "description": "ISBN-13 identifiers.",
        -  "items": {
        -    "type": "string"
        -  },
        -  "type": "array"
        -}
      • removedOutput schema / properties / language
        Removed value: -{
        -  "description": "3-letter ISO language code (e.g., \"eng\"). Absent when not recorded.",
        -  "type": "string"
        -}
      • removedOutput schema / properties / lc_classifications
        Removed value: -{
        -  "description": "Library of Congress call numbers (e.g., \"TL685.7 .M366 2008\") — shelving classifications describing the subject, not identifiers. Not usable as a lookup value anywhere.",
        -  "items": {
        -    "type": "string"
        -  },
        -  "type": "array"
        -}
      • removedOutput schema / properties / lccn
        Removed value: -{
        -  "description": "Library of Congress Control Numbers (e.g., \"2008478952\") — lookupable identifiers; each one resolves this edition back through this tool with id_type \"lccn\".",
        -  "items": {
        -    "type": "string"
        -  },
        -  "type": "array"
        -}
      • removedOutput schema / properties / oclc
        Removed value: -{
        -  "description": "OCLC/WorldCat numbers.",
        -  "items": {
        -    "type": "string"
        -  },
        -  "type": "array"
        -}
      • removedOutput schema / properties / page_count
        Removed value: -{
        -  "description": "Page count. Absent when not recorded.",
        -  "type": "number"
        -}
      • removedOutput schema / properties / publish_date
        Removed value: -{
        -  "description": "Publication date string. Absent when not recorded.",
        -  "type": "string"
        -}
      • removedOutput schema / properties / publishers
        Removed value: -{
        -  "description": "Publisher names.",
        -  "items": {
        -    "type": "string"
        -  },
        -  "type": "array"
        -}
      • removedOutput schema / properties / title
        Removed value: -{
        -  "description": "Edition title.",
        -  "type": "string"
        -}
      • addedOutput schema / properties / unresolved
        Added value: +{
        +  "description": "Identifiers that produced no edition. Empty when every identifier resolved; never overlaps editions.",
        +  "items": {
        +    "additionalProperties": false,
        +    "description": "An identifier that produced no edition.",
        +    "properties": {
        +      "identifier": {
        +        "description": "The identifier as supplied, echoed so it can be matched to the request.",
        +        "type": "string"
        +      },
        +      "reason": {
        +        "description": "\"invalid_identifier\" = the value cannot be this id_type and was never sent upstream. \"not_found\" = well-formed, but Open Library holds no edition under it.",
        +        "enum": [
        +          "not_found",
        +          "invalid_identifier"
        +        ],
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "identifier",
        +      "reason"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • removedOutput schema / properties / work_id
        Removed value: -{
        -  "description": "Parent Work ID (OL…W). Use openlibrary_get_work for work-level metadata.",
        -  "type": "string"
        -}
      • changedOutput schema / required
        Previous value: -[
        -  "edition_id",
        -  "title",
        -  "authors",
        -  "publishers",
        -  "isbn_10",
        -  "isbn_13",
        -  "oclc",
        -  "lccn",
        -  "lc_classifications",
        -  "cover_ids"
        -]New value: +[
        +  "editions",
        +  "unresolved"
        +]
    • Addedopenlibrary_search_inside
  5. 3 tool updates
    • Changedopenlibrary_get_subject1 field changed
      • changedInput schema / properties / subject / description
        Previous value: -"Subject name. Spaces are converted to underscores internally (e.g., \"science fiction\" → \"science_fiction\"). Use lowercase for best results."New value: +"Subject name. Normalized before lookup — lowercased with spaces converted to underscores (e.g., \"Science Fiction\" → \"science_fiction\") — so varying case or spacing does not change the result."
    • Changedopenlibrary_search_authors4 fields changed
      • changedOutput schema / properties / notice / description
        Previous value: -"Recovery guidance when no authors match — echoes the query and suggests alternatives. Absent when results are found."New value: +"Guidance when the page is empty (how to vary a name that matched nothing, or which offset to retry when offset ran past the end) or when the text output capped a per-author list. Absent when neither applies."
      • addedOutput schema / properties / offset
        Added value: +{
        +  "description": "Zero-based offset of the first returned result — echoes the requested offset, so an empty page still records the offset that produced it.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / totalCount / description
        Previous value: -"Total matching authors across all pages. Absent when results are empty."New value: +"Total matching authors across all pages — the upstream match count, reported even when this page is empty because offset ran past the end."
      • changedOutput schema / required
        Previous value: -[
        -  "total",
        -  "authors"
        -]New value: +[
        +  "total",
        +  "offset",
        +  "authors"
        +]
    • Changedopenlibrary_search_books3 fields changed
      • changedOutput schema / properties / notice / description
        Previous value: -"Recovery guidance when results are empty — echoes the search criteria and suggests how to broaden. Absent when results are found."New value: +"Guidance when the page is empty (how to broaden a query that matched nothing, or which offset to retry when offset ran past the end) or when the text output capped a per-work list. Absent when neither applies."
      • changedOutput schema / properties / totalCount / description
        Previous value: -"Total matching works across all pages. Absent when results are empty."New value: +"Total matching works across all pages — the upstream match count, reported even when this page is empty because offset ran past the end."
      • changedOutput schema / properties / works / items / properties / subjects / description
        Previous value: -"Up to 5 subject tags. Absent when no subjects are tagged."New value: +"Every subject tag the search index returned for this work. The text output caps the rendered list; this array is complete. Absent when no subjects are tagged. For the work record's own curated subject lists (places, times, people), use openlibrary_get_work."
  6. 2 tool updates
    • Changedopenlibrary_get_edition6 fields changed
      • changedOutput schema / properties / authors / description
        Previous value: -"Authors of this edition."New value: +"Authors credited for this edition. Empty only when neither the edition nor its parent work records an author."
      • addedOutput schema / properties / authors / items / properties / source
        Added value: +{
        +  "description": "\"edition\" = the attribution is recorded on this edition record. \"work\" = the edition records no authors of its own and this credit comes from the parent work, which covers every edition of the same text.",
        +  "enum": [
        +    "edition",
        +    "work"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / properties / authors / items / required
        Previous value: -[
        -  "name"
        -]New value: +[
        +  "name",
        +  "source"
        +]
      • addedOutput schema / properties / lc_classifications
        Added value: +{
        +  "description": "Library of Congress call numbers (e.g., \"TL685.7 .M366 2008\") — shelving classifications describing the subject, not identifiers. Not usable as a lookup value anywhere.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / properties / lccn / description
        Previous value: -"Library of Congress Control Numbers."New value: +"Library of Congress Control Numbers (e.g., \"2008478952\") — lookupable identifiers; each one resolves this edition back through this tool with id_type \"lccn\"."
      • changedOutput schema / required
        Previous value: -[
        -  "edition_id",
        -  "title",
        -  "authors",
        -  "publishers",
        -  "isbn_10",
        -  "isbn_13",
        -  "oclc",
        -  "lccn",
        -  "cover_ids"
        -]New value: +[
        +  "edition_id",
        +  "title",
        +  "authors",
        +  "publishers",
        +  "isbn_10",
        +  "isbn_13",
        +  "oclc",
        +  "lccn",
        +  "lc_classifications",
        +  "cover_ids"
        +]
    • Changedopenlibrary_search_books4 fields changed
      • changedInput schema / properties / language / description
        Previous value: -"Two-letter ISO 639-1 language code (e.g., \"en\", \"fr\"). Influences but does not exclude results; use language:fr in query to hard-filter."New value: +"Restrict results to one language. Takes a 3-letter MARC code (e.g., \"eng\", \"fre\", \"ger\", \"chi\") — the same vocabulary openlibrary_get_edition and openlibrary_get_editions return. A 2-letter ISO 639-1 code (e.g., \"en\", \"fr\") is accepted and translated to its MARC equivalent; an unrecognized 2-letter code is rejected rather than silently ignored. The equivalent in-query form is language:eng."
      • addedInput schema / properties / language / pattern
        Added value: +"^[A-Za-z]{2,3}$"
      • changedOutput schema / properties / works / items / properties / ebook_access / description
        Previous value: -"\"public\" = freely readable. \"borrowable\" = borrow on Internet Archive. \"printdisabled\" = access for print-disabled users. \"no_ebook\" = no digital version."New value: +"\"public\" = freely readable. \"borrowable\" = borrow on Internet Archive. \"printdisabled\" = access for print-disabled users. \"no_ebook\" = no digital version. \"unclassified\" = a digital copy may exist but its access tier is not recorded."
      • changedOutput schema / properties / works / items / properties / ebook_access / enum
        Previous value: -[
        -  "no_ebook",
        -  "printdisabled",
        -  "borrowable",
        -  "public"
        -]New value: +[
        +  "no_ebook",
        +  "unclassified",
        +  "printdisabled",
        +  "borrowable",
        +  "public"
        +]
  7. 1 tool update
    • Changedopenlibrary_get_work1 field changed
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Disclosure when the text output caps a long list — names the omitted count and points to the complete array in structuredContent. Absent when nothing was capped.",
        +  "type": "string"
        +}
  8. 5 tool updates
    • Changedopenlibrary_get_author_works1 field changed
      • addedOutput schema / properties / totalCount
        Added value: +{
        +  "description": "Total works by this author across all pages.",
        +  "type": "number"
        +}
    • Changedopenlibrary_get_editions1 field changed
      • addedOutput schema / properties / totalCount
        Added value: +{
        +  "description": "Total editions for this work across all pages.",
        +  "type": "number"
        +}
    • Changedopenlibrary_get_subject1 field changed
      • addedOutput schema / properties / totalCount
        Added value: +{
        +  "description": "Total works tagged with this subject across all pages.",
        +  "type": "number"
        +}
    • Changedopenlibrary_search_authors1 field changed
      • addedOutput schema / properties / totalCount
        Added value: +{
        +  "description": "Total matching authors across all pages. Absent when results are empty.",
        +  "type": "number"
        +}
    • Changedopenlibrary_search_books1 field changed
      • addedOutput schema / properties / totalCount
        Added value: +{
        +  "description": "Total matching works across all pages. Absent when results are empty.",
        +  "type": "number"
        +}
  9. 3 tool updates
    • Changedopenlibrary_get_subject2 fields changed
      • removedOutput schema / properties / message
        Removed value: -{
        -  "description": "Recovery hint when work_count is 0 — echoes the subject and suggests alternatives. Absent when works are found.",
        -  "type": "string"
        -}
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Recovery guidance when work_count is 0 — echoes the subject and suggests alternatives. Absent when works are found.",
        +  "type": "string"
        +}
    • Changedopenlibrary_search_authors2 fields changed
      • removedOutput schema / properties / message
        Removed value: -{
        -  "description": "Recovery hint when results are empty. Absent when results are found.",
        -  "type": "string"
        -}
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Recovery guidance when no authors match — echoes the query and suggests alternatives. Absent when results are found.",
        +  "type": "string"
        +}
    • Changedopenlibrary_search_books3 fields changed
      • removedOutput schema / properties / message
        Removed value: -{
        -  "description": "Recovery hint when results are empty — echoes the search criteria and suggests how to broaden. Absent when results are found.",
        -  "type": "string"
        -}
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Recovery guidance when results are empty — echoes the search criteria and suggests how to broaden. Absent when results are found.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / queryEcho
        Added value: +{
        +  "description": "The effective search criteria as the server interpreted them — query string plus any active field filters. Absent when only a bare query is used.",
        +  "type": "string"
        +}

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables searching for books by title, author, or keyword, retrieving edition details by ISBN, and accessing author profiles and canonical work records through the Open Library API.
    18 npm
    MIT
  • F
    license
    Not graded
    quality
    A
    maintenance
    Provides a read-only API over a book catalogue, offering tools to search books, retrieve book details and series, and inspect provenance and source agreement data.
    -
  • A
    license
    Not graded
    quality
    B
    maintenance
    Provides access to BookBrainz open book metadata, enabling search, lookup, and browsing of works, editions, authors, publishers, and series via natural language or direct tool calls.
    167 npm
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables search and reading of Project Gutenberg books with tools for searching by title/author/subject and fetching word-range slices of book text.
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.