bookshelf-mcp
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@bookshelf-mcpSearch for books by Brandon Sanderson"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
bookshelf-mcp
Part of the arr-mcps collection. MCP server exposing Bookshelf's v1 REST API (a Readarr fork, OpenAPI 3.0.1) as tools, so an LLM can read and manage a Bookshelf instance: authors, books, book files, editions, series, the download queue, history, indexers, import lists, custom formats, tags, commands, system status, and more. Full surface — reads and writes, with destructive tools flagged.
Built with FastMCP.
Getting an API key
Generate one in Bookshelf Settings > General > Security. Auth is the
X-Api-Key header.
Related MCP server: mylar3-mcp
Install
Download a wheel from the latest release
and install it as a uv tool (no repo checkout needed):
uv tool install bookshelf_mcp-*.whlThis puts a bookshelf-mcp command on your PATH. Register it with Claude Code:
claude mcp add bookshelf \
--env BOOKSHELF_URL=http://your-bookshelf-host:8787 \
--env BOOKSHELF_API_KEY=<key> \
-- bookshelf-mcpFrom source
uv sync
cp .env.example .env # fill in BOOKSHELF_URL and BOOKSHELF_API_KEYclaude mcp add bookshelf \
--env BOOKSHELF_URL=http://your-bookshelf-host:8787 \
--env BOOKSHELF_API_KEY=<key> \
-- uv run --directory /path/to/bookshelf-mcp bookshelf-mcpConfig
Env var | Required | Default |
| yes | - |
| yes* | none (no |
* Every API endpoint requires auth; practically you must set it, but the server still starts without one so errors surface from the API rather than at startup.
Tools
One tool per Bookshelf v1 JSON endpoint (plus GET /ping). Naming is
bookshelf_<verb>_<resource>. GET endpoints are read-only; POST/PUT are writes;
DELETE endpoints are flagged destructive.
Tool | Method | Endpoint |
Author | ||
| GET |
|
| GET |
|
| POST |
|
| PUT |
|
| DELETE |
|
| PUT |
|
| DELETE |
|
| GET |
|
Backup | ||
| GET |
|
| POST |
|
| POST |
|
| DELETE |
|
Blocklist | ||
| GET |
|
| DELETE |
|
| DELETE |
|
Book | ||
| GET |
|
| GET |
|
| GET |
|
| POST |
|
| PUT |
|
| DELETE |
|
| PUT |
|
| PUT |
|
| DELETE |
|
| GET |
|
BookFile | ||
| GET |
|
| GET |
|
| PUT |
|
| DELETE |
|
| PUT |
|
| DELETE |
|
Bookshelf | ||
| POST |
|
Calendar | ||
| GET |
|
| GET |
|
Command | ||
| POST |
|
| GET |
|
| DELETE |
|
| GET |
|
Config | ||
| GET |
|
| PUT |
|
| GET |
|
| GET |
|
| PUT |
|
| GET |
|
| GET |
|
| PUT |
|
| GET |
|
| GET |
|
| PUT |
|
| GET |
|
| GET |
|
| PUT |
|
| GET |
|
| GET |
|
| PUT |
|
| GET |
|
| GET |
|
| GET |
|
| PUT |
|
| GET |
|
| GET |
|
| PUT |
|
| GET |
|
CustomFilter | ||
| GET |
|
| POST |
|
| PUT |
|
| DELETE |
|
| GET |
|
CustomFormat | ||
| GET |
|
| POST |
|
| GET |
|
| PUT |
|
| DELETE |
|
| GET |
|
Cutoff | ||
| GET |
|
| GET |
|
DelayProfile | ||
| GET |
|
| POST |
|
| PUT |
|
| DELETE |
|
| PUT |
|
| GET |
|
DiskSpace | ||
| GET |
|
DownloadClient | ||
| GET |
|
| POST |
|
| POST |
|
| PUT |
|
| DELETE |
|
| GET |
|
| POST |
|
| POST |
|
| PUT |
|
| DELETE |
|
| GET |
|
Edition | ||
| GET |
|
FileSystem | ||
| GET |
|
| GET |
|
| GET |
|
Health | ||
| GET |
|
History | ||
| GET |
|
| POST |
|
| GET |
|
| GET |
|
ImportList | ||
| GET |
|
| POST |
|
| POST |
|
| PUT |
|
| DELETE |
|
| GET |
|
| POST |
|
| POST |
|
| PUT |
|
| DELETE |
|
| GET |
|
ImportListExclusion | ||
| GET |
|
| POST |
|
| PUT |
|
| DELETE |
|
| GET |
|
Indexer | ||
| GET |
|
| POST |
|
| POST |
|
| PUT |
|
| DELETE |
|
| GET |
|
| POST |
|
| POST |
|
| PUT |
|
| DELETE |
|
| GET |
|
IndexerFlag | ||
| GET |
|
Language | ||
| GET |
|
| GET |
|
Localization | ||
| GET |
|
Log | ||
| GET |
|
LogFile | ||
| GET |
|
ManualImport | ||
| GET |
|
| POST |
|
MediaManagementConfig | ||
| GET |
|
| PUT |
|
| GET |
|
Metadata | ||
| GET |
|
| POST |
|
| POST |
|
| GET |
|
| POST |
|
| POST |
|
| PUT |
|
| DELETE |
|
| GET |
|
MetadataProfile | ||
| GET |
|
| POST |
|
| GET |
|
| DELETE |
|
| PUT |
|
| GET |
|
Missing | ||
| GET |
|
| GET |
|
Notification | ||
| GET |
|
| POST |
|
| POST |
|
| GET |
|
| POST |
|
| POST |
|
| PUT |
|
| DELETE |
|
| GET |
|
Parse | ||
| GET |
|
Ping | ||
| GET |
|
QualityDefinition | ||
| GET |
|
| PUT |
|
| PUT |
|
| GET |
|
QualityProfile | ||
| GET |
|
| POST |
|
| GET |
|
| DELETE |
|
| PUT |
|
| GET |
|
Queue | ||
| GET |
|
| DELETE |
|
| DELETE |
|
QueueAction | ||
| POST |
|
| POST |
|
QueueDetails | ||
| GET |
|
QueueStatus | ||
| GET |
|
Release | ||
| POST |
|
| GET |
|
ReleaseProfile | ||
| GET |
|
| POST |
|
| DELETE |
|
| PUT |
|
| GET |
|
ReleasePush | ||
| POST |
|
RemotePathMapping | ||
| GET |
|
| POST |
|
| DELETE |
|
| PUT |
|
| GET |
|
RenameBook | ||
| GET |
|
RetagBook | ||
| GET |
|
RootFolder | ||
| GET |
|
| POST |
|
| DELETE |
|
| GET |
|
Search | ||
| GET |
|
Series | ||
| GET |
|
System | ||
| GET |
|
| POST |
|
| POST |
|
| GET |
|
| GET |
|
Tag | ||
| GET |
|
| POST |
|
| PUT |
|
| DELETE |
|
| GET |
|
TagDetails | ||
| GET |
|
| GET |
|
Task | ||
| GET |
|
| GET |
|
Update | ||
| GET |
|
UpdateLogFile | ||
| GET |
|
Endpoints excluded on purpose: /login, /logout, /api (swagger metadata),
static web routes, the .ics calendar feed, and binary/text content endpoints
(media covers, raw log file contents) — _req JSON-decodes every response.
For POST/PUT tools, the request body is passed as a single body object (or
body list for array-bodied endpoints); query/path params are explicit
arguments. Optional params are omitted when unset so the API's defaults apply.
Development
make help # list all commandsCommand | Does |
|
|
| Offline tests - one per endpoint, mocked HTTP |
| Tests against the live instance (needs |
| Build wheel + sdist into |
| Bump the version in |
| Remove build artifacts |
The release workflow (.github/workflows/release.yml) builds and publishes to
Releases whenever a v*
tag is pushed - so the usual flow is make bump-patch, commit, then tag and
push.
The integration suite is read-only by default (GET endpoints only). Set
BOOKSHELF_WRITE_TESTS=1 to also exercise POST/PUT/DELETE against a scratch tag
(created, updated, then deleted). Never run write tests against a production
library.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- Alicense-qualityCmaintenanceHTTP MCP server enabling LLMs to search, create, read, update, and delete BookStack entities (books, chapters, pages, shelves) using API tokens.304MIT
- AlicenseAqualityAmaintenanceMCP server that exposes Mylar3's HTTP API as tools, letting an LLM read and manage a comic library including watchlist, wanted issues, upcoming, history, logs, story arcs, and providers.5MIT
- AlicenseCqualityBmaintenanceMCP server exposing Komga's REST API as tools for browsing and managing comic, manga, BD, magazine, and ebook libraries.81MIT
- AlicenseCqualityBmaintenanceMCP server exposing Radarr's v3 REST API as tools, enabling LLMs to read and manage movies, downloads, history, indexers, and more.100MIT
Related MCP Connectors
MCP server exposing the Backtest360 engine API as tools for AI agents.
Markdown-first MCP server for Notion API with 8 composite tools and 39 actions.
MCP server for Pentest-Tools.com: run scans, manage findings and reports via your preffered LLM.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/SavageCore/bookshelf-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server