知识库管理工具

一个本地MCP服务器,通过git管理的知识库为Claude Code提供持久化记忆功能,支持文档搜索、读写、决策记录及漂移检测。

  • by Dantesong
  • TypeScript
  • 本地部署
  • 1 星标
  • 更新于
在 GitHub 查看 Dantesong/knowledge-mcp

使用说明

知识mcp

一个本地MCP服务器,通过git管理的知识库为Claude Code提供持久内存。

它的作用

通过stdio MCP向Claude Code公开9个工具:

工具 说明
kb_search 搜索所有.md文件——默认情况下为固定字符串(regex:true 选择加入),带有真实匹配计数的截断注释
kb_read 阅读文档。 {section:"heading text"} / {offset,limit} 片;默认情况下,大于40KB的文件返回标题大纲(full:true 强制)
kb_write 写入/附加到文档(自动git提交)。写入≠验证:漂移基线仅随 codeRepo 或 verified:true 更换
kb_log_decision 记录带有时间戳的技术决策
kb_index 重建 _index.md 从当前文件(始终重新生成)并返回
kb_init 扫描所有项目中的CLAUDE.md,自动导入到KB
kb_link_track 将文档链接到源代码仓库+它跟踪的路径(漂移基线)
kb_drift 自上次验证以来,文档与源代码的差异;可选的 bump 重新设定基线
kb_drift_all 漂移仪表板🟢/🟡/🔴/⚠️ 跨所有链接的文档(可选的仓库过滤器)

每个写操作都会自动提交到git--staging 只有工具本身编写的文件 (从来没有 git add -A),因此并发会话在知识库工作树中的未提交工作永远不会被无关的提交所吞噬。过大的文件(>4000行/200KB)会在工具响应中触发旋转警告。

漂移检测(添加2026-04-25)

平原 kb_write 是内容盲的:即使引用相同代码路径的其他9个文档悄无声息地漂移,每个会话调用一次也会满足Stop钩子。长期来看,知识库中存在重大信息缺口。

漂移检测通过YAML frontmatter将每个文档链接到它所记录的代码:

---
last-verified-commit: a60044b1010084ebdb0a054e661bb8e8cb85829c
last-verified-at: 2026-04-25T15:30:00.000Z
code-repo: /Users/dante/develop/auto-hotelier
code-tracks: ["packages/db/prisma/schema.prisma","packages/db/prisma/migrations/"]
---

# Doc title
... body ...

工作流程:

  1. 一次性设置 每份文件: kb_link_track 声明文档跟踪(或传递)的repo+路径 codeRepo+codeTracks 直接 kb_write)
  2. 在会话开始/阶段边界: kb_drift_all 显示哪些文档是🟢 在头部/🟡 小漂移/🔴 主要漂移/⚠️ 基线不可达
  3. 按文档钻取: kb_drift <path> 输出实际 git log <last-verified>..HEAD -- <code-tracks> 因此,您可以确切地看到文档可能尚未反映哪些提交
  4. 根据HEAD验证文档后: kb_write 和 mode:"replace", verified:true (或与 codeRepo)重新盖章 last-verified-commit. 独自写作永远不会改变基线 --v1.0在每次写入时自动盖章,让例程日志附加悄悄地擦除真正的漂移(虚假刷新)
  5. No-op 基于: kb_drift <path> bump=true 对于来源发生变化但文档的声明不需要更新的情况

如果基线提交变得不可达(重基/修改), kb_drift 报告⚠️ 使用git错误而不是false🟢 — 不可读的历史不是“零漂移”。

一种细粒度的Stop钩子变体,可以扫描 code-tracks 每个文档中更改的文件和块都存在于git历史记录中(f01e3d6“选项C”)。它是故意不部署的——一旦基线诚实了一段时间,就重新评估。

安装

git clone https://github.com/Dantesong/knowledge-mcp.git
cd knowledge-mcp
npm install
npm run build

建立你的知识库

mkdir -p ~/knowledge/{systems,ops,decisions}
cd ~/knowledge && git init
echo "# Knowledge Base" > ~/knowledge/_index.md
git add -A && git commit -m "init: knowledge base"

目录结构:

~/knowledge/
├── _index.md          ← Auto-generated index (rebuilt by kb_index)
├── systems/           ← System architecture docs
├── ops/               ← Operations & deployment docs
└── decisions/         ← Technical decision log

使用克劳德代码注册

# Global (all projects)
claude mcp add --scope user knowledge -- node /path/to/knowledge-mcp/dist/index.js

