CLI for coding agents to interact with a BookStack wiki via its REST API
Project description
bookstack-cli
CLI for coding agents to interact with a BookStack wiki via its REST API. All output is JSON — built for LLM pipelines, not humans.
bookstack books list | jq '. | length'
bookstack pages get 42 | jq '.html[:200]'
bookstack search query "api docs" | jq '.[] | {name, type, score}'
bookstack test
Install
# One-liner (no clone needed)
uv tool install bookstack-cli # from PyPI, once published
# or from source:
# uv tool install git+https://github.com/mzehrer/bookstack-cli.git
# Or clone for development
cd bookstack-cli
make init # or: uv sync
Setup
bookstack auth # interactive — prompts for URL, token, secret
# If public web URL differs from API (e.g. behind OAuth proxy):
bookstack auth --resolve-url https://wiki.public.example.com
Config File
Saved to ~/.config/bookstack-cli/config.toml:
[connection]
url = "http://10.0.0.1:8080" # API endpoint (internal)
resolve_url = "https://wiki.public.example.com" # public web URL (optional)
token_id = "<your-token-id>"
token_secret = "<your-token-secret>"
resolve_url is optional — defaults to url if not set.
Env Vars (override file)
export BOOKSTACK_URL=http://10.0.0.1:8080
export BOOKSTACK_RESOLVE_URL=https://wiki.example.com
export BOOKSTACK_TOKEN_ID=<your-token-id>
export BOOKSTACK_TOKEN_SECRET=<your-token-secret>
Precedence: env vars > config file > error.
Usage
$ bookstack --help
╭─ Commands ───────────────────────────────────────╮
│ auth Save connection credentials. │
│ config Manage connection config. │
│ test Test connection to BookStack. │
│ shelves Manage bookshelves. │
│ books Manage books. │
│ chapters Manage chapters. │
│ pages Manage pages. │
│ attachments Manage attachments. │
│ users Manage users (admin). │
│ roles Manage roles (admin). │
│ search Search content. │
╰───────────────────────────────────────────────────╯
Common Workflows
# Test connection
bookstack test
# List all books
bookstack books list
# Get a specific page
bookstack pages get 42
# Create a page from file
bookstack pages create "My Page" --book-id 1 --markdown-file content.md
# Pipe multi-line content
cat content.md | bookstack pages create "Piped Page" --book-id 1
# Append text to existing page
bookstack pages update 42 --append "New section at the end"
# Resolve web URL to page
bookstack pages resolve-url "https://wiki/books/my-book/page/my-page"
# Import markdown with images
bookstack pages import --file article.md --book-id 1 --name "Article"
# Search across all content
bookstack search query "installation guide"
# List attachments on a page
bookstack attachments list --page-id 10
# Upload a file attachment
bookstack attachments upload --name "Report" --page-id 42 --file report.pdf
# Create a shelf and assign books
bookstack shelves create "Dev Docs"
bookstack shelves update 1 "Dev Docs" --books "10,20,30"
# Update entity
bookstack books update 1 "New Title"
Features
| Feature | Status |
|---|---|
| Shelves CRUD (+ book assignment) | ✅ |
| Books CRUD | ✅ |
| Chapters CRUD | ✅ |
| Pages CRUD (partial update, append, move) | ✅ |
| Markdown import with image handling | ✅ |
| Web URL → API ID resolution | ✅ |
| Attachments (link + file upload) | ✅ |
| Search across content | ✅ |
| Users/Roles (admin) | ✅ |
| Async HTTP with retry/backoff | ✅ |
| Auto-pagination (client-side filtering) | ✅ |
| Config test / connection check | ✅ |
| JSON-only output | ✅ |
Project Layout
bookstack-cli/
├── bookstack_cli/
│ ├── client.py # HTTP client, auth, rate-limit, pagination
│ ├── config.py # Env vars → ~/.config/bookstack-cli/config.toml
│ ├── exceptions.py # Typed error hierarchy
│ ├── models.py # Pydantic models for all entities
│ ├── main.py # Typer CLI entry point
│ └── resources/ # One module per entity
│ ├── books.py
│ ├── chapters.py
│ ├── pages.py
│ ├── shelves.py
│ ├── attachments.py
│ ├── search.py
│ ├── users.py
│ ├── roles.py
│ ├── revisions.py
│ └── tags.py
├── tests/ # 130+ tests
├── docs/ # Detailed docs
├── skill/ # Pi agent skill
├── Makefile # init/test/lint/format/run
└── pyproject.toml
Documentation
| File | What |
|---|---|
| docs/overview.md | Architecture, goals, scope |
| docs/authentication.md | Token setup, env config, security |
| docs/api-reference.md | All endpoints, schemas, pagination |
| docs/integration-guide.md | Hacking BookStack, injections, webhooks |
| docs/research.md | Raw API research findings |
| skill/SKILL.md | Agent skill for pi/coding agents |
| AGENT.md | TDD protocol for this project |
Design
- Async from day one —
httpx.AsyncClientwith retry + exponential backoff on 429s - Pydantic v2 — typed models for every entity, validated responses
- Agent-friendly output — everything is JSON via stdout, no interactive prompts
- Resource-per-file — one module per entity, consistent
list/get/create/update/deletesignatures - Config cascade — env vars >
~/.config/bookstack-cli/config.toml> error - TDD — 130 tests, red/green/refactor cycle (see AGENT.md)
License
MIT
Project details
Release history Release notifications | RSS feed
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 bookstack_cli-0.1.1.tar.gz.
File metadata
- Download URL: bookstack_cli-0.1.1.tar.gz
- Upload date:
- Size: 32.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.24 {"installer":{"name":"uv","version":"0.11.24","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
05cb876d35b0e2867f2aa89d1786f51942bcdb711c4d7eefe1ec910217f3fb29
|
|
| MD5 |
61699c06214e88e5c492222abdc306d3
|
|
| BLAKE2b-256 |
d2937e1b90fecd098ad2807803fd5f9a9db8a613869b387dc9afa05ef09350f1
|
File details
Details for the file bookstack_cli-0.1.1-py3-none-any.whl.
File metadata
- Download URL: bookstack_cli-0.1.1-py3-none-any.whl
- Upload date:
- Size: 26.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.24 {"installer":{"name":"uv","version":"0.11.24","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ce0e28ee6e988da56428ef39c994fe5ef35c1068ba5cbb029a43c013e71157fd
|
|
| MD5 |
e838716a1ea7fd1931c4f7e4d8ee6bdc
|
|
| BLAKE2b-256 |
c014ead114a2757633d8021b10a33d163e3c812766eda42a45f03d6c7947194b
|