MCP server for Project Gutenberg: 78,000+ public-domain ebooks with full plain-text retrieval.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
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 criteria and a notice; truncated results include executable search continuation. Use this for discovery — "what are the most popular classics in French?".
Requested number of books. Default 20; requests above 32 are capped locally at 32.
Filter by a subject or bookshelf keyword (case-insensitive phrase match). Example: "science fiction", "adventure", "detective". Applies on top of the language filter.
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.
Restrict to books in these languages (two-character ISO 639-1 codes). Example: ["en"] for English only, ["de", "fr"] for German or French. Omit for all languages.
Literal prefix of a format MIME key, such as "text/plain" or "text/html". Blank means unset.
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 criteria and a notice; truncated results include executable search continuation. Use this for discovery — "what are the most popular classics in French?".
| Argument | Type | Description |
|---|---|---|
| limit | integer | Requested number of books. Default 20; requests above 32 are capped locally at 32. |
| topic | string | Filter by a subject or bookshelf keyword (case-insensitive phrase match). Example: "science fiction", "adventure", "detective". Applies on top of the language filter. |
| copyright | array | 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. |
| languages | array | Restrict to books in these languages (two-character ISO 639-1 codes). Example: ["en"] for English only, ["de", "fr"] for German or French. Omit for all languages. |
| mime_type | string | Literal prefix of a format MIME key, such as "text/plain" or "text/html". Blank means unset. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"limit": {
"type": "integer",
"default": 20,
"maximum": 9007199254740991,
"minimum": 1,
"description": "Requested number of books. Default 20; requests above 32 are capped locally at 32."
},
"topic": {
"type": "string",
"description": "Filter by a subject or bookshelf keyword (case-insensitive phrase match). Example: \"science fiction\", \"adventure\", \"detective\". Applies on top of the language filter."
},
"copyright": {
"type": "array",
"items": {
"enum": [
"true",
"false",
"null"
],
"type": "string"
},
"description": "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."
},
"languages": {
"type": "array",
"items": {
"type": "string",
"maxLength": 2,
"minLength": 2
},
"description": "Restrict to books in these languages (two-character ISO 639-1 codes). Example: [\"en\"] for English only, [\"de\", \"fr\"] for German or French. Omit for all languages."
},
"mime_type": {
"type": "string",
"description": "Literal prefix of a format MIME key, such as \"text/plain\" or \"text/html\". Blank means unset."
}
},
"additionalProperties": false
}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, cover image, etc.). Use is_readable before gutenberg_get_text; source_notes may identify specific editions.
| Argument | Type | Description |
|---|---|---|
| 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, 2600 for War and Peace. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"id"
],
"properties": {
"id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "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, 2600 for War and Peace.",
"exclusiveMinimum": 0
}
},
"additionalProperties": false
}Retrieve the plain-text content of a Project Gutenberg book, stripped of the standard license header and footer so the response contains only the literary work. For long works — novels routinely run 500KB–2MB — use offset and limit to read in chunks rather than fetching the whole book at once. The response reports totalChars and remainingChars for reliable pagination. Prefers UTF-8 plain text; falls back to an HTML edition converted to text; refuses audio books (media_type "Sound") with a clear error.
| Argument | Type | Description |
|---|---|---|
| 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. |
| limit | integer | Requested maximum characters. Default 20,000 (~4–5 pages of prose); requests above 50,000 are capped locally at 50,000. Paragraph-boundary trimming may return less than the applied limit — use length for continuation. |
| offset | integer | 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 field from the previous response — NOT offset + limit, because the actual returned length may be slightly less than limit due to paragraph-boundary trimming). |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"id"
],
"properties": {
"id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "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.",
"exclusiveMinimum": 0
},
"limit": {
"type": "integer",
"default": 20000,
"maximum": 9007199254740991,
"minimum": 1,
"description": "Requested maximum characters. Default 20,000 (~4–5 pages of prose); requests above 50,000 are capped locally at 50,000. Paragraph-boundary trimming may return less than the applied limit — use length for continuation."
},
"offset": {
"type": "integer",
"default": 0,
"maximum": 9007199254740991,
"minimum": 0,
"description": "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 field from the previous response — NOT offset + limit, because the actual returned length may be slightly less than limit due to paragraph-boundary trimming)."
}
},
"additionalProperties": false
}Search the Project Gutenberg catalog of 78,000+ books. Every query word matches a title or author substring; filter by topic, language, author lifespan, IDs, MIME prefix or copyright status. More than four query words require the local mirror. Empty matches succeed with criteria and a notice. Default popularity uses downloads in the last 30 days at the source snapshot. Returns IDs, titles, authors, languages, subjects, counts, and is_readable — use gutenberg_get_book for full metadata.
| Argument | Type | Description |
|---|---|---|
| ids | array | 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. |
| page | integer | Page number for paginated results (1-indexed). Each page returns up to 32 books. Use totalCount to determine total pages. |
| sort | string | 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. |
| query | string | Every nonblank whitespace-separated word must match title or author name as a case-insensitive literal substring. More than four words require the local mirror; live fallback rejects longer queries. Example: "dickens expectations" matches Great Expectations. |
| topic | string | Case-insensitive phrase to match against subjects and bookshelves. Example: "detective" returns books on the "Detective and Mystery Stories" bookshelf. Separate from query — topic searches categorization metadata, not title/author. |
| copyright | array | 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. |
| languages | array | Filter to books in any of these two-character ISO 639-1 language codes. Example: ["en"] for English, ["fr", "de"] for French or German. |
| mime_type | string | Literal prefix of a format MIME key, such as "text/plain" or "text/html". Blank means unset. |
| author_year_end | integer | Include only books with at least one author alive on or before this year. Example: author_year_start=1800 with author_year_end=1899 returns books with 19th-century authors. |
| author_year_start | integer | Include only books with at least one author alive on or after this year (positive = CE, negative = BCE). Combine with author_year_end for a range. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"ids": {
"type": "array",
"items": {
"type": "integer",
"maximum": 9007199254740991,
"exclusiveMinimum": 0
},
"description": "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."
},
"page": {
"type": "integer",
"default": 1,
"maximum": 9007199254740991,
"description": "Page number for paginated results (1-indexed). Each page returns up to 32 books. Use totalCount to determine total pages.",
"exclusiveMinimum": 0
},
"sort": {
"enum": [
"popular",
"ascending",
"descending"
],
"type": "string",
"default": "popular",
"description": "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."
},
"query": {
"type": "string",
"description": "Every nonblank whitespace-separated word must match title or author name as a case-insensitive literal substring. More than four words require the local mirror; live fallback rejects longer queries. Example: \"dickens expectations\" matches Great Expectations."
},
"topic": {
"type": "string",
"description": "Case-insensitive phrase to match against subjects and bookshelves. Example: \"detective\" returns books on the \"Detective and Mystery Stories\" bookshelf. Separate from query — topic searches categorization metadata, not title/author."
},
"copyright": {
"type": "array",
"items": {
"enum": [
"true",
"false",
"null"
],
"type": "string"
},
"description": "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."
},
"languages": {
"type": "array",
"items": {
"type": "string",
"maxLength": 2,
"minLength": 2
},
"description": "Filter to books in any of these two-character ISO 639-1 language codes. Example: [\"en\"] for English, [\"fr\", \"de\"] for French or German."
},
"mime_type": {
"type": "string",
"description": "Literal prefix of a format MIME key, such as \"text/plain\" or \"text/html\". Blank means unset."
},
"author_year_end": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Include only books with at least one author alive on or before this year. Example: author_year_start=1800 with author_year_end=1899 returns books with 19th-century authors."
},
"author_year_start": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Include only books with at least one author alive on or after this year (positive = CE, negative = BCE). Combine with author_year_end for a range."
}
},
"additionalProperties": false
}