io.github.cyanheads/openlibrary-mcp-server
REMOTE · OPENLIBRARY.CASEYJHAND.COM · 2 COMPONENTS · SCANNED AUG 3
Search books and authors, fetch editions, browse subjects, and resolve cover images.
Available components
How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score →
Endpoint Security66
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- Authorisation not fully verified: no authorisation is required to call this server, and 10 tool(s) never declared a destructiveHint. The MCP spec treats an absent hint as destructive by default, so we cannot call this surface safe. See how to fix → View diagnostics → Unverified
- HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
- The HSTS (Strict-Transport-Security) header is present. View diagnostics → Pass
- DNSSEC is configured correctly; the domain's records validate against the full chain to the root. View diagnostics → Pass
Transport & Reachability100
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
Schema Quality & AI Usability64
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 2276 tokens (~227/item across 10 items; 10 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management27
- Stability observed for 8 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
- Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Add this component to your MCP client. Where a client-specific snippet is available, pick your client below and copy it straight into your config; otherwise use the connection detail shown.
remote · openlibrary.caseyjhand.com
claude mcp add --transport http cyanheads-openlibrary-mcp-server https://openlibrary.caseyjhand.com/mcp
[mcp_servers.cyanheads-openlibrary-mcp-server] url = "https://openlibrary.caseyjhand.com/mcp"
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"cyanheads-openlibrary-mcp-server": {
"type": "remote",
"url": "https://openlibrary.caseyjhand.com/mcp",
"enabled": true
}
}
} openclaw mcp add cyanheads-openlibrary-mcp-server --url https://openlibrary.caseyjhand.com/mcp --transport streamable-http
mcp_servers:
cyanheads-openlibrary-mcp-server:
url: "https://openlibrary.caseyjhand.com/mcp" {
"mcpServers": {
"cyanheads-openlibrary-mcp-server": {
"type": "http",
"url": "https://openlibrary.caseyjhand.com/mcp"
}
}
} The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 2 Aug 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 20 to 23. That category is still filling its 30-day observation window: 6 days of observed history at the previous scan, 7 at this one. The score rises as the window fills, whether or not the server changes.
- 1 Aug 26 +2
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 30 Jul 26 0
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 29 Jul 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 7 to 10. That category is still filling its 30-day observation window: 2 days of observed history at the previous scan, 3 at this one. The score rises as the window fills, whether or not the server changes.
- 28 Jul 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 3 to 7. That category is still filling its 30-day observation window: 1 days of observed history at the previous scan, 2 at this one. The score rises as the window fills, whether or not the server changes.
- 27 Jul 26 0
- Stability: unverified → 0.03 ▲ functional
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 26 Jul 26 63
First indexed and scored.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 3 Aug 2026 · Probed https://openlibrary.caseyjhand.com/mcp
TLS valid
Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .
| Subject | Issuer | Valid from | Valid until | Key | Signature | Serial |
|---|---|---|---|---|---|---|
| CN=caseyjhand.com | CN=WE1,O=Google Trust Services,C=US | 7 Jul 2026 | 5 Oct 2026 | ECDSA 256 | ECDSA-SHA256 | 5aad900eb2055a0b0ea55912ec19680c |
| SANs: caseyjhand.com, *.caseyjhand.com | ||||||
| CN=WE1,O=Google Trust Services,C=US (CA) | CN=GTS Root R4,O=Google Trust Services LLC,C=US | 13 Dec 2023 | 20 Feb 2029 | ECDSA 256 | ECDSA-SHA384 | 7ff31977972c224a76155d13b6d685e3 |
| CN=GTS Root R4,O=Google Trust Services LLC,C=US (CA) | CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE | 15 Nov 2023 | 28 Jan 2028 | ECDSA 384 | SHA256-RSA | 7fe530bf331343bedd821610493d8a1b |
DNSSEC secure
Validation of openlibrary.caseyjhand.com. — Secure
| Zone | DS | Keys | Algorithms | Outcome |
|---|---|---|---|---|
| . | trust_anchor | 20326, 38696 | 8, 8 | Verified |
| com. | present | 19718 | 13 | Verified |
| caseyjhand.com. | present | 2371 | 13 | Verified |
| openlibrary.caseyjhand.com. | Verified address RRset verified with the apex keys |
Authentication No authorisation required
The endpoint answered without asking for a token. Anyone who knows the URL can reach it.
| Result | No authorisation required |
|---|---|
| HTTP status | 200 |
| Header | Value |
|---|---|
| strict-transport-security | max-age=63072000; includeSubDomains; preload |
| x-content-type-options | nosniff |
Transports 2 probes
| Transport | URL | Outcome | Status | Location |
|---|---|---|---|---|
| streamable-http | https://openlibrary.caseyjhand.com/mcp | Verified | 200 | |
| http (plaintext) | http://openlibrary.caseyjhand.com/mcp | HTTPS enforced | 301 | https://openlibrary.caseyjhand.com/mcp |
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability.
openlibrary_get_author Get Author ~104
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.
| Name | Type | Req | Description |
|---|---|---|---|
| author_id | string | yes | Open Library Author ID. Format: OL…A (e.g., "OL24638A"). A leading "/authors/" prefix is stripped if provided. |
| Name | Type | Req | Description |
|---|---|---|---|
| author_id | string | yes | Canonical Open Library Author ID (OL…A). |
| bio | string | — | Author biography. Absent when not provided. |
| birth_date | string | — | Birth date string. Absent when not recorded. |
| death_date | string | — | Death date string. Absent when not recorded. |
| fuller_name | string | — | Full name including middle names. Absent when not recorded. |
| name | string | yes | Primary author name. |
| notice | string | — | Set when the requested author ID was merged into a different canonical ID. |
| personal_name | string | — | Personal or given name. Absent when not recorded. |
| photo_ids | array | yes | Numeric photo IDs. Pass to openlibrary_get_cover_url with target "author" and id_type "id". |
| remote_ids | object | yes | Remote identifiers for cross-referencing with other databases. |
No examples provided.
openlibrary_get_author_works Get Author Works ~108
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.
| Name | Type | Req | Description |
|---|---|---|---|
| author_id | string | yes | Open Library Author ID (OL…A). A leading "/authors/" prefix is stripped if provided. |
| limit | integer | — | Max works to return. |
| offset | integer | — | Zero-based offset for pagination. |
| Name | Type | Req | Description |
|---|---|---|---|
| author_id | string | yes | Open Library Author ID. |
| notice | string | — | Set when the requested author ID was merged into a different canonical ID. |
| total | number | yes | Total works by this author. |
| totalCount | number | — | Total works by this author across all pages. |
| works | array | yes | Works by this author, up to limit. |
No examples provided.
openlibrary_get_cover_url Get Cover URL ~369
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, "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 .
| Name | Type | Req | Description |
|---|---|---|---|
| id_type | string | yes | "id" is the numeric cover_i / cover ID from search or work results. "isbn" and "olid" look up the cover from those identifiers. |
| identifier | string | yes | 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"… |
| size | string | — | Image size. S = small (~45px tall), M = medium (~150px tall), L = large (~400px tall). |
| target | string | — | "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). |
| Name | Type | Req | Description |
|---|---|---|---|
| note | string | yes | Reminder that the URL always returns HTTP 200; a placeholder GIF is served when no cover exists. |
| url | string | yes | 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. |
No examples provided.
openlibrary_get_edition Get Edition ~289
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. 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.
| Name | Type | Req | Description |
|---|---|---|---|
| id_type | string | yes | 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 — iss… |
| identifiers | array | yes | Identifiers to resolve, 1–50, all of the type named by id_type. Resolved editions come back in request order. |
| Name | Type | Req | Description |
|---|---|---|---|
| editions | array | yes | Editions that resolved, in request order. Shorter than identifiers when any entry missed. |
| unresolved | array | yes | Identifiers that produced no edition. Empty when every identifier resolved; never overlaps editions. |
No examples provided.
openlibrary_get_editions Get Editions ~119
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.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | — | Max editions to return. Prefer 10–20 for exploration. |
| offset | integer | — | Zero-based offset for pagination. |
| work_id | string | yes | Open Library Work ID (OL…W). A leading "/works/" prefix is stripped if provided. |
| Name | Type | Req | Description |
|---|---|---|---|
| editions | array | yes | Editions of the work, up to limit. |
| total | number | yes | Total editions for this work. |
| totalCount | number | — | Total editions for this work across all pages. |
| work_id | string | yes | Open Library Work ID. |
No examples provided.
openlibrary_get_subject Get Subject ~176
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.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | — | Max works to return. Subject pages typically show 12 at a time. |
| offset | integer | — | Zero-based offset for pagination. |
| subject | string | yes | 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. |
| Name | Type | Req | Description |
|---|---|---|---|
| notice | string | — | Recovery guidance when work_count is 0 — echoes the subject and suggests alternatives. Absent when works are found. |
| subject_key | string | yes | Normalized subject key (lowercase, underscores). |
| subject_name | string | yes | Canonical subject name as stored on Open Library. |
| totalCount | number | — | Total works tagged with this subject across all pages. |
| work_count | number | yes | Total works tagged with this subject. |
| works | array | yes | Works under this subject, up to limit. |
No examples provided.
openlibrary_get_work Get Work ~114
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. Note: author names are not included — use openlibrary_get_author or openlibrary_search_books for names.
| Name | Type | Req | Description |
|---|---|---|---|
| work_id | string | yes | Open Library Work ID. Format: OL…W (e.g., "OL45804W"). A leading "/works/" prefix is stripped if provided. |
| Name | Type | Req | Description |
|---|---|---|---|
| author_ids | array | yes | Open Library Author IDs (OL…A). Use openlibrary_get_author for names and bio. |
| cover_ids | array | yes | Numeric cover IDs. Pass to openlibrary_get_cover_url with id_type "id". |
| created | string | — | ISO 8601 creation timestamp. Absent when not available. |
| description | string | — | Work description or blurb. Absent when not provided. |
| last_modified | string | — | ISO 8601 last-modified timestamp. Absent when not available. |
| notice | string | — | 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. |
| subject_people | array | yes | People subjects. |
| subject_places | array | yes | Geographic subjects. |
| subject_times | array | yes | Time period subjects. |
| subjects | array | yes | Subject tags for this work. |
| title | string | yes | Work title. |
| work_id | string | yes | Canonical Open Library Work ID (OL…W). |
No examples provided.
openlibrary_search_authors Search Authors ~105
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).
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | — | Max results to return. |
| offset | integer | — | Zero-based offset for pagination. |
| query | string | yes | Author name search query. Partial names and alternate names work. |
| Name | Type | Req | Description |
|---|---|---|---|
| authors | array | yes | Matching authors, up to limit. |
| notice | string | — | 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… |
| offset | number | yes | Zero-based offset of the first returned result — echoes the requested offset, so an empty page still records the offset that produced it. |
| total | number | yes | Total matching authors across all pages. |
| totalCount | number | — | Total matching authors across all pages — the upstream match count, reported even when this page is empty because offset ran past the end. |
No examples provided.
openlibrary_search_books Search Books ~450
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.
| Name | Type | Req | Description |
|---|---|---|---|
| author | string | — | Filter by author name. Partial names work. |
| include_availability | boolean | — | 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. |
| isbn | string | — | Find works that have editions with this ISBN (10 or 13 digits, hyphens ignored). |
| language | string | — | 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… |
| limit | integer | — | Max results to return. Higher values increase response size; prefer 10–20 for exploration. |
| offset | integer | — | Zero-based offset for pagination. |
| publisher | string | — | Filter by publisher name. Partial names work (e.g., "Penguin"). |
| query | string | — | Full-text search query. Supports Solr field prefixes: title:, author:, subject:, publisher:, isbn:, language:. Omit to use the filter parameters instead. |
| sort | string | — | Sort order. "relevance" uses Solr scoring. "new"/"old" sort by first publish year. "rating" by average community rating. "editions" by edition count. |
| subject | string | — | Filter by subject tag (e.g., "science fiction", "history"). |
| title | string | — | Filter by title. Matched against work title and alternative titles. |
| Name | Type | Req | Description |
|---|---|---|---|
| notice | string | — | 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 neithe… |
| offset | number | yes | Zero-based offset of the first returned result. |
| queryEcho | string | — | The effective search criteria as the server interpreted them — query string plus any active field filters. Absent when only a bare query is used. |
| total | number | yes | Total matching works across all pages. |
| totalCount | number | — | Total matching works across all pages — the upstream match count, reported even when this page is empty because offset ran past the end. |
| works | array | yes | Matching works, up to limit. |
No examples provided.
openlibrary_search_inside Search Inside Books ~255
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 an order of magnitude slower than the metadata endpoints (seconds, not milliseconds), so reach for it when the passage is the question, not as a general book search — use openlibrary_search_books for 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.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | — | Max matching items to return. Each carries its own snippets, so higher values grow the response quickly — prefer 10–20. |
| offset | integer | — | Zero-based offset for pagination. |
| query | string | yes | 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. |
| Name | Type | Req | Description |
|---|---|---|---|
| matches | array | yes | Matching items, up to limit, ordered by relevance. |
| notice | string | — | 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 whe… |
| offset | number | yes | Zero-based offset of the first returned match. |
| total | number | yes | Total matching Internet Archive items across all pages. |
| totalCount | number | — | Total matching items across all pages — the upstream match count, reported even when this page is empty because offset ran past the end. |
No examples provided.