bookstack-mcp
Allows interaction with a BookStack wiki instance, providing tools to search, read, and write wiki content in Markdown. Supports managing shelves, books, chapters, and pages, including creating, updating, editing via find-and-replace, moving, tagging, and deleting items. Reads pages as Markdown and preserves each page's editor type when writing.
Click on "Deploy 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., "@bookstack-mcpsearch the wiki for our onboarding checklist"
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.
bookstack-mcp
A focused MCP server for BookStack, built for Claude Code. Search, read and write your wiki in Markdown, straight from a chat with Claude β no dashboards, no config files to hand-edit, no 50-tool surface to learn. 11 tools, 3 environment variables, one setup command.
π·πΊ Π ΡΡΡΠΊΠ°Ρ Π²Π΅ΡΡΠΈΡ
Why this one
There are already a few BookStack MCP servers out there. Most of them expose the whole BookStack API 1:1 β dozens of tools, image galleries, Letta-specific compatibility notes, permission and user management β which is powerful but a lot to load into a model's context and a lot to configure for what most people actually want: read the wiki, write to the wiki, in Markdown.
This one does less on purpose:
11 tools, not 30β60.
search/list/getcover every read; six tools cover every write.Markdown-native. Pages come back as Markdown; new pages are written as Markdown; a targeted
edit_pagetool does find-and-replace on a page's source instead of resending the whole thing.One setup command.
npm run setupasks for your BookStack URL and API token, verifies them against your instance, and registers the server in Claude Code's config itself.Errors you can act on. A bad token, a wrong URL, a permission gap, a rate limit β each comes back as a plain-English message with what to do about it, not a raw HTTP status.
No new infra. For yourself it runs over stdio: no server, no database, no Docker. For a team there's an optional HTTP mode β one container, still no database, and everyone signs in with their own BookStack token.
Related MCP server: BookStack MCP Server
Install
1. Get a BookStack API token. Avatar β My Account β Access & Security β API Tokens β Create Token (older versions: Edit Profile β API Tokens). Save the Token ID and Token Secret β the secret is shown once. The user's role needs the Access System API permission (admins have it by default).
2. Clone, install and run setup:
git clone https://github.com/yand3r3d3v/bookstack_mcp.git
cd bookstack_mcp
npm install
npm run setupsetup asks for the URL, Token ID and Token Secret, checks them against your BookStack instance,
and registers the server in Claude Code's user config (~/.claude.json, available in every
project β it keeps a backup at ~/.claude.json.before-bookstack-mcp). Run it again any time to
change settings; pressing Enter keeps the current value.
3. Start a new Claude Code session. Run /mcp to confirm bookstack shows up connected.
Add this to ~/.claude.json under mcpServers (or to a project's own .mcp.json if you only want
it there):
"bookstack": {
"type": "stdio",
"command": "/opt/homebrew/bin/node",
"args": ["/path/to/bookstack_mcp/dist/index.js"],
"env": {
"BOOKSTACK_URL": "https://wiki.example.com",
"BOOKSTACK_TOKEN_ID": "...",
"BOOKSTACK_TOKEN_SECRET": "..."
}
}Use an absolute path to node β the GUI app doesn't always inherit your shell's PATH. Run
npm run build first so dist/index.js exists.
Shared server (HTTP)
Instead of everyone cloning the repo, you can run one server for the whole team and add it to Claude by
URL. It works behind a reverse proxy on a sub-path of an existing domain
(https://tools.example.com/bookstack-mcp), so no new domain or certificate is needed.
Each person signs in with their own BookStack API token through a standard OAuth flow: Claude opens a sign-in page, you paste your Token ID and Secret, done. Everyone keeps exactly their own BookStack permissions.
The server stores nothing. The tokens it hands to Claude are encrypted with
MCP_AUTH_SECRETand carry the user's BookStack token inside. No database, no sessions β restart or scale it freely.Revoking access = deleting the API token in BookStack (takes effect within 5 minutes).
Run it
cp .env.example .env # fill in BOOKSTACK_URL, MCP_PUBLIC_URL, MCP_AUTH_SECRET
docker compose up -d --buildWithout Docker: npm install && npm run build, set the variables, npm run serve.
Variable | |
| Your BookStack, e.g. |
| This server's public address including the sub-path, e.g. |
| Encrypts the tokens given to Claude: |
| Where sign-in may redirect back to. Default |
| Listen address, default |
|
|
BOOKSTACK_TOKEN_ID / BOOKSTACK_TOKEN_SECRET aren't used in this mode.
Reverse proxy on a sub-path
nginx, in the server block of the existing domain:
location /bookstack-mcp/ {
proxy_pass http://127.0.0.1:3000;
}
# OAuth discovery checks the root of the domain first (RFC 8414). Required if the main site answers
# unknown URLs with 200 (an SPA, a catch-all) β otherwise Claude fails to connect; harmless either way.
location = /.well-known/oauth-authorization-server/bookstack-mcp {
proxy_pass http://127.0.0.1:3000;
}
location = /.well-known/oauth-protected-resource/bookstack-mcp/mcp {
proxy_pass http://127.0.0.1:3000;
}The sub-path may be passed through as-is (as above) or stripped (proxy_pass http://127.0.0.1:3000/;);
the server accepts both. Any other proxy works the same way. HTTPS is required for anything but
localhost.
Connect Claude
As a connector (Claude desktop app, claude.ai β Chat, Cowork and the Code tab alike): Settings β
Connectors β Add custom connector, URL https://tools.example.com/bookstack-mcp/mcp, then Connect and
sign in with your BookStack token. On Team/Enterprise plans an owner adds it once for the organization.
Claude reaches custom connectors from Anthropic's cloud, so the server has to be reachable from the
internet, not just from your VPN.
In Claude Code (CLI; the desktop Code tab reads the same config) β the connection is made from your machine, so an internal-only server is fine:
claude mcp add --transport http --scope user bookstack https://tools.example.com/bookstack-mcp/mcpThen run /mcp, pick bookstack β Authenticate. Or skip OAuth and pass the BookStack token directly:
claude mcp add --transport http --scope user bookstack https://tools.example.com/bookstack-mcp/mcp --header "Authorization: Token TOKEN_ID:TOKEN_SECRET"Usage
Just ask, in plain language:
"search the wiki for how we configured nginx"
"what's in the Infra book?"
"write this up in the Infra book, Networking chapter"
"add a section about the new cameras to the VLAN page"
"create a Projects shelf with a Backend book on it"
For the common "write up what we just did" case, there's a ready-made prompt:
/mcp__bookstack__documentClaude will find the right place for it, check whether a page on the topic already exists (and extend it instead of creating a near-duplicate), write it for a colleague who wasn't in this conversation, and hand you the link.
To stop Claude Code from asking permission for every read, add this to ~/.claude/settings.json:
{ "permissions": { "allow": ["mcp__bookstack__search", "mcp__bookstack__list", "mcp__bookstack__get"] } }Write tools will still ask for confirmation.
Tools
Tool | What it does |
| Full-text search, with BookStack's own syntax: |
| List shelves / books / chapters / pages; filter by name or book, sort by last updated |
| Page β its content as Markdown; book β table of contents; chapter β its pages; shelf β its books |
| New page from Markdown, in a chapter or directly in a book |
| Replace content, append/prepend ( |
| Exact find-and-replace on a page's Markdown source β no need to resend the whole page |
| New book (optionally placed on a shelf) |
| New chapter in a book |
| New shelf with books on it |
| Rename / describe / tag a shelf, book or chapter; move a chapter; add or remove books on a shelf |
| Move to BookStack's recycle bin (Settings β Maintenance β Recycle Bin) |
Every item in a response is shown as [page:12] Name β those ids are what you pass back to the
tools.
Markdown vs. WYSIWYG
BookStack has two editors: WYSIWYG (visual, stores HTML) and Markdown (stores Markdown source). This server works in Markdown and preserves each page's own editor:
Markdown page | WYSIWYG page | |
Read ( | source as-is | converted to Markdown via BookStack's own export |
| writes Markdown | Markdown β HTML, page stays WYSIWYG; |
| exact match-and-replace on the source | unavailable (no Markdown source) β use |
New pages are always created in Markdown. Beyond standard GFM (tables, task lists, fenced code),
BookStack understands callout blocks: <p class="callout info">Text</p> (info, success,
warning, danger).
Configuration
Variable | |
| Your BookStack address, e.g. |
| Token ID |
| Token Secret |
|
|
Permissions are entirely the token owner's: the server sees and can change exactly what that user can in the web UI β nothing more.
What's here and what isn't
Covers: shelves, books, chapters and pages β reading, full-text search, creating, editing (whole-page replace, append/prepend, and exact find-and-replace), renaming, tagging, moving between books/chapters, adding/removing books on a shelf, and soft-delete to the recycle bin.
Not (yet) covered, because most people setting this up for Claude Code don't need it day one:
Images, drawings and file attachments (BookStack's image gallery / attachments API)
Comments on pages
Users, roles and content permissions
The recycle bin itself (restoring or permanently deleting) β only sending items to it
Page templates
Audit log
Exporting to PDF / plain HTML (Markdown export is used internally for reading WYSIWYG pages)
Talking to more than one BookStack instance from a single server process
If you need any of these, they're reasonably contained additions to src/tools.ts and
src/bookstack.ts β issues and PRs welcome. See Development below.
Troubleshooting
Errors come back straight into the conversation, so Claude will show them. Common ones:
"isn't configured" β environment variables aren't set. Run
npm run setup.401 β wrong Token ID / Secret, or the token expired.
403 β the role is missing Access System API, or lacks permission on that specific book/page.
"redirects to https://β¦" β use
https://in the URL.Self-signed certificate β add
NODE_EXTRA_CA_CERTS=/path/to/ca.pemto the server'senv.Moved the project folder β run
npm run setupagain; the server's path is stored in the config.Rate limited β BookStack defaults to 180 requests/minute.
HTTP mode:
Connector fails right away / "Unexpected token '<'" β the root
.well-knownURLs return the main site's HTML; add the twolocation = /.well-known/β¦blocks from the nginx example."Redirects to β¦ aren't allowed" β the client's callback host isn't in
MCP_ALLOWED_REDIRECT_HOSTS.Everyone has to reconnect after a restart β
MCP_AUTH_SECRETisn't set, so a random one is used.Sign-in page says the token was refused β same causes as 401/403 above, for that user's token.
Development
npm run buildsrc/bookstack.tsβ HTTP client for the BookStack API and human-readable errorssrc/tools.tsβ the MCP tools and thedocumentpromptsrc/server.tsβ the MCP server and the model instructions, shared by both transportssrc/index.tsβ stdio entry pointsrc/http.tsβ HTTP entry point: Streamable HTTP, routing under a sub-pathsrc/oauth.tsβ OAuth sign-in with a BookStack API token, stateless encrypted tokenssrc/setup.tsβ the setup wizard
License
Available Tools
11 toolscreate_bookCreate bookC
Create a book, optionally placing it on a shelf.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| tags | No | Tags as {name, value}. When updating, this replaces all existing tags. | |
| shelf_id | No | Also add the new book to this shelf | |
| description | No | Short plain-text description |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full disclosure burden. It says nothing about permissions required, whether the book is immediately visible/searchable, or that supplying tags replaces existing tags (that fact lives only in the schema). The one behavioral clue is that shelf placement is optional.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence with zero padding and the primary action front-loaded. It is efficient, though the brevity edges toward under-specification for a four-parameter mutation tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations and no output schema, the description is too thin: it omits required fields, the tags replacement behavior, and any note on what is returned. An agent can call it, but only by leaning almost entirely on the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 75%, so the schema already documents shelf_id, tags, and description reasonably well. The description's only parameter-relevant addition is "optionally placing it on a shelf," which merely restates the shelf_id schema note rather than adding format or constraint detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Create a book") and adds a scope note about optional shelf placement. It does not distinguish itself from sibling creation tools like create_chapter, create_page, or create_shelf, so an agent gets no routing help, but the core action is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase "optionally placing it on a shelf" hints that shelf_id is optional, but there is no explicit when-to-use guidance, no prerequisites, and no mention of alternatives among the many sibling creation tools. The agent must infer usage entirely.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_chapterCreate chapterC
Create a chapter in a book. Chapters group pages and can't be nested.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| tags | No | Tags as {name, value}. When updating, this replaces all existing tags. | |
| book_id | Yes | ||
| description | No | Short plain-text description |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and largely doesn't: it says nothing about permissions, whether creation requires an existing book, what happens on duplicate names, or what the response looks like. The one useful behavioral fact is the non-nesting constraint, which is a real but small contribution for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, purpose first and the caveat second, with no filler or restated boilerplate. Appropriate size for the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A mutation tool with no annotations, no output schema, and a 50%-documented schema needs more than two lines. Missing prerequisites, side effects, and parameter meaning leave the agent under-informed for a create operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 50% (tags and description documented, name and book_id not), so the description is the place to compensate β but it mentions no parameters at all. It only implies via 'in a book' that a book_id is needed; the required name and the tag-replacement semantics go unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a chapter in a book') and adds a domain fact β chapters group pages and can't be nested β that helps distinguish it from create_page/create_book/create_shelf. It never names those siblings explicitly, so differentiation is implied rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance, no alternatives named, and no prerequisites (e.g. that book_id must reference an existing book) beyond the bare 'you can't nest chapters' constraint. The agent must infer placement from the sibling list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_pageCreate pageA
Create a page from Markdown, inside a chapter (chapter_id) or directly in a book (book_id). Check first that a page on this topic doesn't already exist β updating beats duplicating.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| tags | No | Tags as {name, value}. When updating, this replaces all existing tags. | |
| book_id | No | Put the page directly in this book (ignored if chapter_id is set) | |
| markdown | Yes | Page body. Don't repeat the page name as a leading # heading β BookStack shows it as the title. | |
| chapter_id | No | Put the page in this chapter |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden for a mutation tool. It usefully discloses the duplication risk, but says nothing about required permissions, reversibility, or what happens when placement params conflict β schema covers that last point, yet auth and failure behavior remain undisclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences: the create action and destination are front-loaded, then the dedup advice. No filler or redundancy; every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-param mutation tool with no annotations and no output schema, the description covers purpose, placement, and the dedup caution but omits permissions, return shape, and error behavior. It is adequate but leaves real gaps an agent would need before calling confidently.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 80%, so the schema already explains book_id, chapter_id, markdown, and tags. The description's 'inside a chapter (chapter_id) or directly in a book (book_id)' largely restates the schema's placement semantics without adding format or precedence detail beyond it. Baseline 3 applies when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a page') plus the input format ('from Markdown') and where it lands (chapter_id or book_id), which implicitly separates it from create_book/create_chapter/create_shelf. It never names a sibling explicitly, so differentiation is by resource name rather than a direct contrast.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete precondition: 'Check first that a page on this topic doesn't already exist β updating beats duplicating,' which routes the agent toward update_page over create. It stops short of naming the tool (search/update_page) to use for that check, so the workflow link is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_shelfCreate shelfC
Create a shelf (a group of books), optionally with books on it.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| tags | No | Tags as {name, value}. When updating, this replaces all existing tags. | |
| book_ids | No | Books to put on the shelf, in order | |
| description | No | Short plain-text description |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden, and it discloses almost nothing: no permission requirements, no uniqueness/duplicate handling for the name, no side effects, and no mention of what creation returns. The parenthetical defining a shelf adds conceptual clarity but not behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence that front-loads the action and resource, with zero filler. It is efficient, though arguably terse to the point of under-specification rather than optimally structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-parameter mutation tool with no annotations and no output schema, the description is too thin: it omits return values, error/duplicate behavior, and any creation constraints. The richer schema details (tag replacement, ordering) partially compensate but the description itself leaves meaningful gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 75%, so most parameters (tags, book_ids, description) are already documented in the schema, including the ordering and tag-replacement semantics. The description only loosely echoes book_ids with 'optionally with books on it' and adds nothing about name, tags, or description beyond what the schema states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a shelf') and clarifies the domain concept with a parenthetical ('a group of books'), plus notes the optional book attachment. This distinguishes it from sibling create_* tools (create_page, create_book, create_chapter) by resource, though it does not explicitly contrast with them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this versus alternatives (e.g., update, create_book) and no stated prerequisites or preconditions. The only hint is the phrase 'optionally with books on it', which implies the book_ids path but is not framed as usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
deleteDelete itemADestructive
Move a page, chapter, book or shelf to the BookStack recycle bin (restorable by an admin). Deleting a book or chapter deletes everything inside it; deleting a shelf keeps its books. Only delete when the user explicitly asked for it.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| type | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
destructiveHint=true already flags danger, but the description adds non-obvious behavior: this is a soft delete into a recycle bin that an admin can restore, and it details cascade semantics per type (book/chapter delete contents; shelf preserves books). That is exactly the context an agent needs before invoking a destructive operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, no filler, and the most decision-relevant facts (recycle bin, restorable, cascade rules) come before the usage caveat. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and only a destructiveHint annotation, the description supplies what is missing: reversibility, cascade scope per type, and a gating condition for invoking it. Nothing an agent needs to call this safely is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the load. It does explain the behavioral meaning of each `type` value through the cascade rules, adding real value over the bare enum, but the `id` parameter's expected value/format is never addressed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Move a page, chapter, book or shelf to the BookStack recycle bin') rather than the generic name/title. It also names the exact object types accepted, so an agent can distinguish it from create_*/update_* siblings without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-to-use constraint: 'Only delete when the user explicitly asked for it,' which is strong safety guidance for a destructive tool. It does not name an alternative (e.g., update or a soft-archive sibling), so it falls short of full when/when-not/alternatives routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edit_pageEdit page textA
Exact find-and-replace in a page's Markdown source β the cheap way to fix or extend part of a page without resending all of it. old_text must match the source exactly (read the page with get first). Only for Markdown-editor pages; for WYSIWYG pages use update_page.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| new_text | Yes | Replacement text (empty string deletes old_text) | |
| old_text | Yes | Exact text to find, including whitespace and Markdown syntax | |
| replace_all | No | Replace every occurrence instead of requiring exactly one |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose the critical behavioral constraint that old_text must match the source exactly, plus the Markdown-editor-only restriction. It does not cover failure behavior (e.g. what happens when no match is found), permissions, or reversibility, which keeps it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences, zero filler. The core behavior is front-loaded, and the constraint/routing information follows in a compact clause chain.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a four-parameter mutation tool with no output schema and no annotations, the description covers the mechanism, the exact-match requirement, and the sibling routing needed to call it correctly. It stops short of describing error outcomes (no match, multiple matches) and permissions, leaving a modest gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75% and the schema already documents old_text ('exact text to find, including whitespace and Markdown syntax'), new_text (empty deletes), and replace_all (default false). The description reinforces the exact-match semantics of old_text but adds no syntax or format detail beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Exact find-and-replace in a page's Markdown source') with the mechanism and the value proposition ('cheap way to fix or extend part of a page without resending all of it'). It explicitly distinguishes itself from the closest sibling, update_page, by editor type.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit alternative and the condition that selects it: 'Only for Markdown-editor pages; for WYSIWYG pages use update_page.' It also prescribes the prerequisite workflow ('read the page with get first'), leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getGet BookStack itemARead-only
Open one item by id. page β full content as Markdown plus its location. book β table of contents (chapters and pages). chapter β its pages. shelf β its books.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| type | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With only readOnlyHint=true declared, the description carries most of the behavioral burden, and it does disclose the shape of the result per type (Markdown content + location for pages, chapter/page TOC for books, etc.). It stops short of covering error cases (invalid id, missing item) or permissions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short clauses, zero filler, front-loaded with the core action and then the per-type return mapping. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by spelling out the return shape for each type. What remains missing (error behavior, permission/visibility constraints) is minor for a single-item read.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must explain the parameters, and it does give real meaning to every 'type' enum value (page/book/chapter/shelf) and clarifies that 'id' selects one specific item. It says nothing about id formatting or scope/visibility limits.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (open one item) plus the resource (BookStack item) and enumerates what 'item' means per type. It is clearly distinguishable from search/list/create/update/delete siblings by implication, though it never names an alternative explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: fetch a single known item by id, as opposed to search or list. No explicit when-to-use/when-not guidance and no alternative tool is named, so the agent must infer the boundary from the sibling names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
listList BookStack itemsARead-only
List shelves, books, chapters or pages. Use it to see what exists (e.g. all books) or to find recently updated pages (sort=updated). To see what's inside a book, use get on the book instead.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | updated = most recently updated first | name |
| type | Yes | ||
| count | No | ||
| offset | No | ||
| book_id | No | Chapters/pages only: restrict to this book | |
| name_contains | No | Only items whose name contains this text |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds that listing returns existence-style results rather than contents and hints at sort behavior, but says nothing about pagination (count/offset) or return shape, which matters for a 6-param list tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the resource scope, then usage, then the alternative. No filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a read-only list tool with no output schema and 6 parameters, the description adequately covers purpose, use cases, and the get-vs-list distinction. Its only real gap is pagination/return behavior, which is a minor omission for a listing endpoint.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%, so the description must carry some weight: it enumerates the type enum values inline and demonstrates the sort parameter ('sort=updated'). However, it adds no meaning for count, offset, book_id, or name_contains, and the sort explanation duplicates the schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('List') and enumerates the exact resources (shelves, books, chapters, pages), so it is immediately distinguishable from the create_*/update_*/delete siblings. It also names the related read tool ('get') it is not.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states two use cases ('see what exists', 'find recently updated pages') and routes the agent to an alternative ('To see what's inside a book, use get on the book instead'). Both when-to-use and when-to-use-something-else are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
searchSearch BookStackARead-only
Full-text search across shelves, books, chapters and pages. Returns matches with [type:id] refs, their location and a text snippet. BookStack search syntax works in query: "exact phrase", [tag] or [tag=value], {in_name:word}, {updated_by:me}, {created_by:me}.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| type | No | Only return this kind of item | |
| count | No | ||
| query | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description earns credit for disclosing the return shape (matches with [type:id] refs, location, and text snippet), which the agent would otherwise not know since there is no output schema. It does not mention pagination behavior despite page/count parameters existing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, zero filler: purpose first, then return shape, then the query grammar that is the genuinely non-obvious part. Nothing could be cut without losing information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly explains what comes back, and it supplies the query syntax the thin schema omits. It falls short only on pagination semantics (the role of page/count) and on distinguishing itself from the 'list' sibling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 25% β query has no schema description at all β so the description must carry that burden, and it does by spelling out the exact BookStack query grammar ("exact phrase", [tag=value], {in_name:word}, {updated_by:me}, {created_by:me}). The type enum is documented in the schema, but page and count are unexplained in both places.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (full-text search) and enumerates the entity types searched (shelves, books, chapters, pages), which is more precise than the bare name 'search'. It does not, however, differentiate itself from the sibling 'list', which likely also enumerates these entity types β an agent still has to infer which retrieves by keyword vs. paging.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the presence of full-text syntax strongly suggests 'use this when you want keyword matching', but the description never says when to prefer it over the sibling 'list' or 'get', nor any exclusions. For a search tool sitting next to a list tool, an explicit routing sentence is the missing piece.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
updateUpdate shelf, book or chapterA
Rename a shelf/book/chapter or change its description or tags; move a chapter (with its pages) to another book; add or remove books on a shelf. For pages use update_page / edit_page.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| name | No | ||
| tags | No | Tags as {name, value}. When updating, this replaces all existing tags. | |
| type | Yes | ||
| description | No | New plain-text description | |
| add_book_ids | No | Shelves only: books to add | |
| move_to_book_id | No | Chapters only: move the chapter into this book | |
| remove_book_ids | No | Shelves only: books to take off the shelf |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden; it does disclose non-obvious behavior ('move a chapter (with its pages)'), which is useful. However, it omits mutation semantics such as whether omitted fields are left unchanged, whether tags replacement is destructive (that fact lives only in the schema), and any permission requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the primary update operations and ending with the routing exclusion. Every clause carries information an agent needs; nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a multi-entity mutation tool with no annotations and no output schema, the description covers the full operation set and the page-edit exclusion. It leaves some behavior implicit (side effects, error/precondition handling for mismatched type and id), but with the schema documenting per-type parameters the coverage is close to sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 63%, so there are gaps; the description compensates by mapping capabilities to entity types, e.g. moving a chapter (move_to_book_id) and adding/removing books on a shelf (add_book_ids/remove_book_ids). It adds context beyond the schema's terse 'Shelves only'/'Chapters only' notes, though it does not define all 8 parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the specific verb+resource combinations: rename shelf/book/chapter, change description or tags, move a chapter, and add/remove books on a shelf. It also explicitly routes page edits away from this tool by naming update_page/edit_page, so an agent can separate it from siblings like create_book or delete without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear condition for the main alternative: 'For pages use update_page / edit_page.' That is an explicit when-to-use-else rule, but it does not clarify other boundaries (e.g. update vs create_*, or when removal should use delete instead of remove_book_ids).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_pageUpdate pageA
Replace a page's content, add to its end/start (mode), rename it, retag it or move it. For a small change inside an existing page prefer edit_page. WYSIWYG pages stay WYSIWYG (the Markdown is converted to HTML).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| mode | No | replace = markdown becomes the whole body; append/prepend = add it to the end/start | replace |
| name | No | New page name | |
| tags | No | Tags as {name, value}. When updating, this replaces all existing tags. | |
| markdown | No | New content, applied according to mode | |
| move_to_book_id | No | Move the page to the top level of this book | |
| move_to_chapter_id | No | Move the page into this chapter |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It does disclose a non-obvious trait β that WYSIWYG pages stay WYSIWYG and Markdown is converted to HTML β which is genuinely useful. However, it never warns that replace mode overwrites existing content, that tags are replaced wholesale, or what auth/permissions are needed for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences: the capability list is front-loaded and the alternative/routing note follows. No filler or redundant restatement of the name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter mutation tool with no annotations and no output schema, the description covers capabilities, the sibling alternative, and one important rendering behavior. It is nearly complete, though the destructive nature of replace mode and tag-replacement side effects are left to the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 86%, so the schema already documents id, mode, name, tags, markdown, and move targets. The description restates the mode options and adds the Markdown-to-HTML conversion note, but adds little semantic detail beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (update) and resource (page) and then enumerates its capabilities: replace/append/prepend content, rename, retag, move. It explicitly distinguishes itself from the sibling edit_page, so an agent can route correctly without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"For a small change inside an existing page prefer edit_page" gives a clear routing rule against the most confusable sibling. It stops short of stating explicit when-not conditions (e.g. bulk updates, new pages) or prerequisites, but the key alternative is named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
11 tool updates
v0.1.0- First observed
create_book - First observed
create_chapter - First observed
create_page - First observed
create_shelf - First observed
delete - First observed
edit_page - First observed
get - First observed
list - First observed
search - First observed
update - First observed
update_page
TDQS
Scored across 11 tools
Most tools have clearly distinct purposes: search, list, and get cover different retrieval modes, and create_* are resource-specific. The main ambiguity is between edit_page and update_page, plus the generic 'update' versus 'update_page', though the descriptions explicitly clarify when to use each.
Page and creation tools follow a clean verb_noun pattern (create_page, update_page, edit_page, create_book, create_chapter, create_shelf), but read/update/delete tools are bare verbs (search, list, get, update, delete). This mixes conventions within the same set.
11 tools is well-scoped for a BookStack integration, covering the four entity types (shelf, book, chapter, page) without bloat. Each tool earns its place in the workflow.
Full lifecycle coverage exists: create for all four entity types, read via get/list/search, update via update_page/edit_page/update, and delete across types. Minor gaps like attachments or user/role management are outside the core wiki scope and unlikely to block agents.
Maintenance
Related MCP Connectors
- FlowdexOAuthdk.flowdex
Read and write your team's shared, AI-readable wiki from any MCP client.
Hosted markdown project wikis your team's AI assistants read, search, and update over MCP.
Self-hostable team wiki; agents read & write it via MCP; Atlas turns your repo into a cited wiki.
A cited wiki of your GitHub repo: search, read pages, find symbols and ask, with line citations.
Related MCP Servers
- AlicenseBqualityBmaintenanceEnables interaction with BookStack knowledge management systems through the BookStack API. Supports searching, reading, creating, and updating documentation content with secure authentication and dual transport modes for flexible deployment.17297 npm37MIT
- AlicenseBqualityDmaintenanceEnables AI models to interact with BookStack wiki instances through a comprehensive API interface. Supports content management (books, chapters, pages), user administration, search functionality, and content export in multiple formats.416 npmMIT
- AlicenseBqualityAmaintenanceConnects BookStack knowledge bases to Claude through 47+ tools covering complete CRUD operations for books, pages, chapters, shelves, users, search, attachments, and permissions. Enables full management of BookStack content and configuration through natural language.56215 npm91MIT
- AlicenseBqualityDmaintenanceEnables AI assistants to manage BookStack knowledge bases with tools for creating, reading, updating, and deleting pages, books, and shelves, as well as searching content.24215 npm4MIT