metabook-py
📚 X-ray any book's structure — chapters, paragraphs, sentences, clauses, words — as clean JSON. REST + MCP, Project Gutenberg search or your own EPUB. No book text ever leaves the API.
API docs · MCP server · Desktop example · Workflow
Overview
Metabook is a Book Structure API: give it a title, an ISBN, a Gutenberg ID, or an EPUB file, and it returns the book's structural schema — what kind of book it is and how it's shaped — without ever returning the text itself.
Under the hood it locates the book via Gutendex (or walks your uploaded EPUB's spine), downloads and cleans the text, detects the structural schema, and counts everything at every level.
title / ISBN / Gutenberg ID ──► Gutendex ──► fetch + clean ──┐
├──► detect schema ──► counts-only JSON
your .epub ──► Vercel Blob ──► package doc + spine XHTML ────┘
✨ Features
- 🔍 Fuzzy search — find books by title or author via Gutendex, or go straight to an ISBN / Gutenberg ID
- 🧬 Schema detection — classifies each book as
scripture,sectioned_book,standard_book,essay_collection, orflat, with a confidence rating - 🔢 Counts, not content — chapters, paragraphs, sentences, clauses, and words per node; a word node is just its index. No book text is ever included in a response
- 📤 Bring your own EPUB —
POST /api/books/uploadstores the file in Vercel Blob and analyses it with the same pipeline - 🔌 Two interfaces, one service layer — a FastAPI REST API and a FastMCP server share the same core
- 🖥️ Native desktop client — a GPUI example app with an animated structure tree and a synced JSON code editor
Detail levels
The detail parameter controls how deep the returned tree nests beneath each paragraph:
detail |
Nested nodes |
|---|---|
paragraph |
paragraphs only (counts for the rest) |
sentence |
+ sentence nodes |
clause |
+ clause nodes |
word |
+ word nodes (index + position only) |
🚀 Quick start
make setup # install dependencies (uv sync)
make dev # run the API with auto-reload on :8000
make test # run the test suite
make docker-up # or run it via docker compose
Then open the interactive docs at http://127.0.0.1:8000/api/docs, or try:
curl "http://127.0.0.1:8000/api/books/structure?title=Pride+and+Prejudice&detail=sentence"
EPUB uploads
Uploads need a Vercel Blob read-write token in the environment (or .env / .env.local):
export BLOB_READ_WRITE_TOKEN=vercel_blob_rw_...
If the project is linked to Vercel, vercel env pull writes the token to .env.local (gitignored), which the app loads automatically — values there override .env.
🌐 REST API
| Method | Endpoint | Purpose |
|---|---|---|
GET |
/api/books/structure |
Analyse by title, isbn, or gutenberg_id (+ detail) |
GET |
/api/books/structure/schemas |
List the supported structural schemas |
POST |
/api/books/upload |
Upload an EPUB and analyse it |
GET |
/health |
Liveness + cache stats |
Interactive OpenAPI docs live at /api/docs.
🤖 MCP server
A FastMCP server is mounted at /mcp, so agents can use the same service layer through three tools:
| Tool | Description |
|---|---|
search_book_structure |
Analyse a book by title, ISBN, or Gutenberg ID |
upload_book_epub |
Analyse an EPUB passed as base64 or a URL |
list_supported_schemas |
Enumerate the structural schemas |
🖥️ Desktop example (GPUI)
example/ is a native macOS client built with GPUI and gpui-component: fuzzy search or EPUB upload, an animated lazily-materialised structure tree, and a read-only JSON code editor (tree-sitter highlighting, folding) that scrolls to and highlights whichever node you select in the tree. Light and dark themes, spring animations, routed form transitions.
More screenshots
| Search results | Dark mode |
|---|---|
Run it (API first, then the app):
make dev
cd example && cargo run
See example/README.md for the Metabook.app bundle (with app icon) and METABOOK_API configuration.
🌳 Branching and release
CI/release pipeline scaffolded from exegia/corpora-py: same branch model, GitHub Actions workflows, composite actions, and make-driven release automation.
See .github/WORKFLOW.md for the full branch model, versioning rules, and workflow reference. Quick summary:
<type>/<slug> --PR--> dev --(daily/manual)--> next --cut--> release/vX.Y.Z --draft PR--> main
(deleted on merge) (preview) (deleted on release)
Common commands
make help # list all targets
make ci # everything CI runs on a PR (lint + test)
make pack # build the publishable wheel
make rulesets-diff # rulesets GitHub currently has
make rulesets-apply # push .github/rulesets/*.json
Bootstrap
There are no dev / next branches until the first wrapup. Run the Release workflow manually (Actions → Release → Run workflow), or locally:
make bootstrap-lanes
📄 License
MIT © Emmanuel De Freitas
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file metabook_py-2.0.0.tar.gz.
File metadata
- Download URL: metabook_py-2.0.0.tar.gz
- Upload date:
- Size: 2.4 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
uv/0.12.7 {"installer":{"name":"uv","version":"0.12.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
88ae1ec31184af3fbcfe6630c431d426f590c3496fb0f98708ffe27a3d7c857b
|
|
| MD5 |
bca2a3bd13fe7d201f6cdbd105d9c0b3
|
|
| BLAKE2b-256 |
19e0350ababa432c313a1bf8154d962ab8291d710671a4df29ea2b02172aa919
|
File details
Details for the file metabook_py-2.0.0-py3-none-any.whl.
File metadata
- Download URL: metabook_py-2.0.0-py3-none-any.whl
- Upload date:
- Size: 33.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
uv/0.12.7 {"installer":{"name":"uv","version":"0.12.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cd6bdc5fdd7a96a9b9d1bce28043d985a35aacad3f33a79bd9a1c63054ce62d1
|
|
| MD5 |
d7b10bac6d74fc9aeb9af5b2294e0b59
|
|
| BLAKE2b-256 |
1a7074c810fa71232be2c943cf8d5e3a8c669838df74332e82fadba8b8663023
|