Skip to main content
Glama

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 / get cover every read; six tools cover every write.

  • Markdown-native. Pages come back as Markdown; new pages are written as Markdown; a targeted edit_page tool does find-and-replace on a page's source instead of resending the whole thing.

  • One setup command. npm run setup asks 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 setup

setup 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_SECRET and 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 --build

Without Docker: npm install && npm run build, set the variables, npm run serve.

Variable

BOOKSTACK_URL

Your BookStack, e.g. https://wiki.example.com

MCP_PUBLIC_URL

This server's public address including the sub-path, e.g. https://tools.example.com/bookstack-mcp. The MCP endpoint is this + /mcp

MCP_AUTH_SECRET

Encrypts the tokens given to Claude: openssl rand -base64 32. Keep it secret; changing it signs everyone out

MCP_ALLOWED_REDIRECT_HOSTS

Where sign-in may redirect back to. Default claude.ai,claude.com,localhost,127.0.0.1,[::1] β€” enough for Claude; add hosts for other MCP clients, * allows any

MCP_HOST, MCP_PORT

Listen address, default 127.0.0.1:3000 (0.0.0.0 in Docker)

BOOKSTACK_READ_ONLY

true β€” read tools only

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/mcp

Then 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__document

Claude 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

search

Full-text search, with BookStack's own syntax: "exact phrase", [tag=value], {in_name:...}

list

List shelves / books / chapters / pages; filter by name or book, sort by last updated

get

Page β†’ its content as Markdown; book β†’ table of contents; chapter β†’ its pages; shelf β†’ its books

create_page

New page from Markdown, in a chapter or directly in a book

update_page

Replace content, append/prepend (mode), rename, retag, move

edit_page

Exact find-and-replace on a page's Markdown source β€” no need to resend the whole page

create_book

New book (optionally placed on a shelf)

create_chapter

New chapter in a book

create_shelf

New shelf with books on it

update

Rename / describe / tag a shelf, book or chapter; move a chapter; add or remove books on a shelf

delete

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 (get)

source as-is

converted to Markdown via BookStack's own export

update_page

writes Markdown

Markdown β†’ HTML, page stays WYSIWYG; append/prepend leave the existing HTML alone

edit_page

exact match-and-replace on the source

unavailable (no Markdown source) β€” use update_page

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

BOOKSTACK_URL

Your BookStack address, e.g. https://wiki.example.com

BOOKSTACK_TOKEN_ID

Token ID

BOOKSTACK_TOKEN_SECRET

Token Secret

BOOKSTACK_READ_ONLY

true β€” read-only: write tools aren't registered at all

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.pem to the server's env.

  • Moved the project folder β€” run npm run setup again; 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-known URLs return the main site's HTML; add the two location = /.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_SECRET isn'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 build
  • src/bookstack.ts β€” HTTP client for the BookStack API and human-readable errors

  • src/tools.ts β€” the MCP tools and the document prompt

  • src/server.ts β€” the MCP server and the model instructions, shared by both transports

  • src/index.ts β€” stdio entry point

  • src/http.ts β€” HTTP entry point: Streamable HTTP, routing under a sub-path

  • src/oauth.ts β€” OAuth sign-in with a BookStack API token, stateless encrypted tokens

  • src/setup.ts β€” the setup wizard

License

MIT

Available Tools

11 tools
create_bookCreate bookC

Create a book, optionally placing it on a shelf.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
tagsNoTags as {name, value}. When updating, this replaces all existing tags.
shelf_idNoAlso add the new book to this shelf
descriptionNoShort plain-text description

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
tagsNoTags as {name, value}. When updating, this replaces all existing tags.
book_idYes
descriptionNoShort plain-text description

TDQS

C2.8/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
tagsNoTags as {name, value}. When updating, this replaces all existing tags.
book_idNoPut the page directly in this book (ignored if chapter_id is set)
markdownYesPage body. Don't repeat the page name as a leading # heading β€” BookStack shows it as the title.
chapter_idNoPut the page in this chapter

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
tagsNoTags as {name, value}. When updating, this replaces all existing tags.
book_idsNoBooks to put on the shelf, in order
descriptionNoShort plain-text description

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 itemA
Destructive

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
typeYes

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
new_textYesReplacement text (empty string deletes old_text)
old_textYesExact text to find, including whitespace and Markdown syntax
replace_allNoReplace every occurrence instead of requiring exactly one

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 itemA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
typeYes

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 itemsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNoupdated = most recently updated firstname
typeYes
countNo
offsetNo
book_idNoChapters/pages only: restrict to this book
name_containsNoOnly items whose name contains this text

TDQS

A4.2/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
nameNo
tagsNoTags as {name, value}. When updating, this replaces all existing tags.
typeYes
descriptionNoNew plain-text description
add_book_idsNoShelves only: books to add
move_to_book_idNoChapters only: move the chapter into this book
remove_book_idsNoShelves only: books to take off the shelf

TDQS

A4.2/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
modeNoreplace = markdown becomes the whole body; append/prepend = add it to the end/startreplace
nameNoNew page name
tagsNoTags as {name, value}. When updating, this replaces all existing tags.
markdownNoNew content, applied according to mode
move_to_book_idNoMove the page to the top level of this book
move_to_chapter_idNoMove the page into this chapter

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 11 tool updatesv0.1.0
    • First observedcreate_book
    • First observedcreate_chapter
    • First observedcreate_page
    • First observedcreate_shelf
    • First observeddelete
    • First observededit_page
    • First observedget
    • First observedlist
    • First observedsearch
    • First observedupdate
    • First observedupdate_page

TDQS

A3.6/5.0

Scored across 11 tools

Disambiguation4/5

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.

Naming Consistency3/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    B
    maintenance
    Enables 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.
    17
    297 npm
    37
    MIT
  • A
    license
    B
    quality
    D
    maintenance
    Enables 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.
    41
    6 npm
    MIT
  • A
    license
    B
    quality
    A
    maintenance
    Connects 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.
    56
    215 npm
    91
    MIT