# Or with custom KB location
claude mcp add --scope user knowledge -- node /path/to/knowledge-mcp/dist/index.js -e KNOWLEDGE_DIR=/path/to/knowledge

强制挂钩(推荐)

MCP服务器提供了这些工具,但如果不强制执行,Claude将无法可靠地使用它们。此存储库包括两个用于更新知识的Claude Code挂钩 强制性的:

钩子的作用是什么

钩子 事件 行为
kb-session-start.sh SessionStart 注射 _index.md 在会话开始时进入Claude的上下文(协议规则属于 CLAUDE.md --在这里注入它们也会为每次会话支付两次相同的文本费用)。
kb-stop-guard.sh Stop 检查工作树是否有未提交的代码更改(或在过去一小时内提交),否 kb_write/kb_log_decision 被称为这次会议。如果是这样, 阻止克劳德停下 直到知识更新。

安装挂钩

步骤1:Symlink挂钩脚本 (单一来源——回购副本是活钩子; cp 而不是 ln -s 这个仓库的钩子是如何在47天内从部署的副本中漂移而不被注意的)

mkdir -p ~/.claude/hooks
chmod +x hooks/kb-session-start.sh hooks/kb-stop-guard.sh
ln -sf "$(pwd)/hooks/kb-session-start.sh" ~/.claude/hooks/kb-session-start.sh
ln -sf "$(pwd)/hooks/kb-stop-guard.sh" ~/.claude/hooks/kb-stop-guard.sh

步骤2:在Claude Code设置中注册挂钩

编辑 ~/.claude/settings.json 并添加 hooks 部分(与现有内容合并):

{
  "hooks": {
    "SessionStart": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "bash $HOME/.claude/hooks/kb-session-start.sh"
          }
        ]
      }
    ],
    "Stop": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "bash $HOME/.claude/hooks/kb-stop-guard.sh"
          }
        ]
      }
    ]
  }
}

步骤3:将知识协议添加到CLAUDE.md

附加 ~/.claude/CLAUDE.md (或您的项目级CLAUDE.md):

## Knowledge Protocol (MANDATORY — GLOBAL)

`~/knowledge/` is the **global source of truth** for all projects.

**Tools available** (via the `knowledge` MCP server, prefix `mcp__knowledge__`):
- `kb_search` — grep across all `*.md` in the knowledge base
- `kb_read` — read a specific file by relative path
- `kb_write` — write/overwrite a file (auto-commits)
- `kb_log_decision` — append a decision entry to `decisions/decisions.md`
- `kb_index` — rebuild `_index.md` from current files

**Rules:**
1. Before modifying code/schema/deployment, read the relevant knowledge docs first.
2. After completing meaningful changes, update knowledge via `kb_write`, then `kb_index`.
3. A Stop hook enforces this: code changes without a knowledge update will block session end.
4. Trivial changes (typos, formatting) are exempt — tell the user and ask for confirmation.
5. If knowledge contradicts code, stop and ask — don't silently fix either side.

步骤4:重新启动Claude代码

钩子是会话开始时的快照。关闭所有Claude Code会话并重新打开以使更改生效。

Stop钩子如何决定

stop_hook_active = true?            → allow (loop guard, prevents infinite block)
cwd in ~/knowledge/ or ~/.claude/?  → allow (excluded dirs)
cwd not in a git repo?              → allow (nothing to enforce)
working tree clean AND no commits
  in the last hour?                 → allow (no code changes to document)
session transcript has kb_write?    → allow (knowledge was updated via MCP)
none of the above                   → BLOCK (code changed, knowledge not updated)

v1.2删除了旧的“~/knowledge/ 回购不干净→ 允许“通行证”:它无法分辨 这 会话的KB更新来自并发会话的剩余脏文件,因此任何并行会话的WIP都会给其他会话一个免费通行证。转录检查是现在唯一的自动通行证。

过滤噪声(不会触发阻塞): tsconfig.tsbuildinfo, HANDOFF.md, .next/, node_modules/, dist/, build/, .DS_Store, *.log

定制

排除的目录 --编辑 EXCLUDED_DIRS 在 ~/.claude/hooks/kb-stop-guard.sh:

EXCLUDED_DIRS=(
  "$HOME/knowledge"
  "$HOME/.claude"
  # Add more dirs to exclude from enforcement:
  # "$HOME/throwaway-experiments"
)

噪声滤波器 --编辑 grep -v -E 模式 kb-stop-guard.sh 添加更多不应触发块的构建工件。

调试日志 --Stop钩子将每次调用记录到 ~/.claude/hooks/kb-stop-guard.log.

依赖项

