BookStack MCP 是 AI Skill Hub 本期精选MCP工具之一。综合评分 7.5 分,整体质量较高。我们推荐使用将其纳入你的 AI 工具库,帮助提升工作效率。
BookStack MCP 是一款遵循 MCP(Model Context Protocol)标准协议的 AI 工具扩展。通过 MCP 协议,它可以让 Claude、Cursor 等主流 AI 客户端直接访问和操作外部工具、数据源和服务,实现 AI 能力的无缝扩展。无论是文件操作、数据库查询还是 API 调用,都可以通过自然语言在 AI 对话中直接触发,极大提升生产效率。
BookStack MCP 是一款遵循 MCP(Model Context Protocol)标准协议的 AI 工具扩展。通过 MCP 协议,它可以让 Claude、Cursor 等主流 AI 客户端直接访问和操作外部工具、数据源和服务,实现 AI 能力的无缝扩展。无论是文件操作、数据库查询还是 API 调用,都可以通过自然语言在 AI 对话中直接触发,极大提升生产效率。
# 方式一:通过 Claude Code CLI 一键安装
claude skill install https://github.com/bees-roadhouse/bookstack-mcp
# 方式二:手动配置 claude_desktop_config.json
{
"mcpServers": {
"bookstack-mcp": {
"command": "npx",
"args": ["-y", "bookstack-mcp"]
}
}
}
# 配置文件位置
# macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
# Windows: %APPDATA%/Claude/claude_desktop_config.json
# 安装后在 Claude 对话中直接使用 # 示例: 用户: 请帮我用 BookStack MCP 执行以下任务... Claude: [自动调用 BookStack MCP MCP 工具处理请求] # 查看可用工具列表 # 在 Claude 中输入:"列出所有可用的 MCP 工具"
// claude_desktop_config.json 配置示例
{
"mcpServers": {
"bookstack_mcp": {
"command": "npx",
"args": ["-y", "bookstack-mcp"],
"env": {
// "API_KEY": "your-api-key-here"
}
}
}
}
// 保存后重启 Claude Desktop 生效
An MCP (Model Context Protocol) server that gives Claude full access to a BookStack instance. Built in Rust with tokio/axum as a Cargo workspace with pluggable database backends and optional semantic vector search.
semantic_search: standard (default, vector + keyword + Markov-blanket blend) and precision (4-stage cascade — semantic → keyword → Markov-blanket → cross-encoder). An optional rerank: bool flag layers a cross-encoder pass on top of the standard top-N (v0.13.0; replaces the pre-v0.13.0 mode: "rerank"). Per-page access control enforced via BookStack's API on every result./settings) — browser-based admin configuration page (token-gated via the same /authorize flow). Surfaces only the global server fields the index worker needs (hive_shelf_id, user_journals_shelf_id).POST /rerank when BSMCP_RERANK_PROVIDER is configured. Three providers: local (in-process ONNX cross-encoder via fastembed, default BAAI/bge-reranker-v2-m3), voyage (Voyage's /v1/rerank), openai (any OpenAI-shape rerank endpoint — covers Voyage/Jina/Cohere-via-shim/self-hosted). Off by default; consumed by semantic_search's rerank: true flag (refinement on the standard mode) + mode: "precision" (cascade), and by search_content's rerank: true flag (v0.13.0).BSMCP_SEMANTIC_SEARCH=true in your server envBSMCP_WEBHOOK_SECRET to a random string (16+ characters)BSMCP_EMBED_TOKEN_ID / BSMCP_EMBED_TOKEN_SECRET)reembed tool (via Claude) to trigger initial embedding of all pagesGo to Settings > Webhooks > Create Webhook in your BookStack instance:
| Field | Value |
|---|---|
| **Name** | MCP Semantic Search |
| **Endpoint URL** | https://your-mcp-host/webhooks/bookstack |
| **Active** | Yes |
Events to select: - Page Create - Page Update - Page Delete
Custom header (required for verification):
X-Webhook-Secret: YOUR_WEBHOOK_SECRET
The YOUR_WEBHOOK_SECRET value must match BSMCP_WEBHOOK_SECRET in your server environment. The server uses constant-time comparison to verify the header.
After saving, any page create/update/delete in BookStack automatically queues a re-embedding job. The embedder picks it up within seconds (configurable via BSMCP_EMBED_POLL_INTERVAL).
The cross-encoder reranker is off by default. semantic_search (default mode: "standard", rerank: false) and search_content (default rerank: false) both work fine without it. To enable the rerank: true flag on either tool, or to use mode: "precision" on semantic_search:
1. Pick a provider and set BSMCP_RERANK_PROVIDER on the embedder to one of: - local — in-process ONNX cross-encoder via fastembed. No API key. Default model: BAAI/bge-reranker-v2-m3 (~600 MB, downloads on first run). Reuses BSMCP_MODEL_PATH for the cache directory. - voyage — Voyage AI's /v1/rerank. Set BSMCP_RERANK_API_KEY. Default model: rerank-2. - openai — any OpenAI-shape /v1/rerank endpoint (Voyage, Jina, Cohere-via-shim, self-hosted). Requires all of BSMCP_RERANK_API_KEY, BSMCP_RERANK_API_URL, and BSMCP_RERANK_MODEL (no upstream default — OpenAI itself has not shipped a rerank API). 2. Restart the embedder. On startup it logs Reranker: <provider> <model> and starts answering POST /rerank. Without configuration it logs Reranker: disabled (BSMCP_RERANK_PROVIDER unset or 'none') and /rerank returns 503. 3. Use the reranker from a tool call: - semantic_search with mode: "standard", rerank: true — runs the standard pipeline, then the cross-encoder re-orders the top-N. Equivalent to the pre-v0.13.0 mode: "rerank". - semantic_search with mode: "precision" — wider candidate pool, cross-encoder is the ranker of record (4-stage cascade; rerank is always on). - search_content with rerank: true — BookStack keyword search, then the cross-encoder re-orders the matched results. In all three cases the response includes scoring.rerank per result and stats.{rerank_ms, rerank_provider, rerank_model, candidates_reranked}. If the reranker is disabled, the server surfaces a clear error pointing at BSMCP_RERANK_PROVIDER so callers can drop the flag and retry.
Per-provider config blocks are documented under Reranker Providers.
```bash cp .env.example .env
```bash cp .env.example .env
docker compose -f docker/docker-compose.yml up -d ```
This starts four containers: - bsmcp-postgres — PostgreSQL 17 with pgvector extension - bsmcp-server — MCP server (port 8080) - bsmcp-embedder — Background embedding service (--role=embedder, default); also serves /rerank when a reranker is configured - bsmcp-worker — Reconciliation worker (same image as the embedder, started with --role=worker): initial walk on cold start, webhook + cron job consumption, periodic delta walk
docker compose -f docker/docker-compose.sqlite.yml up -d ```
This starts three containers (server + embedder + worker) sharing a SQLite database file.
| Variable | Required | Default | Description |
|---|---|---|---|
BSMCP_BOOKSTACK_URL | Yes | - | Your BookStack instance URL |
BSMCP_ENCRYPTION_KEY | Yes | - | 32+ char key for AES-256-GCM token encryption |
BSMCP_DB_BACKEND | No | sqlite | Database backend: sqlite or postgres |
BSMCP_DATABASE_URL | If postgres | - | PostgreSQL connection string |
BSMCP_DB_PATH | No | /data/bookstack-mcp.db | SQLite database path |
BSMCP_PUBLIC_DOMAIN | No | - | Public domain for OAuth redirects (e.g. mcp.example.com) |
BSMCP_INTERNAL_DOMAIN | No | - | Internal/Docker-network domain |
BSMCP_HOST | No | 0.0.0.0 | Bind address |
BSMCP_PORT | No | 8080 | Bind port |
BSMCP_INSTANCE_NAME | No | - | Instance name shown to AI |
BSMCP_INSTANCE_DESC | No | - | Instance description shown to AI |
BSMCP_SEMANTIC_SEARCH | No | false | Enable semantic search tools |
BSMCP_EMBEDDER_URL | No | http://bsmcp-embedder:8081 | Embedder HTTP endpoint |
BSMCP_WEBHOOK_SECRET | If semantic | - | BookStack webhook secret |
BSMCP_ACCESS_TOKEN_TTL | No | 86400 | Access token TTL in seconds (24h) |
BSMCP_REFRESH_TOKEN_TTL | No | 7776000 | Refresh token TTL in seconds (90d) |
BSMCP_BACKUP_INTERVAL | No | - | Hours between backups (0 = disabled) |
BSMCP_BACKUP_PATH | No | /data/backups | Backup directory |
BSMCP_BOOKSTACK_RATE_LIMIT_PER_MIN | No | 180 | Per-process BookStack API request cap. Lower if multiple processes share a token and you see 429s. |
| Variable | Required | Default | Description |
|---|---|---|---|
BSMCP_EMBED_TOKEN_ID | Yes | - | BookStack API token ID for crawling |
BSMCP_EMBED_TOKEN_SECRET | Yes | - | BookStack API token secret |
BSMCP_EMBED_PROVIDER | No | local | Embedding backend: local (fastembed ONNX), ollama, openai (or OpenAI-compatible), voyage. See [Embedding Providers](#embedding-providers) for per-provider config. |
BSMCP_EMBED_MODEL | No | (per provider) | Model name (see [Embedding Providers](#embedding-providers)) |
BSMCP_EMBED_API_KEY | If openai | - | API key for OpenAI embedding provider |
BSMCP_EMBED_API_URL | No | (per provider) | Base URL for Ollama or OpenAI-compatible endpoint |
BSMCP_EMBED_DIMS | No | (auto) | Embedding dimensions (auto-detected for Ollama) |
BSMCP_MODEL_PATH | No | /data/models | ONNX model cache directory (local provider only) |
BSMCP_EMBED_CPUS | No | 0 (unlimited) | Docker CPU limit for embedder |
BSMCP_EMBED_JOB_TIMEOUT | No | 14400 | Seconds before stuck jobs reset |
BSMCP_EMBED_BATCH_SIZE | No | 32 | Chunks per embedding batch |
BSMCP_EMBED_DELAY_MS | No | 50 | Delay between pages (API throttle) |
BSMCP_EMBED_POLL_INTERVAL | No | 5 | Seconds between job queue polls |
BSMCP_EMBED_ON_STARTUP | No | false | true = auto-embed on startup, clean = clear all embeddings first |
BSMCP_EMBED_FAILURE_THRESHOLD | No | 10 | Failed pages before a job is marked failed |
BSMCP_EMBED_CONSECUTIVE_ABORT | No | 10 | Consecutive failures before a job aborts early |
BSMCP_EMBED_HOST | No | 0.0.0.0 | Embedder listen address |
BSMCP_EMBED_PORT | No | 8081 | Embedder listen port |
BSMCP_RERANK_PROVIDER | No | (unset) | Cross-encoder rerank provider: local, voyage, openai, none. Off by default; enables POST /rerank on the embedder, which the server consumes for semantic_search/search_content rerank: true and semantic_search mode: "precision". See [Reranker Providers](#reranker-providers). |
BSMCP_RERANK_MODEL | If reranker on | (per provider) | Reranker model. Defaults: BAAI/bge-reranker-v2-m3 (local), rerank-2 (voyage). Required for openai. |
BSMCP_RERANK_API_KEY | If voyage/openai | - | API key for external rerank provider. |
BSMCP_RERANK_API_URL | If openai | (per provider) | Base URL. Voyage defaults to https://api.voyageai.com; openai requires explicit URL. |
The embedder image hosts both the embedder loop and the reconciliation worker loop. Select which runs per container via --role (CLI flag, primary) or BSMCP_ROLE (env fallback). Default is embedder.
| Variable / flag | Default | Description |
|---|---|---|
--role=embedder / BSMCP_ROLE=embedder | (default) | Runs the embed job queue, the /embed + /rerank HTTP endpoints, and the cross-encoder when configured. Does NOT spawn the reconciliation worker — operators running embedder-only get no automatic index retry-chain reconciliation. |
--role=worker / BSMCP_ROLE=worker | - | Runs the reconciliation worker only: initial full walk, periodic delta walk, lifecycle housekeeper across index_jobs + embed_jobs. No HTTP listener, no ONNX model loaded. |
--role=both / BSMCP_ROLE=both | - | Runs both loops in one process. Useful for single-host SQLite deployments. |
The CLI flag wins over the env. Setting both (compose command: + BSMCP_ROLE) is belt-and-suspenders — recommended for clarity in compose files.
Read when the embedder is running with --role=worker or --role=both. The worker shares the same database as the server and owns the index_jobs queue.
| Variable | Required | Default | Description |
|---|---|---|---|
BSMCP_BOOKSTACK_URL | Yes | - | Same as server |
BSMCP_ENCRYPTION_KEY | Yes | - | Must match the server's (the DB layer initializes its encryption context on every connection) |
BSMCP_INDEX_TOKEN_ID | Yes* | - | Admin BookStack API token ID for the worker. Falls back to BSMCP_EMBED_TOKEN_ID if unset, so single-token deployments don't have to duplicate creds. |
BSMCP_INDEX_TOKEN_SECRET | Yes* | - | Admin BookStack API token secret. Falls back to BSMCP_EMBED_TOKEN_SECRET. |
BSMCP_DB_BACKEND | No | sqlite | Must match the server's (shared DB) |
BSMCP_DB_PATH | No | /data/bookstack-mcp.db | SQLite path |
BSMCP_DATABASE_URL | If postgres | - | PostgreSQL connection string |
BSMCP_INDEX_DELTA_INTERVAL_SECONDS | No | 300 | Cadence of the periodic delta walk. 0 = disable the delta walk (webhook-driven only). |
\* Required, but the fallback to BSMCP_EMBED_TOKEN_* covers most setups.
Read by the worker role's lifecycle housekeeper. Apply to both embed_jobs and index_jobs.
| Variable | Required | Default | Description |
|---|---|---|---|
BSMCP_JOB_TIMEOUT_SECS | No | 3600 | Hard timeout — any job running longer than this is failed. |
BSMCP_JOB_RECONCILE_SECS | No | 300 | Reconciler poll interval (scan for failed jobs and retry them). |
BSMCP_JOB_MAX_RETRY_CHAIN | No | 5 | Max retry-chain length before a job is given up on. |
BSMCP_JOB_CLOSE_GRACE_SECS | No | 30 | Audit-grace before succeeded/cancelled jobs are archived to closed status. |
See .env.example for the full list with comments.
| Method | Path | Description |
|---|---|---|
GET | /mcp/sse | SSE connection (MCP 2024-11-05) |
POST | /mcp/sse | Streamable HTTP (MCP 2025-03-26) |
POST | /mcp/messages/?sessionId=<id> | Send MCP JSON-RPC messages (SSE transport) |
GET | /health | Health check |
POST | /webhooks/bookstack | BookStack webhook receiver (semantic search) |
GET | /status | Embedding progress page with live progress bar |
GET | /.well-known/oauth-authorization-server | OAuth metadata (RFC 8414) |
GET | /.well-known/oauth-protected-resource | Protected resource metadata (RFC 9728) |
GET | /authorize | Login form for BookStack API token |
POST | /authorize | Validate credentials and issue auth code |
POST | /token | OAuth token exchange |
POST | /register | Dynamic client registration (RFC 7591) |
**Optional: Switch to Ollama/OpenAI embeddings** — set `BSMCP_EMBED_PROVIDER`:bash BSMCP_EMBED_PROVIDER=ollama BSMCP_EMBED_MODEL=nomic-embed-text BSMCP_EMBED_API_URL=http://ollama:11434 ``` Switching provider triggers an automatic clean re-index.
If the file is already hosted at a public URL the MCP server can reach, you can skip the staging flow entirely and pass the url parameter directly to upload_image or upload_attachment. The server will fetch the file and forward it to BookStack.
bookstack-mcp 是一个基于 Rust 开发的 MCP (Model Context Protocol) 服务端程序。它通过 tokio 和 axum 构建,旨在为 Claude 提供对 BookStack 实例的完整访问权限。该项目支持可插拔的数据库后端,并集成了可选的语义向量搜索功能,让 AI 能够深度理解并检索您的知识库内容。
本项目支持对 BookStack 核心资源(如 shelves, books, chapters, pages, attachments)进行完整的 CRUD 操作。除了标准的全文检索外,还具备强大的语义向量搜索(Semantic Vector Search)能力。通过 embeddings 技术,用户可以使用自然语言进行搜索。搜索模式分为 `standard`(结合向量、关键词与 Markov-blanket 混合算法)和 `precision`(采用语义、关键词、Markov-blanket 及重排序的四阶段级联算法)两种。
在开始之前,请确保您已准备好以下环境:1. 一个已启用 API 访问权限的 BookStack 实例;2. 一个在 BookStack 用户配置中生成的 API token;3. 已安装 Docker 和 Docker Compose,以便进行容器化部署。
项目支持通过 Docker Compose 进行快速部署。对于需要高性能向量检索的场景,建议使用 PostgreSQL 模式;对于轻量化需求,可使用 SQLite 模式。若需启用语义搜索,需在环境变量中设置 `BSMCP_SEMANTIC_SEARCH=true` 并配置相应的 `BSMCP_EMBED_TOKEN`。首次运行 embedder 容器时,系统会自动下载约 1.3GB 的 ONNX 模型。
快速上手指南:对于推荐的 PostgreSQL 部署方式,请复制 `.env.example` 为 `.env` 并进行配置,随后运行 `docker compose up -d`。如果是简单的 SQLite 部署,请使用对应的 `docker-compose.sqlite.yml` 文件。若需启用 Reranker 功能以提升搜索精度,需在 embedder 端配置 `BSMCP_RERANK_PROVIDER`(支持 local ONNX 模式)。
项目通过 `.env` 文件进行配置。关键参数包括 `BSMCP_BOOKSTACK_URL`(实例地址)、`BSMCP_ENCRYPTION_KEY`(用于 AES-256-GCM 加密的 32 位以上密钥)以及 `BSMCP_DB_BACKEND`(选择 `sqlite` 或 `postgres`)。此外,您还可以通过配置 `BSMCP_EMBED_PROVIDER` 将嵌入模型切换为 Ollama 或 OpenAI,切换后系统会自动触发重新索引。
本项目提供符合 MCP 标准的 API 接口。支持通过 `/mcp/sse` 进行 SSE 连接(兼容 MCP 2024-11-05 标准)以及通过流式 HTTP 进行通信(兼容 MCP 2025-03-26 标准)。开发者可以通过 `POST /mcp/messages/` 发送 JSON-RPC 消息,并利用 `/health` 接口进行服务健康检查。
高质量的开源MCP工具,支持全API和语义向量搜索
该工具未明确声明开源协议,商业使用前请联系原作者确认授权范围,避免侵权风险。
AI Skill Hub 为第三方内容聚合平台,本页面信息基于公开数据整理,不对工具功能和质量作任何法律背书。
建议在沙箱或测试环境中充分验证后,再部署至生产环境,并做好必要的安全评估。
经综合评估,BookStack MCP 在MCP工具赛道中表现稳健,质量良好。如果你已有明确的使用需求,可以直接上手体验;如果还在评估阶段,建议对比同类工具后再做决策。
| 原始名称 | bookstack-mcp |
| 原始描述 | 开源MCP工具:MCP server for BookStack — 56 tools covering the full API + semantic vector sear。⭐7 · Rust |
| Topics | mcpairustbookstack |
| GitHub | https://github.com/bees-roadhouse/bookstack-mcp |
| 语言 | Rust |
收录时间:2026-05-31 · 更新时间:2026-06-01 · License:未公布 · AI Skill Hub 不对第三方内容的准确性作法律背书。
选择 Agent 类型,复制安装指令后粘贴到对应客户端