gutenberg-mcp-server

v0.1.3 pre-1.0

MCP server for Project Gutenberg — 75,000+ public-domain ebooks, searchable with full plain-text retrieval.

gutenberg.caseyjhand.com/mcp
claude mcp add --transport http gutenberg-mcp-server https://gutenberg.caseyjhand.com/mcp
codex mcp add gutenberg-mcp-server --url https://gutenberg.caseyjhand.com/mcp
{
  "mcpServers": {
    "gutenberg-mcp-server": {
      "url": "https://gutenberg.caseyjhand.com/mcp"
    }
  }
}
gemini mcp add --transport http gutenberg-mcp-server https://gutenberg.caseyjhand.com/mcp
{
  "mcpServers": {
    "gutenberg-mcp-server": {
      "command": "bunx",
      "args": [
        "mcp-remote",
        "https://gutenberg.caseyjhand.com/mcp"
      ]
    }
  }
}
{
  "mcpServers": {
    "gutenberg-mcp-server": {
      "type": "http",
      "url": "https://gutenberg.caseyjhand.com/mcp"
    }
  }
}
curl -X POST https://gutenberg.caseyjhand.com/mcp \
  -H "Content-Type: application/json" \
  -H "MCP-Protocol-Version: 2025-11-25" \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-11-25","capabilities":{},"clientInfo":{"name":"curl","version":"1.0.0"}}}'

Tools

4

gutenberg_search_books

open-world

Search the Project Gutenberg catalog of 78,000+ public-domain books. Matches title and author name with query words; filters by topic (subject or bookshelf keyword), language, author lifespan, or a specific list of Gutenberg IDs. Results are ordered by popularity (download count) by default. Returns book ID, title, authors, languages, subjects, and download count — use gutenberg_get_book for the full formats map before fetching text.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "gutenberg_search_books",
    "arguments": {}
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "query": {
      "description": "Words to match against book titles and author names (case-insensitive, space-separated). Example: \"dickens expectations\" matches Great Expectations by Charles Dickens.",
      "type": "string"
    },
    "topic": {
      "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.",
      "type": "string"
    },
    "languages": {
      "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.",
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 2,
        "maxLength": 2
      }
    },
    "author_year_start": {
      "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.",
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    },
    "author_year_end": {
      "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.",
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    },
    "sort": {
      "default": "popular",
      "description": "Result ordering. \"popular\" (default) sorts by download count descending. \"ascending\" and \"descending\" sort by Gutenberg ID number.",
      "type": "string",
      "enum": [
        "popular",
        "ascending",
        "descending"
      ]
    },
    "ids": {
      "description": "Narrow results to specific Gutenberg ID numbers. Other filters still apply. Useful for batch pre-fetching known IDs; use gutenberg_get_book for single-ID lookups.",
      "type": "array",
      "items": {
        "type": "integer",
        "exclusiveMinimum": 0,
        "maximum": 9007199254740991
      }
    },
    "page": {
      "default": 1,
      "description": "Page number for paginated results (1-indexed). Each page returns up to 32 books. Use totalCount to determine total pages.",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    }
  },
  "required": [
    "sort",
    "page"
  ],
  "additionalProperties": false
}
view source ↗

gutenberg_get_book

open-world

Fetch complete metadata for a Project Gutenberg book by ID — title, authors (with birth/death years), translators, editors, subjects, bookshelves, languages, copyright status, and the full formats map with download URLs for each available format (plain text, HTML, EPUB, cover image, etc.). Use this before gutenberg_get_text to confirm a plain-text format is available and to get the direct download URL.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "gutenberg_get_book",
    "arguments": {
      "id": "<id>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "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."
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": false
}
view source ↗

gutenberg_get_text

open-world

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 so the caller can page through without guessing. Prefers UTF-8 plain text; falls back to ASCII plain text; refuses audio books (media_type "Sound") with a clear error.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "gutenberg_get_text",
    "arguments": {
      "id": "<id>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "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."
    },
    "offset": {
      "default": 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).",
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "limit": {
      "default": 20000,
      "description": "Maximum number of characters to return in this chunk. Default 20,000 (~4–5 pages of prose). Increase toward 50,000 for large context windows. The actual returned length may be slightly less than limit when a natural paragraph boundary is found within 500 characters of the limit — check the length field in the response for the actual character count returned.",
      "type": "integer",
      "minimum": 1,
      "maximum": 50000
    }
  },
  "required": [
    "id",
    "offset",
    "limit"
  ],
  "additionalProperties": false
}
view source ↗