止动钩需要 jq 用于JSON输出。macOS 15+将其包含在 /usr/bin/jq在Linux上:

# Ubuntu/Debian
sudo apt install jq
# or Homebrew
brew install jq

Bootstrap来自现有项目

安装后,运行 kb_init 要自动导入所有CLAUDE.md文件,请执行以下操作:

> Initialize my knowledge base from all my projects
  → calls kb_init(scan_dirs="~,~/dev,~/projects")

这将扫描CLAUDE.md文件,提取关键信息,并在中创建文档 ~/knowledge/systems/可多次安全运行--跳过已存在的文件。

用法

配置后,Claude Code可以直接使用这些工具:

> Search my knowledge base for "webhook"
  → calls kb_search("webhook")

> Read the hotel automation doc
  → calls kb_read("systems/hotel-automation.md")

> Add a note about the new API endpoint
  → calls kb_write("systems/api.md", "## New Endpoint\n...", "append")

> Log why we chose PostgreSQL over MongoDB
  → calls kb_log_decision("PostgreSQL over MongoDB", "Need ACID transactions for...")

多机同步

知识库是一个标准的git仓库。推送到GitHub进行多机同步:

# Machine A (after Claude writes knowledge)
cd ~/knowledge && git push

# Machine B
cd ~/knowledge && git pull

MCP服务器在每次写入时自动提交。你只需要推/拉。

环境变量

变量 默认值 描述
KNOWLEDGE_DIR ~/knowledge 知识库目录路径

运作原理

Claude Code ←→ stdio ←→ knowledge-mcp ←→ ~/knowledge/ (local files)
                                              ↓
                                          git auto-commit
                                              ↓
                                      GitHub (optional remote sync)
  • 运输:stdio(仅限本地,无网络)
  • Git:每个 kb_write 和 kb_log_decision 阶段 只有它写的文件 并承诺(git commit -m ... -- <paths>)其他会议的舞台/脏活累活未受影响。Git失败表现为 git error: … 在回应中,从未默默地咽下
  • 索引:每次写入后自动重建;标题来自第一个标记标题(frontmatter/banner safe), inbox/ 被列入
  • 安全:路径遍历保护(包括兄弟前缀dirs,如 ~/knowledge-evil);所有git/grep调用都使用argv数组——用户文本没有shell插值
  • 执行:可选挂钩阻止Claude在不更新知识的情况下结束会话

更新日志

v1.1.2(2026-06-11)

  • kb_search 上下文线 — context 参数(grep -C,默认值1,0-5):单行点击现在会携带周围的行以提供可用的上下文
  • 旋转警告 现在也提醒grep .claude/skills 对于指向移动条目的节引用(否则存档的标题引用将自动失效)
  • scripts/sync.sh 在KB仓库中 (不是这个仓库)+Mac launchd/服务器cron:双向ff仅每15-20分钟同步一次——服务器克隆曾被取消订阅2个月

v1.1.1(2026-06-11)

  • 会话启动挂钩v1.3 --知情人士: resume 完全跳过注入(原始注入已经在恢复的转录中;重新注入重复的~1.2k令牌)。每次调用日志 source +字节到 ~/.claude/hooks/kb-session-start.log 因此,在进一步修剪之前,可以测量启动/恢复/清除/紧凑分布。
  • 工具描述已修剪 --9个工具+详细的参数描述从约7.3KB的模式减少到5.5KB(在预先加载所有MCP模式的环境中,约450个令牌/会话)。

v1.1.0版本(2026-06-11)

  • 精确分期 — git add -A 远离的;工具仅存储它们编写的内容(并发会话安全)
  • 写作≠验证 --追加从不刷新 last-verified-commit;仅用以下内容替换重新盖章 verified:true 或 codeRepo;当新内容不包含任何内容时,replace继承现有的frontmatter
  • 诚实的漂移 --不可达基线报告⚠️ + git错误而不是false🟢
  • 大文件读取 — kb_read 收益 section / offset+limit / full;>40KB的文件默认返回标题大纲
  • 旋转警告 --在响应中写入超过4000行/200KB的文件
  • kb_index 实际重建 (以前只有当 _index.md 失踪)
  • kb_search 默认情况下为固定字符串, regex:true 选择加入,截断注释
  • 注射硬化 --git/grep的argv数组; kbPath 需要在KB根后面使用路径分隔符
  • 钩子v1.2 --防丢脏KB自由通行证;session start只注入索引;通过符号链接部署
  • E2E测试套件: npm run build && node test/e2e.test.mjs (33次检查)

许可证

麻省理工学院