Local MCP server for searching and reading Kiwix ZIM archives offline
kiwix-mcp demonstrates solid definition quality with all 6 tools having clear verb-noun naming (list_archives, search, inspect_article, read_article, list_references, extract_image) and comprehensive descriptions (80-150 chars each). Input schemas are fully specified with typed parameters and descriptions. Tool annotations (readOnlyHint, destructiveHint, idempotentHint) are correctly applied. However, output schemas are not documented in the visible code, responses are inferred from implementation rather than explicitly declared. Parameter descriptions are good but could be more prescriptive about constraints (e.g., max_chars limits, archive_id format). Error handling is present but recovery guidance is minimal. The MCP_INSTRUCTIONS string provides excellent agent guidance but is not formally integrated into tool metadata.
Extract and cache an image from an article
Get metadata and structure of an article without full content
List all available ZIM archives with metadata
List references and citations for an article
Read article content with optional section filtering
Search for articles in ZIM archives
Output schemas not documented. Tool responses are inferred from implementation (BeautifulSoup parsing, libzim API calls) but no explicit schema definitions visible for list_archives, search results, article metadata, or image extraction responses. LLMs cannot plan downstream operations without knowing return field names and types.
Parameter constraints not formalized. max_chars, offset, and limit parameters lack explicit min/max bounds in schema. Descriptions mention defaults (DEFAULT_MAX_CHARS=12000, MAX_ARTICLE_BYTES=16MB) but these are not enforced via JSON Schema constraints, leaving validation to runtime.
Error handling lacks recovery guidance. Code catches exceptions (e.g., Archive not found, search failures) but error messages are not visible in the provided snippet. No evidence of actionable error responses that tell LLMs what to do next (e.g., 'Archive not found. Call list_archives() to see available archives.').
Inferred effective spec: 2026-07-28+.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 59 | 2026-07-28+ | v2 |
Pagination not visible for search results. search() accepts 'limit' parameter but no offset/cursor mechanism is documented. Large result sets could exceed context windows without explicit pagination support.
extract_image marked WRITE but caching behavior not documented. Tool caches images to IMAGE_TEMP_DIR with MAX_TEMP_IMAGES=16 limit, but this side effect and cleanup policy are not exposed in the tool description or schema.