-
Notifications
You must be signed in to change notification settings - Fork 815
Open
Description
#以下是来自Codex的设计方案
mcp-server-implementation-plan.md
BookStack MCP Server 实施方案
基于现有 BookStack 结构(Beego 应用,文档内容在
document_store.go/md_document_store,搜索逻辑在document_search_result.go、elasticsearch.go),为 Agent 提供类似 Context7 的信息获取能力。
方案概览
| 项目 | 说明 |
|---|---|
| 目标 | 提供 MCP Server,让 Agent 可检索书籍/文档、获取内容片段,并遵守书籍私有/权限规则 |
| 推荐架构 | 独立 MCP Sidecar(与 BookStack 同库/同配置),最小侵入、易于部署与回滚 |
| 备选架构 | 内置到 BookStack 进程里(同 HTTP 服务或独立端口),开发更省但耦合更深 |
MCP 能力设计
Resources(推荐)
| Resource URI | 说明 |
|---|---|
bookstack://books |
书籍列表(支持分页/分类/私有过滤) |
bookstack://books/{book_id} |
书籍元信息 |
bookstack://books/{book_id}/docs |
文档目录树/扁平列表 |
bookstack://docs/{doc_id} |
文档全文(markdown/text/html 可选) |
bookstack://docs/{doc_id}#section={heading} |
按标题段落切分后的内容 |
bookstack://recent |
最近更新文档 |
Tools(推荐)
| Tool | 参数 | 说明 |
|---|---|---|
search_docs |
query, book_id?, limit?, member_token? |
全文检索并返回片段 + doc_id |
get_doc |
doc_id, format=markdown|text|html |
按需拉取完整内容 |
list_books |
category?, include_private?, member_token? |
书籍列表 |
list_docs |
book_id, tree=true|false |
文档列表/目录 |
get_book_outline |
book_id |
树状目录 |
Prompts(可选)
| Prompt | 说明 |
|---|---|
summarize_doc(doc_id) |
生成摘要(配合 Agent 侧使用) |
检索与内容生成
| 类别 | 方案 |
|---|---|
| 默认检索 | 复用 document_search_result.go 的 SQL LIKE 搜索(易落地) |
| 可选增强 | 接入现有 ES(elasticsearch.go),有则用 ES,否则降级 SQL |
| 内容来源 | 优先 DocumentStore.Content 或 DocumentStore.Markdown,避免仅用 HTML |
| 切分策略 | 按 Markdown 标题切分(或固定字数切分),产出 section_id 便于引用 |
权限与安全
| 类别 | 方案 |
|---|---|
| 身份 | 新增 MCP Token(配置项或数据库表);或复用已有成员系统(member_id + token) |
| 授权 | 遵循 books.privately_owned 和 relationship 角色校验 |
| 隔离 | 只读访问;限制 IP 白名单/速率;支持只公开内容模式 |
实施步骤(里程碑)
| 阶段 | 目标 |
|---|---|
| M0 基线 | 确定传输方式(stdio/HTTP SSE)、部署形态(sidecar/内置)、鉴权方案 |
| M1 MVP | MCP Server 骨架 + list_books/list_docs/get_doc/search_docs(SQL 检索) |
| M2 权限 | 接入角色校验、私有书籍访问控制、审计日志 |
| M3 体验 | 加入 Markdown 分段/引用、缓存、ES 可选增强 |
| M4 文档 | 配置说明、Agent 侧接入示例、运维与监控 |
配置建议
# MCP Server 配置
mcp.enabled: true
mcp.bind: "0.0.0.0:9090"
mcp.auth_token: "your-secure-token"
mcp.allow_private: false
# Elasticsearch(可选)
ELASTICSEARCH_ON: true
ELASTICSEARCH_HOST: "http://localhost:9200"风险与规避
| 风险 | 规避措施 |
|---|---|
| 隐私泄露 | 严格按书籍权限过滤(relationship + 私有书籍 token) |
| 性能 | 搜索与全文读取限流/分页;热点缓存(书籍目录、最近更新) |
| 内容质量 | 优先 Markdown/Content,必要时 HTML→Text 转换 |
待确认事项
Important
在开始实施前,请确认以下决策点:
- 部署形态:采用 Sidecar MCP 还是内置到 BookStack 进程?
- 鉴权方式:独立 MCP Token 还是复用成员登录/Token?
- 检索增强:是否接入 ES 做全文检索增强?
下一步
如果你认可此方案,我可以进一步:
- 把实施拆成可执行任务
- 给出详细接口定义
- 提供路由与数据库字段映射
Metadata
Metadata
Assignees
Labels
No labels