Skip to main content

CLI for coding agents to interact with a BookStack wiki via its REST API

Project description

bookstack-cli

Python License: MIT

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.

See auth docs →

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 onehttpx.AsyncClient with 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/delete signatures
  • Config cascade — env vars > ~/.config/bookstack-cli/config.toml > error
  • TDD — 130 tests, red/green/refactor cycle (see AGENT.md)

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

bookstack_cli-0.1.1.tar.gz (32.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

bookstack_cli-0.1.1-py3-none-any.whl (26.2 kB view details)

Uploaded Python 3

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

Hashes for bookstack_cli-0.1.1.tar.gz
Algorithm Hash digest
SHA256 05cb876d35b0e2867f2aa89d1786f51942bcdb711c4d7eefe1ec910217f3fb29
MD5 61699c06214e88e5c492222abdc306d3
BLAKE2b-256 d2937e1b90fecd098ad2807803fd5f9a9db8a613869b387dc9afa05ef09350f1

See more details on using hashes here.

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

Hashes for bookstack_cli-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 ce0e28ee6e988da56428ef39c994fe5ef35c1068ba5cbb029a43c013e71157fd
MD5 e838716a1ea7fd1931c4f7e4d8ee6bdc
BLAKE2b-256 c014ead114a2757633d8021b10a33d163e3c812766eda42a45f03d6c7947194b

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page