cyanheads avatar

Gutenberg Mcp Server

cyanheads/gutenberg-mcp-server

Connects Claude to Project Gutenberg's 75,000+ public domain books through a clean four-tool interface: search by title, author, topic, or language; fetch full metadata including format maps and contributor details; retrieve plain text with offset/limit chunking for context management; and browse by popularity. Built on the Gutendex JSON API with direct plain-text retrieval from Gutenberg's file servers. No API key required. The chunking support is the standout feature here since classic novels routinely hit 500KB to 2MB and you need to read them in manageable pieces. Each response includes provenance data and precise pagination fields so you can walk through long works reliably. Strips license boilerplate automatically and falls back through UTF-8, ASCII, then HTML conversion as needed.

GitHub stars
6
tools
4
transport
STDIO, HTTP
env vars
10
last updated
Nov 11, 2026

Install

From registry metadata
$ npx add-mcp https://gutenberg.caseyjhand.com/mcp --name gutenberg

Run in your terminal. add-mcp asks which agents to add it to (Claude Code, Codex, Cursor and more). Add -g to install it for every project.

Review the command, arguments and environment values before installing. MCP servers run with your local permissions.

Other ways

Claude Code

$ claude mcp add --transport http gutenberg https://gutenberg.caseyjhand.com/mcp

Run in your terminal. Add --scope user to make it available in every project.

Tools

Verified live · 4 tools

Verified live against the running server on Nov 6, 2026.

gutenberg_search_booksSearch the Project Gutenberg catalog of 78,000+ books. Every query word matches a title or author substring; filter by topic, language, translator, author lifespan, IDs, MIME prefix or copyright status. More than four query words, and the translator filter, require the local m...11 params

Search the Project Gutenberg catalog of 78,000+ books. Every query word matches a title or author substring; filter by topic, language, translator, author lifespan, IDs, MIME prefix or copyright status. More than four query words, and the translator filter, require the local m...

