MCP Hub
Back to servers

kiwix-mcp

An MCP server that enables interaction with Kiwix HTTP servers to browse, search, and retrieve content from offline ZIM books like Wikipedia. It provides tools for listing available library resources and fetching full-text articles as plain text.

glama
Updated
Mar 8, 2026

kiwix-mcp

Status: Active Run Unit Tests

MCP server and Python client library for Kiwix HTTP servers.

Compatibility

Tested against kiwix-tools (Debian bookworm package) and newer libkiwix-based deployments. Any standard kiwix-serve deployment should work.

Known quirks handled transparently:

  • kiwix-serve emits unescaped & in OPDS catalog href attributes
  • Newer servers require a book scope when the library spans multiple languages — the client returns a clear error with instructions in that case
  • Newer servers use a path-prefixed URL scheme (e.g. /kiwix/content/book_slug) — slug and article URL handling adapts automatically

Tools

ToolDescription
kiwix_list_booksList available ZIM books; optional title filter
kiwix_searchFull-text search across all books or a specific book
kiwix_fetch_articleFetch an article as plain text by URL

Installation

pip install kiwix-mcp

Or with uv:

uv pip install kiwix-mcp

Usage

stdio (Claude Desktop / Claude Code)

kiwix-mcp --base-url http://localhost:8080
# or
KIWIX_BASE_URL=http://localhost:8080 kiwix-mcp

Claude Desktop config (~/Library/Application Support/Claude/claude_desktop_config.json):

{
  "mcpServers": {
    "kiwix": {
      "command": "kiwix-mcp",
      "args": ["--base-url", "http://localhost:8080"]
    }
  }
}

Claude Code — add at user scope so it's available in all projects:

claude mcp add --scope user kiwix --transport sse http://localhost:7474/sse

SSE

kiwix-mcp --transport sse --base-url http://localhost:8080

Then point your MCP client at http://localhost:8080/sse.

HTTP (streamable)

kiwix-mcp --transport streamable-http --base-url http://localhost:8080

Options

FlagDefaultEnv
--base-urlKIWIX_BASE_URL
--transportstdio

Client library

from kiwix_client import KiwixClient, strip_html

c = KiwixClient("http://localhost:8080")

# List all books
books = c.list_books()

# Filter by title keyword
books = c.list_books(q="wikipedia")

# Search
sr = c.search("query")

# Search within a specific book
sr = c.search("query", books="devdocs_en_rust_2025-10")

# Fetch article as plain text
html = c.fetch_article(sr.results[0].url)
plain = strip_html(html)

How the Kiwix API works

kiwix-serve exposes three HTTP surfaces used by this client:

  • OPDS catalog (/catalog/v2/entries) — Atom XML with book metadata and slugs; supports ?q=, ?count=, ?start= params
  • Full-text search (/search?pattern=…&books.name=…&start=…) — HTML; 25 results/page; books.name= scopes to a specific ZIM slug
  • Articles (/{book_slug}/A/{path}) — HTML; use strip_html for plain text

There is no JSON API. Full-text search requires ZIMs built with _ftindex:yes — not all ZIMs include it. Servers with books spanning multiple languages require a book scope for any search request.

Testing

# Install with dev dependencies
pip install -e ".[dev]"

# Run the test suite (no network required)
pytest

Reviews

No reviews yet

Sign in to write a review

kiwix-mcp — MCP Server | MCP Hub