loading…
Search for a command to run...
loading…
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
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.
MCP server and Python client library for Kiwix HTTP servers.
Tested against kiwix-tools (Debian bookworm package) and newer libkiwix-based deployments. Any standard kiwix-serve deployment should work.
Known quirks handled transparently:
& in OPDS catalog href attributes/kiwix/content/book_slug) — slug and article URL handling adapts automatically| Tool | Description |
|---|---|
kiwix_list_books |
List available ZIM books; optional title filter |
kiwix_search |
Full-text search across all books or a specific book |
kiwix_fetch_article |
Fetch an article as plain text by URL |
pip install kiwix-mcp
Or with uv:
uv pip install kiwix-mcp
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 --transport http kiwix https://your-kiwix-mcp-host/mcp/
kiwix-mcp --transport sse --base-url http://localhost:8080
Then point your MCP client at http://localhost:8000/sse.
kiwix-mcp --transport streamable-http --base-url http://localhost:8080
Then point your MCP client at http://localhost:8000/mcp.
When using HTTP transports with browser-based MCP clients (e.g. llama-server WebUI), CORS headers are added automatically. By default all origins are allowed.
To restrict allowed origins:
kiwix-mcp --transport streamable-http --base-url http://localhost:8080 \
--cors-allow-origins "http://localhost:3000,http://myapp.example.com"
# or
CORS_ALLOW_ORIGINS="http://localhost:3000" kiwix-mcp --transport streamable-http --base-url http://localhost:8080
CORS has no effect on stdio transport.
docker run -e KIWIX_BASE_URL=http://your-kiwix-server:8080 \
-p 8000:8000 \
oscillatelabs/kiwix-mcp
Defaults to streamable-http transport bound on 0.0.0.0:8000. Override with env vars:
docker run \
-e KIWIX_BASE_URL=http://your-kiwix-server:8080 \
-e TRANSPORT=sse \
-e HOST=0.0.0.0 \
-e PORT=8000 \
-e CORS_ALLOW_ORIGINS="http://localhost:3000" \
-p 8000:8000 \
oscillatelabs/kiwix-mcp
| Flag | Default | Env |
|---|---|---|
--base-url |
— | KIWIX_BASE_URL |
--transport |
stdio |
TRANSPORT |
--host |
127.0.0.1 |
HOST |
--port |
8000 |
PORT |
--cors-allow-origins |
* |
CORS_ALLOW_ORIGINS |
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)
kiwix-serve exposes three HTTP surfaces used by this client:
/catalog/v2/entries) — Atom XML with book metadata and slugs; supports ?q=, ?count=, ?start= params/search?pattern=…&books.name=…&start=…) — HTML; 25 results/page; books.name= scopes to a specific ZIM slug/{book_slug}/A/{path}) — HTML; use strip_html for plain textThere 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.
# Install with dev dependencies
pip install -e ".[dev]"
# Run the test suite (no network required)
pytest
Добавь это в claude_desktop_config.json и перезапусти Claude Desktop.
{
"mcpServers": {
"kiwix-mcp": {
"command": "npx",
"args": []
}
}
}