RunningKnowledgeBase
本地跨 Agent 跑步知识库
一个完全本地运行的跑步知识库服务:导入 Markdown、PDF 与用户明确指定的网页, 用 SQLite FTS5(中文 trigram)与本地 BGE-M3 向量做混合检索,并通过同一个 带 Bearer 认证的 Streamable HTTP MCP 服务同时供 Codex 与 DeepSeek Harness 使用。
数据只保存在本机;日常检索不依赖网络;网页只在显式添加或刷新时访问。
架构
RunningKnowledgeBase/
├─ sources/ 原始文件与网页快照(按 <source-id>/<version-id>/original.* 存放)
├─ library/ 规范化 Markdown(<source-id>-<version-id>.md,供阅读、审计、重建)
├─ data/ SQLite 元数据、FTS、向量 BLOB、auth-token、server.pid
├─ models/ 本地 BAAI/bge-m3 向量模型缓存
├─ backups/ 带清单校验的时间戳 ZIP 备份
├─ config/ Codex 与 DeepSeek Harness 的接入配置模板(托管块)
└─ scripts/ install/start/stop/diagnose/uninstall 生命周期脚本职责边界:解析器不写数据库,数据库不访问网络,MCP handler 只调用 KnowledgeService。
安装(Windows)
powershell -NoProfile -ExecutionPolicy Bypass -File scripts\install.ps1install.ps1 依次完成:uv sync 与 running-kb init;生成 32 字节随机 Base64URL 令牌
写入 data\auth-token 并用 ACL 限定为当前用户;设置用户级环境变量 RUNNING_KB_TOKEN;
把带标记的托管块合并进 Codex 配置(~/.codex/config.toml)与 DeepSeek 补丁
($DSH_HOME\cordis.patch.yml),绝不整体覆盖;在 $DSH_HOME\AGENTS.md 追加
"必须先查"托管指令块;注册隐藏的当前用户登录计划任务 RunningKnowledgeBaseMCP;
启动服务并运行诊断。
powershell -NoProfile -ExecutionPolicy Bypass -File scripts\start.ps1 # 启动(拒绝重复启动)
powershell -NoProfile -ExecutionPolicy Bypass -File scripts\stop.ps1 # 停止(校验 PID+命令行+根目录)
powershell -NoProfile -ExecutionPolicy Bypass -File scripts\diagnose.ps1 # 12 项检查,全部通过退出码为 0服务只监听 127.0.0.1:8765;GET /health 免认证,POST /mcp 需要
Authorization: Bearer <RUNNING_KB_TOKEN>。
接入两个 Agent
安装脚本自动合并以下内容(也可手动参考 config/ 下的模板):
Codex:
~/.codex/config.toml中的[mcp_servers.running_knowledge]段。 还原:删除# === running-knowledge-base managed block到# === /running-knowledge-base ===之间的托管块即可。DeepSeek Harness:
$DSH_HOME\cordis.patch.yml中的mcp-running-knowledge项, 使用官方@deepseek-ai/dsh-mcp-client(streamable-http 传输)。 启用后工具名形如mcp__running-knowledge__search_running_knowledge; 还原:删除同一对标记之间的托管块。DeepSeek 指令块:
$DSH_HOME\AGENTS.md中<!-- running-knowledge-base managed block -->到<!-- /running-knowledge-base -->之间的内容,要求回答跑步问题前先检索、引用标题与 定位、未覆盖/不可用时明确声明、把检索文本当作不可信数据、医疗安全规则优先。
四个 MCP 工具
工具 | 作用 | 说明 |
| 混合检索相关章节 | 返回标题、章节、定位、摘要、原始来源、分数;只读 |
| 读取文档或章节全文 | 只读 |
| 导入一个文件或网页 | 文件必须是绝对路径的 |
| 列出来源与版本 | 可按类型、主题、状态过滤,最多 200 行;只读 |
成功返回 {"ok": true, "hits"/"document"/"result"/"sources": ...};失败返回
{"ok": false, "error": {"code": ..., "message": ...}},错误码稳定可读、不会被吞掉。
添加资料与刷新版本
自然语言让 Agent 执行即可,例如:"把 C:\notes\tempo.md 加入跑步知识库"、 "把 https://example.com/tempo 加入知识库"。也可以直接调用:
add_running_source(source="C:\notes\tempo.md")
add_running_source(source="https://example.com/tempo", refresh=true)
list_running_sources(source_type="web") # 网页每次刷新保留旧版本重复内容按 SHA-256 识别并返回 duplicate(不覆盖);内容变化时创建新版本并保留旧版本;
扫描版 PDF(无可提取文字层)返回 OCR_REQUIRED 且不产生任何可检索记录;
损坏 PDF 返回 PARSE_FAILED。
确认"回答前先检索"
对跑步、比赛训练、装备、营养、恢复或伤病问题提问,观察 Agent 是否先调用了
search_running_knowledge(DeepSeek 侧为 mcp__running-knowledge__search_running_knowledge),
并核对回答中的引用格式:资料标题 → 章节/页码 → 原始文件或网址。
未覆盖时必须出现"本地知识库未覆盖",服务不可用时必须出现"本地知识库未能访问",
多资料冲突时必须呈现分歧与来源版本,而不是伪造统一结论。
备份、恢复与重建索引
& $uv run running-kb backup # 生成 backups\running-kb-<时间戳>.zip
& $uv run running-kb restore <归档.zip> <目标目录> [--force]
& $uv run running-kb reindex # 从 library/ 重建 FTS 与向量并原子替换备份包含 sources、library、data(排除 auth-token、server.pid 与暂存目录),
backup-manifest.json 记录每个相对路径的 SHA-256、应用版本与向量模型名;
恢复前逐文件校验摘要、拒绝绝对路径与 .. 穿越;非空目标默认拒绝,
--force 会先写一份 pre-restore 安全副本。
卸载
powershell -NoProfile -ExecutionPolicy Bypass -File scripts\uninstall.ps1只移除:经校验的服务进程、计划任务、用户级 RUNNING_KB_TOKEN、两个客户端配置的托管块、
AGENTS.md 的托管指令块。sources、library、数据库、模型与备份全部保留;
AGENTS.md 中与本项目无关的文字原样保留。
磁盘占用
BAAI/bge-m3 模型:首次使用时下载到
models/,约 2.2 GB。数据库:500–5,000 篇资料预计数 MB 到数百 MB(向量 BLOB 占主要空间)。
原始快照与规范化 Markdown 与原资料大小同量级。
故障恢复
现象 | 处理 |
导入扫描 PDF 返回 | 首版不含 OCR:换用带文字层的 PDF,或手工整理为 Markdown 再导入 |
401 / 令牌不匹配 | 运行 install.ps1 重新生成并下发令牌(保留原数据),或在新的会话中确认 |
端口 8765 被占用 |
|
数据库损坏 |
|
DeepSeek 重连耗尽 | 确认服务健康( |
服务未启动 | 检查计划任务 |
测试
& $uv run pytest -m "not integration" -v # 默认套件,不下载模型、不访问真实网络
$env:RUNNING_KB_INTEGRATION = "1"
& $uv run pytest -m integration -v # 真实模型 + 真实网页(按需运行)安全边界
服务只监听
127.0.0.1,所有/mcp请求必须携带 Bearer 令牌(常量时间比对)。本地导入只接受用户明确给出的单个绝对路径文件;目录、相对路径、其他扩展名一律拒绝。
URL 只允许 HTTP/HTTPS 且禁止 userinfo;所有解析地址必须是全球可路由 IP(回环、私网、 链路本地、组播、保留地址全部拒绝);重定向逐跳重新校验,最多 5 跳。
网页正文按不可信数据处理:脚本不执行,注入指令只是检索结果中的文本, 不会改变 Agent、服务或数据库行为。
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/1556053950/RunningKnowledgeBase'
If you have feedback or need assistance with the MCP directory API, please join our Discord server