openlibrary-mcp-server
Search books and authors, fetch editions, browse subjects, and resolve cover images.
사용해야 할까요
품질 및 안전성
발견 사항 (3)
- HIGH
- MEDIUMopenlibrary_get_cover_url에서
- INFOopenlibrary_get_cover_url에서
도구 정의와 프로토콜 준수에 대한 자동 분석을 기반으로 합니다.
컨텍스트 비용
이는 서버의 도구가 모델의 컨텍스트에 로드될 때마다 소비되는 대략적인 토큰 수입니다. 수치가 높을수록 다른 작업에 사용할 수 있는 주의가 줄어듭니다.
설치
원클릭 설치
`claude_desktop_config.json` 파일에 다음을 추가하세요:
{
"mcpServers": {
"openlibrary-mcp-server": {
"command": "bun",
"args": [
"@cyanheads/openlibrary-mcp-server"
]
}
}
}실행 가능한 패키지
0.3.0streamable-http원격 엔드포인트
https://openlibrary.caseyjhand.com/mcpstreamable-http할 수 있는 일
도구 목록
도구 (10)
🟢openlibrary_search_books(query, title, author, subject, publisher, ...)
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.
입력 스키마
{
"type": "object",
"properties": {
"query": {
"description": "Full-text search query. Supports Solr field prefixes: title:, author:, subject:, publisher:, isbn:, language:. Omit to use the filter parameters instead.",
"type": "string"
},
"title": {
"description": "Filter by title. Matched against work title and alternative titles.",
"type": "string"
},
"author": {
"description": "Filter by author name. Partial names work.",
"type": "string"
},
"subject": {
"description": "Filter by subject tag (e.g., \"science fiction\", \"history\").",
"type": "string"
},
"publisher": {
"description": "Filter by publisher name. Partial names work (e.g., \"Penguin\").",
"type": "string"
},
"isbn": {
"description": "Find works that have editions with this ISBN (10 or 13 digits, hyphens ignored).",
"type": "string"
},
"language": {
"description": "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.",
"type": "string",
"pattern": "^[A-Za-z]{2,3}$"
},
"sort": {
"default": "relevance",
"description": "Sort order. \"relevance\" uses Solr scoring. \"new\"/\"old\" sort by first publish year. \"rating\" by average community rating. \"editions\" by edition count.",
"type": "string",
"enum": [
"relevance",
"new",
"old",
"rating",
"editions"
]
},
"limit": {
"default": 10,
"description": "Max results to return. Higher values increase response size; prefer 10–20 for exploration.",
"type": "integer",
"minimum": 1,
"maximum": 100
},
"offset": {
"default": 0,
"description": "Zero-based offset for pagination.",
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"include_availability": {
"default": false,
"description": "Include 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.",
"type": "boolean"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}출력 스키마
{
"type": "object",
"properties": {
"total": {
"type": "number",
"description": "Total matching works across all pages."
},
"offset": {
"type": "number",
"description": "Zero-based offset of the first returned result."
},
"works": {
"type": "array",
"items": {
"type": "object",
"properties": {
"work_id": {
"type": "string",
"description": "Open Library Work ID (OL…W). Use for openlibrary_get_work or openlibrary_get_editions."
},
"title": {
"type": "string",
"description": "Work title."
},
"author_names": {
"type": "array",
"items": {
"type": "string"
},
"description": "Author display names."
},
"author_ids": {
"type": "array",
"items": {
"type": "string"
},
"description": "Open Library Author IDs (OL…A) for follow-up lookups."
},
"first_publish_year": {
"description": "Year of first publication. Absent when unknown.",
"type": "number"
},
"edition_count": {
"type": "number",
"description": "Total editions catalogued for this work."
},
"cover_id": {
"description": "Numeric cover ID. Pass to openlibrary_get_cover_url with id_type \"id\". Absent when no cover is available.",
"type": "number"
},
"subjects": {
"description": "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.",
"type": "array",
"items": {
"type": "string"
}
},
"ebook_access": {
"type": "string",
"enum": [
"no_ebook",
"unclassified",
"printdisabled",
"borrowable",
"public"
],
"description": "\"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."
},
"has_fulltext": {
"type": "boolean",
"description": "True when a full-text version exists on Internet Archive."
},
"ratings_average": {
"description": "Average community rating (1–5). Absent when no ratings exist.",
"type": "number"
},
"availability": {
"description": "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.",
"anyOf": [
{
"type": "object",
"properties": {
"status": {
"type": "string",
"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."
},
"available_to_browse": {
"description": "True when the book can be browsed for free. Absent when not reported.",
"type": "boolean"
},
"available_to_borrow": {
"description": "True when the book can be borrowed. Absent when not reported.",
"type": "boolean"
},
"available_to_waitlist": {
"description": "True when a waitlist 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_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_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"
}
},
"required": [
"status"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"ia_identifiers": {
"type": "array",
"items": {
"type": "string"
},
"description": "Internet Archive item identifiers associated with this work."
}
},
"required": [
"work_id",
"title",
"author_names",
"author_ids",
"edition_count",
"ebook_access",
"has_fulltext",
"ia_identifiers"
],
"additionalProperties": false,
"description": "A work-level result from the search."
},
"description": "Matching works, up to limit."
},
"queryEcho": {
"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"
},
"totalCount": {
"description": "Total matching works across all pages — the upstream match count, reported even when this page is empty because offset ran past the end.",
"type": "number"
},
"notice": {
"description": "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.",
"type": "string"
},
"error": {
"description": "Present when the call failed. Absent on success.",
"type": "object",
"properties": {
"code": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "JSON-RPC error code for this failure."
},
"message": {
"type": "string",
"description": "Human-readable description of what went wrong."
},
"data": {
"type": "object",
"properties": {
"reason": {
"type": "string",
"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"
]
},
"recovery": {
"description": "Actionable next step for the caller.",
"type": "object",
"properties": {
"hint": {
"type": "string"
}
},
"required": [
"hint"
],
"additionalProperties": {}
},
"retryable": {
"description": "Whether retrying may succeed.",
"type": "boolean"
}
},
"additionalProperties": {}
}
},
"required": [
"code",
"message"
],
"additionalProperties": {}
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"anyOf": [
{
"not": {
"required": [
"error"
]
},
"required": [
"total",
"offset",
"works"
]
},
{
"required": [
"error"
]
}
]
}🟢openlibrary_search_inside(query, limit, offset)
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.
입력 스키마
{
"type": "object",
"properties": {
"query": {
"type": "string",
"minLength": 1,
"description": "Text 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."
},
"limit": {
"default": 10,
"description": "Max matching items to return. Each carries its own snippets, so higher values grow the response quickly — prefer 10–20.",
"type": "integer",
"minimum": 1,
"maximum": 100
},
"offset": {
"default": 0,
"description": "Zero-based offset for pagination.",
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"query"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}출력 스키마
{
"type": "object",
"properties": {
"total": {
"type": "number",
"description": "Total matching Internet Archive items across all pages."
},
"offset": {
"type": "number",
"description": "Zero-based offset of the first returned match."
},
"matches": {
"type": "array",
"items": {
"type": "object",
"properties": {
"ia_identifier": {
"type": "string",
"description": "Internet Archive item identifier — readable at https://archive.org/details/{ia_identifier}, and the same value openlibrary_search_books returns in ia_identifiers."
},
"title": {
"description": "Item title from Internet Archive metadata. Absent when not recorded.",
"type": "string"
},
"creator": {
"description": "Author or creator from Internet Archive metadata, as catalogued (e.g., \"Burridge, Jay, author\"). Absent when not recorded — genuinely missing on some items, not an error.",
"type": "string"
},
"snippets": {
"type": "array",
"items": {
"type": "string"
},
"description": "Passages containing the match, with the upstream highlight markers removed. The text output caps how many are rendered per item; this array is complete."
},
"score": {
"type": "number",
"description": "Relevance score from the full-text index. Comparable within one result set only."
}
},
"required": [
"ia_identifier",
"snippets",
"score"
],
"additionalProperties": false,
"description": "A book whose scanned text contains the query."
},
"description": "Matching items, up to limit, ordered by relevance."
},
"totalCount": {
"description": "Total matching items across all pages — the upstream match count, reported even when this page is empty because offset ran past the end.",
"type": "number"
},
"notice": {
"description": "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-item snippet list. Absent when neither applies.",
"type": "string"
},
"error": {
"description": "Present when the call failed. Absent on success.",
"type": "object",
"properties": {
"code": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "JSON-RPC error code for this failure."
},
"message": {
"type": "string",
"description": "Human-readable description of what went wrong."
},
"data": {
"type": "object",
"properties": {
"reason": {
"type": "string",
"description": "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.",
"examples": [
"upstream_unavailable"
]
},
"recovery": {
"description": "Actionable next step for the caller.",
"type": "object",
"properties": {
"hint": {
"type": "string"
}
},
"required": [
"hint"
],
"additionalProperties": {}
},
"retryable": {
"description": "Whether retrying may succeed.",
"type": "boolean"
}
},
"additionalProperties": {}
}
},
"required": [
"code",
"message"
],
"additionalProperties": {}
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"anyOf": [
{
"not": {
"required": [
"error"
]
},
"required": [
"total",
"offset",
"matches"
]
},
{
"required": [
"error"
]
}
]
}🟢openlibrary_get_work(work_id)
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.
입력 스키마
{
"type": "object",
"properties": {
"work_id": {
"type": "string",
"pattern": "^(?:\\/works\\/)?OL\\d+W$",
"description": "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\")."
}
},
"required": [
"work_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}출력 스키마
{
"type": "object",
"properties": {
"work_id": {
"type": "string",
"description": "Canonical Open Library Work ID (OL…W) — differs from the requested work_id when that ID was merged into this work."
},
"title": {
"type": "string",
"description": "Work title."
},
"description": {
"description": "Work description or blurb. Absent when not provided.",
"type": "string"
},
"subjects": {
"type": "array",
"items": {
"type": "string"
},
"description": "Subject tags for this work."
},
"subject_places": {
"type": "array",
"items": {
"type": "string"
},
"description": "Geographic subjects."
},
"subject_times": {
"type": "array",
"items": {
"type": "string"
},
"description": "Time period subjects."
},
"subject_people": {
"type": "array",
"items": {
"type": "string"
},
"description": "People subjects."
},
"cover_ids": {
"type": "array",
"items": {
"type": "number"
},
"description": "Numeric cover IDs. Pass to openlibrary_get_cover_url with id_type \"id\"."
},
"author_ids": {
"type": "array",
"items": {
"type": "string"
},
"description": "Open Library Author IDs (OL…A). Use openlibrary_get_author for names and bio."
},
"created": {
"description": "ISO 8601 creation timestamp. Absent when not available.",
"type": "string"
},
"last_modified": {
"description": "ISO 8601 last-modified timestamp. Absent when not available.",
"type": "string"
},
"notice": {
"description": "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.",
"type": "string"
},
"error": {
"description": "Present when the call failed. Absent on success.",
"type": "object",
"properties": {
"code": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "JSON-RPC error code for this failure."
},
"message": {
"type": "string",
"description": "Human-readable description of what went wrong."
},
"data": {
"type": "object",
"properties": {
"reason": {
"type": "string",
"description": "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.",
"examples": [
"not_found"
]
},
"recovery": {
"description": "Actionable next step for the caller.",
"type": "object",
"properties": {
"hint": {
"type": "string"
}
},
"required": [
"hint"
],
"additionalProperties": {}
},
"retryable": {
"description": "Whether retrying may succeed.",
"type": "boolean"
}
},
"additionalProperties": {}
}
},
"required": [
"code",
"message"
],
"additionalProperties": {}
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"anyOf": [
{
"not": {
"required": [
"error"
]
},
"required": [
"work_id",
"title",
"subjects",
"subject_places",
"subject_times",
"subject_people",
"cover_ids",
"author_ids"
]
},
{
"required": [
"error"
]
}
]
}🟢openlibrary_get_editions(work_id, limit, offset)
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.
입력 스키마
{
"type": "object",
"properties": {
"work_id": {
"type": "string",
"pattern": "^(?:\\/works\\/)?OL\\d+W$",
"description": "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\")."
},
"limit": {
"default": 10,
"description": "Max editions to return. Prefer 10–20 for exploration.",
"type": "integer",
"minimum": 1,
"maximum": 100
},
"offset": {
"default": 0,
"description": "Zero-based offset for pagination.",
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"work_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}출력 스키마
{
"type": "object",
"properties": {
"total": {
"type": "number",
"description": "Total editions for this work."
},
"offset": {
"type": "number",
"description": "Zero-based offset of the first returned result — echoes the requested offset, so an empty page still records the offset that produced it."
},
"work_id": {
"type": "string",
"description": "Canonical Open Library Work ID the editions were found under — differs from the requested work_id when that ID was merged into this work."
},
"editions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"edition_id": {
"type": "string",
"description": "Open Library Edition ID (OL…M). Use for openlibrary_get_edition with id_type \"olid\"."
},
"title": {
"type": "string",
"description": "Edition title (may differ from work title for translated editions)."
},
"publish_date": {
"description": "Publication date string (e.g., \"2003\", \"January 2003\"). Absent when not recorded.",
"type": "string"
},
"publishers": {
"type": "array",
"items": {
"type": "string"
},
"description": "Publisher names."
},
"languages": {
"type": "array",
"items": {
"type": "string"
},
"description": "3-letter ISO language codes (e.g., \"eng\", \"fre\")."
},
"isbn_10": {
"type": "array",
"items": {
"type": "string"
},
"description": "ISBN-10 identifiers."
},
"isbn_13": {
"type": "array",
"items": {
"type": "string"
},
"description": "ISBN-13 identifiers."
},
"page_count": {
"description": "Page count. Absent when not recorded.",
"type": "number"
},
"cover_ids": {
"type": "array",
"items": {
"type": "number"
},
"description": "Numeric cover IDs for openlibrary_get_cover_url."
},
"work_id": {
"description": "Parent Work ID. Usually matches the top-level work_id.",
"type": "string"
}
},
"required": [
"edition_id",
"title",
"publishers",
"languages",
"isbn_10",
"isbn_13",
"cover_ids"
],
"additionalProperties": false,
"description": "A single edition of the work."
},
"description": "Editions of the work, up to limit."
},
"totalCount": {
"description": "Total editions for this work across all pages.",
"type": "number"
},
"notice": {
"description": "Set when the requested work ID was merged into a different canonical ID.",
"type": "string"
},
"error": {
"description": "Present when the call failed. Absent on success.",
"type": "object",
"properties": {
"code": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "JSON-RPC error code for this failure."
},
"message": {
"type": "string",
"description": "Human-readable description of what went wrong."
},
"data": {
"type": "object",
"properties": {
"reason": {
"type": "string",
"description": "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.",
"examples": [
"not_found"
]
},
"recovery": {
"description": "Actionable next step for the caller.",
"type": "object",
"properties": {
"hint": {
"type": "string"
}
},
"required": [
"hint"
],
"additionalProperties": {}
},
"retryable": {
"description": "Whether retrying may succeed.",
"type": "boolean"
}
},
"additionalProperties": {}
}
},
"required": [
"code",
"message"
],
"additionalProperties": {}
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"anyOf": [
{
"not": {
"required": [
"error"
]
},
"required": [
"total",
"offset",
"work_id",
"editions"
]
},
{
"required": [
"error"
]
}
]
}🟢openlibrary_get_edition(identifiers, id_type)
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.
입력 스키마
{
"type": "object",
"properties": {
"identifiers": {
"minItems": 1,
"maxItems": 50,
"type": "array",
"items": {
"type": "string",
"description": "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)."
},
"description": "Identifiers to resolve, 1–50, all of the type named by id_type. Resolved editions come back in request order."
},
"id_type": {
"type": "string",
"enum": [
"isbn",
"oclc",
"lccn",
"olid"
],
"description": "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."
}
},
"required": [
"identifiers",
"id_type"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}출력 스키마
{
"type": "object",
"properties": {
"editions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"edition_id": {
"type": "string",
"description": "Open Library Edition ID (OL…M)."
},
"title": {
"type": "string",
"description": "Edition title."
},
"authors": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Author display name."
},
"author_id": {
"description": "Open Library Author ID (OL…A). Use openlibrary_get_author for bio and details.",
"type": "string"
},
"source": {
"type": "string",
"enum": [
"edition",
"work"
],
"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."
}
},
"required": [
"name",
"source"
],
"additionalProperties": false,
"description": "An author contributor for this edition."
},
"description": "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."
},
"publish_date": {
"description": "Publication date string. Absent when not recorded.",
"type": "string"
},
"publishers": {
"type": "array",
"items": {
"type": "string"
},
"description": "Publisher names."
},
"language": {
"description": "3-letter ISO language code (e.g., \"eng\"). Absent when not recorded.",
"type": "string"
},
"isbn_10": {
"type": "array",
"items": {
"type": "string"
},
"description": "ISBN-10 identifiers."
},
"isbn_13": {
"type": "array",
"items": {
"type": "string"
},
"description": "ISBN-13 identifiers."
},
"oclc": {
"type": "array",
"items": {
"type": "string"
},
"description": "OCLC/WorldCat numbers."
},
"lccn": {
"type": "array",
"items": {
"type": "string"
},
"description": "Library of Congress Control Numbers (e.g., \"2008478952\") — lookupable identifiers; each one resolves this edition back through this tool with id_type \"lccn\"."
},
"lc_classifications": {
"type": "array",
"items": {
"type": "string"
},
"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."
},
"page_count": {
"description": "Page count. Absent when not recorded.",
"type": "number"
},
"description": {
"description": "Edition description. Absent when not provided.",
"type": "string"
},
"cover_ids": {
"type": "array",
"items": {
"type": "number"
},
"description": "Numeric cover IDs for openlibrary_get_cover_url."
},
"work_id": {
"description": "Parent Work ID (OL…W). Use openlibrary_get_work for work-level metadata.",
"type": "string"
},
"ebook_url": {
"description": "Internet Archive URL for reading/borrowing. Present when an IA item exists.",
"type": "string"
}
},
"required": [
"edition_id",
"title",
"authors",
"publishers",
"isbn_10",
"isbn_13",
"oclc",
"lccn",
"lc_classifications",
"cover_ids"
],
"additionalProperties": false,
"description": "A resolved edition record."
},
"description": "Editions that resolved, in request order. Shorter than identifiers when any entry missed."
},
"unresolved": {
"type": "array",
"items": {
"type": "object",
"properties": {
"identifier": {
"type": "string",
"description": "The identifier as supplied, echoed so it can be matched to the request."
},
"reason": {
"type": "string",
"enum": [
"not_found",
"invalid_identifier"
],
"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."
}
},
"required": [
"identifier",
"reason"
],
"additionalProperties": false,
"description": "An identifier that produced no edition."
},
"description": "Identifiers that produced no edition. Empty when every identifier resolved; never overlaps editions."
},
"notice": {
"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"
},
"error": {
"description": "Present when the call failed. Absent on success.",
"type": "object",
"properties": {
"code": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "JSON-RPC error code for this failure."
},
"message": {
"type": "string",
"description": "Human-readable description of what went wrong."
},
"data": {
"type": "object",
"properties": {
"reason": {
"type": "string",
"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. `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.",
"examples": [
"not_found",
"invalid_identifier",
"upstream_unavailable"
]
},
"recovery": {
"description": "Actionable next step for the caller.",
"type": "object",
"properties": {
"hint": {
"type": "string"
}
},
"required": [
"hint"
],
"additionalProperties": {}
},
"retryable": {
"description": "Whether retrying may succeed.",
"type": "boolean"
}
},
"additionalProperties": {}
}
},
"required": [
"code",
"message"
],
"additionalProperties": {}
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"anyOf": [
{
"not": {
"required": [
"error"
]
},
"required": [
"editions",
"unresolved"
]
},
{
"required": [
"error"
]
}
]
}🟢openlibrary_search_authors(query, limit, offset)
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).
입력 스키마
{
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "Author name search query. Partial names and alternate names work."
},
"limit": {
"default": 10,
"description": "Max results to return.",
"type": "integer",
"minimum": 1,
"maximum": 100
},
"offset": {
"default": 0,
"description": "Zero-based offset for pagination.",
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"query"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}출력 스키마
{
"type": "object",
"properties": {
"total": {
"type": "number",
"description": "Total matching authors across all pages."
},
"offset": {
"type": "number",
"description": "Zero-based offset of the first returned result — echoes the requested offset, so an empty page still records the offset that produced it."
},
"authors": {
"type": "array",
"items": {
"type": "object",
"properties": {
"author_id": {
"type": "string",
"description": "Open Library Author ID (OL…A)."
},
"name": {
"type": "string",
"description": "Primary author name."
},
"alternate_names": {
"type": "array",
"items": {
"type": "string"
},
"description": "Alternate or transliterated names."
},
"birth_date": {
"description": "Birth date string. Absent when not recorded.",
"type": "string"
},
"death_date": {
"description": "Death date string. Absent when not recorded.",
"type": "string"
},
"top_work": {
"description": "Title of the author's most popular work. Absent when unavailable.",
"type": "string"
},
"work_count": {
"type": "number",
"description": "Number of works catalogued for this author."
},
"top_subjects": {
"type": "array",
"items": {
"type": "string"
},
"description": "Most common subject tags across the author's works."
},
"ratings_average": {
"description": "Average community rating across the author's works. Absent when no ratings exist.",
"type": "number"
}
},
"required": [
"author_id",
"name",
"alternate_names",
"work_count",
"top_subjects"
],
"additionalProperties": false,
"description": "A matching author record."
},
"description": "Matching authors, up to limit."
},
"totalCount": {
"description": "Total matching authors across all pages — the upstream match count, reported even when this page is empty because offset ran past the end.",
"type": "number"
},
"notice": {
"description": "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.",
"type": "string"
},
"error": {
"description": "Present when the call failed. Absent on success.",
"type": "object",
"properties": {
"code": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "JSON-RPC error code for this failure."
},
"message": {
"type": "string",
"description": "Human-readable description of what went wrong."
},
"data": {
"type": "object",
"properties": {
"reason": {
"type": "string",
"description": "Machine-readable failure mode."
},
"recovery": {
"description": "Actionable next step for the caller.",
"type": "object",
"properties": {
"hint": {
"type": "string"
}
},
"required": [
"hint"
],
"additionalProperties": {}
},
"retryable": {
"description": "Whether retrying may succeed.",
"type": "boolean"
}
},
"additionalProperties": {}
}
},
"required": [
"code",
"message"
],
"additionalProperties": {}
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"anyOf": [
{
"not": {
"required": [
"error"
]
},
"required": [
"total",
"offset",
"authors"
]
},
{
"required": [
"error"
]
}
]
}🟢openlibrary_get_author(author_id)
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.
입력 스키마
{
"type": "object",
"properties": {
"author_id": {
"type": "string",
"description": "Open Library Author ID. Format: OL…A (e.g., \"OL24638A\"). A leading \"/authors/\" prefix is stripped if provided."
}
},
"required": [
"author_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}출력 스키마
{
"type": "object",
"properties": {
"author_id": {
"type": "string",
"description": "Canonical Open Library Author ID (OL…A)."
},
"name": {
"type": "string",
"description": "Primary author name."
},
"personal_name": {
"description": "Personal or given name. Absent when not recorded.",
"type": "string"
},
"fuller_name": {
"description": "Full name including middle names. Absent when not recorded.",
"type": "string"
},
"bio": {
"description": "Author biography. Absent when not provided.",
"type": "string"
},
"birth_date": {
"description": "Birth date string. Absent when not recorded.",
"type": "string"
},
"death_date": {
"description": "Death date string. Absent when not recorded.",
"type": "string"
},
"photo_ids": {
"type": "array",
"items": {
"type": "number"
},
"description": "Numeric photo IDs. Pass to openlibrary_get_cover_url with target \"author\" and id_type \"id\"."
},
"remote_ids": {
"type": "object",
"properties": {
"wikidata": {
"description": "Wikidata entity ID (e.g., Q12345).",
"type": "string"
},
"viaf": {
"description": "VIAF identifier.",
"type": "string"
},
"isni": {
"description": "ISNI identifier.",
"type": "string"
},
"goodreads": {
"description": "Goodreads author ID.",
"type": "string"
},
"librarything": {
"description": "LibraryThing author identifier.",
"type": "string"
}
},
"additionalProperties": false,
"description": "Remote identifiers for cross-referencing with other databases."
},
"notice": {
"description": "Set when the requested author ID was merged into a different canonical ID.",
"type": "string"
},
"error": {
"description": "Present when the call failed. Absent on success.",
"type": "object",
"properties": {
"code": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "JSON-RPC error code for this failure."
},
"message": {
"type": "string",
"description": "Human-readable description of what went wrong."
},
"data": {
"type": "object",
"properties": {
"reason": {
"type": "string",
"description": "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.",
"examples": [
"not_found"
]
},
"recovery": {
"description": "Actionable next step for the caller.",
"type": "object",
"properties": {
"hint": {
"type": "string"
}
},
"required": [
"hint"
],
"additionalProperties": {}
},
"retryable": {
"description": "Whether retrying may succeed.",
"type": "boolean"
}
},
"additionalProperties": {}
}
},
"required": [
"code",
"message"
],
"additionalProperties": {}
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"anyOf": [
{
"not": {
"required": [
"error"
]
},
"required": [
"author_id",
"name",
"photo_ids",
"remote_ids"
]
},
{
"required": [
"error"
]
}
]
}🟢openlibrary_get_author_works(author_id, limit, offset)
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.
입력 스키마
{
"type": "object",
"properties": {
"author_id": {
"type": "string",
"description": "Open Library Author ID (OL…A). A leading \"/authors/\" prefix is stripped if provided."
},
"limit": {
"default": 20,
"description": "Max works to return.",
"type": "integer",
"minimum": 1,
"maximum": 100
},
"offset": {
"default": 0,
"description": "Zero-based offset for pagination.",
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"author_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}출력 스키마
{
"type": "object",
"properties": {
"total": {
"type": "number",
"description": "Total works by this author."
},
"offset": {
"type": "number",
"description": "Zero-based offset of the first returned result — echoes the requested offset, so an empty page still records the offset that produced it."
},
"author_id": {
"type": "string",
"description": "Open Library Author ID."
},
"works": {
"type": "array",
"items": {
"type": "object",
"properties": {
"work_id": {
"type": "string",
"description": "Open Library Work ID (OL…W). Use for openlibrary_get_work or openlibrary_get_editions."
},
"title": {
"type": "string",
"description": "Work title."
},
"first_publish_date": {
"description": "First publication date string. Absent when not recorded.",
"type": "string"
},
"cover_ids": {
"type": "array",
"items": {
"type": "number"
},
"description": "Numeric cover IDs for openlibrary_get_cover_url."
}
},
"required": [
"work_id",
"title",
"cover_ids"
],
"additionalProperties": false,
"description": "A work by this author."
},
"description": "Works by this author, up to limit."
},
"totalCount": {
"description": "Total works by this author across all pages.",
"type": "number"
},
"notice": {
"description": "Set when the requested author ID was merged into a different canonical ID.",
"type": "string"
},
"error": {
"description": "Present when the call failed. Absent on success.",
"type": "object",
"properties": {
"code": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "JSON-RPC error code for this failure."
},
"message": {
"type": "string",
"description": "Human-readable description of what went wrong."
},
"data": {
"type": "object",
"properties": {
"reason": {
"type": "string",
"description": "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.",
"examples": [
"not_found"
]
},
"recovery": {
"description": "Actionable next step for the caller.",
"type": "object",
"properties": {
"hint": {
"type": "string"
}
},
"required": [
"hint"
],
"additionalProperties": {}
},
"retryable": {
"description": "Whether retrying may succeed.",
"type": "boolean"
}
},
"additionalProperties": {}
}
},
"required": [
"code",
"message"
],
"additionalProperties": {}
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"anyOf": [
{
"not": {
"required": [
"error"
]
},
"required": [
"total",
"offset",
"author_id",
"works"
]
},
{
"required": [
"error"
]
}
]
}🟢openlibrary_get_subject(subject, limit, offset)
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.
입력 스키마
{
"type": "object",
"properties": {
"subject": {
"type": "string",
"description": "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."
},
"limit": {
"default": 12,
"description": "Max works to return. Subject pages typically show 12 at a time.",
"type": "integer",
"minimum": 1,
"maximum": 100
},
"offset": {
"default": 0,
"description": "Zero-based offset for pagination.",
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"subject"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}출력 스키마
{
"type": "object",
"properties": {
"subject_name": {
"type": "string",
"description": "Canonical subject name as stored on Open Library."
},
"subject_key": {
"type": "string",
"description": "Normalized subject key (lowercase, underscores)."
},
"work_count": {
"type": "number",
"description": "Total works tagged with this subject."
},
"offset": {
"type": "number",
"description": "Zero-based offset of the first returned result — echoes the requested offset, so an empty page still records the offset that produced it."
},
"works": {
"type": "array",
"items": {
"type": "object",
"properties": {
"work_id": {
"type": "string",
"description": "Open Library Work ID (OL…W)."
},
"title": {
"type": "string",
"description": "Work title."
},
"author_names": {
"type": "array",
"items": {
"type": "string"
},
"description": "Author display names."
},
"edition_count": {
"type": "number",
"description": "Total editions for this work."
},
"cover_id": {
"description": "Numeric cover ID. Absent when no cover exists.",
"type": "number"
}
},
"required": [
"work_id",
"title",
"author_names",
"edition_count"
],
"additionalProperties": false,
"description": "A work under this subject."
},
"description": "Works under this subject, up to limit."
},
"totalCount": {
"description": "Total works tagged with this subject across all pages.",
"type": "number"
},
"notice": {
"description": "Recovery guidance when work_count is 0 — echoes the subject and suggests alternatives. Absent when works are found.",
"type": "string"
},
"error": {
"description": "Present when the call failed. Absent on success.",
"type": "object",
"properties": {
"code": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "JSON-RPC error code for this failure."
},
"message": {
"type": "string",
"description": "Human-readable description of what went wrong."
},
"data": {
"type": "object",
"properties": {
"reason": {
"type": "string",
"description": "Machine-readable failure mode."
},
"recovery": {
"description": "Actionable next step for the caller.",
"type": "object",
"properties": {
"hint": {
"type": "string"
}
},
"required": [
"hint"
],
"additionalProperties": {}
},
"retryable": {
"description": "Whether retrying may succeed.",
"type": "boolean"
}
},
"additionalProperties": {}
}
},
"required": [
"code",
"message"
],
"additionalProperties": {}
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"anyOf": [
{
"not": {
"required": [
"error"
]
},
"required": [
"subject_name",
"subject_key",
"work_count",
"offset",
"works"
]
},
{
"required": [
"error"
]
}
]
}🟢openlibrary_get_cover_url(identifier, id_type, target, size)
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 .
입력 스키마
{
"type": "object",
"properties": {
"identifier": {
"type": "string",
"description": "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\"."
},
"id_type": {
"type": "string",
"enum": [
"id",
"isbn",
"olid"
],
"description": "\"id\" is the numeric cover_i / cover ID from search or work results. \"isbn\" and \"olid\" look up the cover from those identifiers."
},
"target": {
"default": "book",
"description": "\"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).",
"type": "string",
"enum": [
"book",
"author"
]
},
"size": {
"default": "M",
"description": "Image size. S = small (~45px tall), M = medium (~150px tall), L = large (~400px tall).",
"type": "string",
"enum": [
"S",
"M",
"L"
]
}
},
"required": [
"identifier",
"id_type"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}출력 스키마
{
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "Direct 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."
},
"note": {
"type": "string",
"description": "Reminder that the URL always returns HTTP 200; a placeholder GIF is served when no cover exists."
},
"error": {
"description": "Present when the call failed. Absent on success.",
"type": "object",
"properties": {
"code": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "JSON-RPC error code for this failure."
},
"message": {
"type": "string",
"description": "Human-readable description of what went wrong."
},
"data": {
"type": "object",
"properties": {
"reason": {
"type": "string",
"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"
]
},
"recovery": {
"description": "Actionable next step for the caller.",
"type": "object",
"properties": {
"hint": {
"type": "string"
}
},
"required": [
"hint"
],
"additionalProperties": {}
},
"retryable": {
"description": "Whether retrying may succeed.",
"type": "boolean"
}
},
"additionalProperties": {}
}
},
"required": [
"code",
"message"
],
"additionalProperties": {}
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"anyOf": [
{
"not": {
"required": [
"error"
]
},
"required": [
"url",
"note"
]
},
{
"required": [
"error"
]
}
]
}커뮤니티
증거