Parameters* required
author_year_endinteger
Include only books with an author who has a known birth or death year on or before this year. With author_year_start, one author must meet both bounds. Example: author_year_start=1800 with author_y...
author_year_startinteger
Include only books with an author who has a known birth or death year on or after this year (positive = CE, negative = BCE). With author_year_end, one author must meet both bounds.
copyrightarray
Any selected source copyright status: "true" copyrighted, "false" public domain in the USA, "null" unknown. Empty means all statuses; this is not worldwide legal clearance.
idsarray
Narrow results to these Gutenberg IDs, intersected with other filters. An empty list selects nothing; omit for unrestricted IDs. Use gutenberg_get_book for full single-ID metadata.
languagesarray
Filter to books in any of these catalog language codes, exactly as results report them ("en", not "eng"). Example: ["en"] for English, ["fr", "de"] for French or German, ["enm"] for Middle English.
mime_typestring
Literal prefix of a format MIME key, such as "text/plain" or "application/pdf". Type and subtype casing is normalized; parameter suffixes retain literal case. Blank means unset.
pageinteger
Page number for paginated results (1-indexed). Each page returns up to 32 books. Use totalCount to determine total pages.default: 1
querystring
Every nonblank whitespace-separated word must match title or author name as a literal substring. The local mirror ignores case and accents; live fallback may require accents and rejects more than f...
sortstring
Result ordering. "popular" (default) sorts by downloads in the last 30 days at the source snapshot, descending. "ascending" and "descending" sort by Gutenberg ID number.one of popular · ascending · descendingdefault: popular
topicstring
Phrase to match against subjects and bookshelves, ignoring case and, on the local mirror, accents. Example: "detective" matches the "Detective Fiction" bookshelf and "Detective and mystery stories"...
translatorstring
Every nonblank whitespace-separated word must match a translator name as a literal substring, ignoring case and accents; words can land on different translators of one book. Requires the local mirr...
gutenberg_get_bookFetch complete metadata for a Project Gutenberg book by ID — title, authors (with birth/death years), translators, editors, source bibliographic notes, subjects, bookshelves, languages, copyright status, and the full formats map with download URLs (plain text, HTML, EPUB, cove...1 params

Fetch complete metadata for a Project Gutenberg book by ID — title, authors (with birth/death years), translators, editors, source bibliographic notes, subjects, bookshelves, languages, copyright status, and the full formats map with download URLs (plain text, HTML, EPUB, cove...

Parameters* required
id*integer
Project Gutenberg book ID. Visible in Gutenberg URLs (e.g., gutenberg.org/ebooks/1342) and returned by gutenberg_search_books and gutenberg_browse_popular. Example: 1342 for Pride and Prejudice, 26...
gutenberg_get_textRetrieve the plain-text content of a Project Gutenberg book, stripped of the standard license header and footer. Front matter such as producer credits, the title page, contents, and prefaces stays in the text. For long works — novels routinely run 500KB–2MB — use offset and li...4 params

Retrieve the plain-text content of a Project Gutenberg book, stripped of the standard license header and footer. Front matter such as producer credits, the title page, contents, and prefaces stays in the text. For long works — novels routinely run 500KB–2MB — use offset and li...

Parameters* required
findstring
A passage to locate instead of paging to it: the response starts at the first occurrence at or after offset and adds match, and an absent passage fails with passage_not_found rather than returning...
id*integer
Project Gutenberg book ID. Use gutenberg_search_books or gutenberg_get_book to find IDs. Example: 1342 for Pride and Prejudice, 2600 for War and Peace, 84 for Frankenstein.
limitinteger
Requested maximum characters. Default 20,000; requests above 50,000 are capped locally at 50,000. Paragraph-boundary trimming may return less than the applied limit — use length for continuation. T...default: 20000
offsetinteger
Character offset into the stripped literary text at which to start reading. 0 returns the beginning of the work. To read subsequent chunks, use offset = prior_offset + prior_length (the length fiel...default: 0
gutenberg_browse_popularBrowse Project Gutenberg books ordered by downloads in the last 30 days at the source snapshot. Returns up to 32 titles with IDs, authors, languages, download counts, and is_readable. Filter by language, topic, MIME prefix or copyright status. Empty matches succeed with criter...5 params

Browse Project Gutenberg books ordered by downloads in the last 30 days at the source snapshot. Returns up to 32 titles with IDs, authors, languages, download counts, and is_readable. Filter by language, topic, MIME prefix or copyright status. Empty matches succeed with criter...

Parameters* required
copyrightarray
Any selected source copyright status: "true" copyrighted, "false" public domain in the USA, "null" unknown. Empty means all statuses; this is not worldwide legal clearance.
languagesarray
Restrict to books in these catalog language codes, exactly as results report them ("en", not "eng"). Example: ["en"] for English only, ["de", "fr"] for German or French, ["ang"] for Old English. Om...
limitinteger
Requested number of books. Default 20; requests above 32 are capped locally at 32.default: 20
mime_typestring
Literal prefix of a format MIME key, such as "text/plain" or "application/pdf". Type and subtype casing is normalized; parameter suffixes retain literal case. Blank means unset.
topicstring
Filter by a subject or bookshelf keyword (case-insensitive phrase match). Example: "science fiction", "adventure", "detective". Applies on top of the language filter.

Sponsors

Configuration

MCP_LOG_LEVELdefault: info

Sets the minimum log level for output (e.g., 'debug', 'info', 'warn').

GUTENDEX_BASE_URLdefault: https://gutendex.com/books/

Gutendex catalog API base URL, used for search and popularity browse when the local catalog mirror cannot answer. Leave blank for the public instance.

GUTENBERG_TEXT_BASE_URLdefault: https://gutenberg.pglaf.org

Project Gutenberg content mirror serving the /cache/epub tree: book text, the bulk catalog archive, and per-book catalog records. Leave blank for gutenberg.pglaf.org.

GUTENBERG_MIRROR_PATH

Path to the local catalog-mirror SQLite file. Leave blank to use the per-user default that gutenberg-mcp-server mirror init builds.

GUTENBERG_MIRROR_REFRESH_CRON

Cron schedule for an in-process catalog-mirror refresh, e.g. 0 4 * * *; on an empty mirror the first run is the full harvest. Leave blank to disable.

MCP_TRANSPORT_TYPEdefault: http

Selects the HTTP transport.

MCP_HTTP_HOSTdefault: 127.0.0.1

The hostname for the HTTP server.

MCP_HTTP_PORTdefault: 3010

The port to run the HTTP server on.

MCP_HTTP_ENDPOINT_PATHdefault: /mcp

The endpoint path for the MCP server.

MCP_AUTH_MODEdefault: none

Authentication mode to use: 'none', 'jwt', or 'oauth'.

Readme

@cyanheads/gutenberg-mcp-server

Search, browse, and read 78,000+ public-domain books from Project Gutenberg with full plain-text retrieval and offset/limit chunking via MCP. STDIO or Streamable HTTP.

4 Tools

Details

Repository
github.com/cyanheads/gutenberg-mcp-server
Package
@cyanheads/gutenberg-mcp-server
Transport
STDIO, HTTP
Registry
MCP registry, active
Resources
1
Tools verified
Nov 6, 2026

More from cyanheads