Thought Forest 与 ChatGPT 知识库集成实践
记录 2026-08-08 将 ChatGPT Workspace Agent 通过 Secure MCP Tunnel 接入本地 Thought Forest 的过程、故障、决策与验证证据。
[!abstract] 实践结论 最终可用方案不是“让 ChatGPT 任意写 D 盘”,而是用 12 个受限知识库工具、两阶段批准、服务端哈希校验、归档和索引重建组成闭环。网页端承担推理和审批,本机承担受限数据操作。
[!info] related notes
- 稳定架构: ChatGPT 网页端维护本地 Obsidian 的架构
- 实施指南: 构建本地 MCP, 连接 Tunnel, 配置 App、Skill 与 Agent
- 故障模式: 故障排查
Thought Forest 与 ChatGPT 知识库集成实践
时间和目标
时间:2026-08-08。
目标:
- 在 ChatGPT 网页端提问时实时检索本地 Thought Forest;
- 复用 ChatGPT Workspace Agent 的使用额度和交互体验;
- 让 Agent 可以提出、预览并在二次确认后合并笔记;
- 正式知识库仍位于 `D:\home\thought-forest\z`;
- 保留 diff、归档、审计和索引;
- 不开放 D 盘根目录,不公开本地 MCP 服务。
初始架构
ChatGPT Workspace Agent
-> Thought Forest KB custom MCP App
-> OpenAI Secure MCP Tunnel
-> tunnel-client on Windows
-> scripts/kb-mcp/server.ts
-> Thought Forest vault
Skill `thought-forest-remote-maintainer` 作为流程层,要求先查重和规划,再经过两次独立确认。
本地实现
本地 `kb-mcp` 最终提供 12 个工具:
- 9 个概况、搜索、读取和规范/关系工具;
- 2 个 proposal 写入工具;
- 1 个精确 proposal 合并工具。
`apply_proposal` 的加入改变了旧设计:过去需要用户回终端运行 CLI 合并,现在第二次确认后可以在聊天内完成合并、归档和索引。CLI 只保留为兜底。
安全实现包括:
- 服务端 proposal ID;
- proposal SHA-256;
- patch base SHA-256;
- 只允许 `z/*.md`;
- symlink 与路径穿越防护;
- 单提案消费;
- 按日期归档;
- JSONL 审计;
- 自动索引。
烟雾测试最终通过全部用例,包括篡改、stale target 和 traversal 拒绝。
Tunnel 故障与根因
最初运行:
npm run kb:mcp:tunnel:access
返回 `404 Tunnel not found`。早期判断把问题归因于 Organization/Tunnel RBAC,因为 404 可能用于隐藏不可见资源。
进一步核对 Platform 管理页、API 请求和本地配置后发现,真实根因是 Tunnel ID 抄错了多个相邻字符。修正 `.env` 与两个 profile 后:
- access 成功;
- daemon 正常;
- healthz/readyz 通过;
- 控制面 polling 通过;
- 11 个旧工具成功启动。
后续加入 `apply_proposal` 后工具数量变为 12。
形成的经验
- 404 既可能是授权,也可能是标识符错误;
- Owner 是哪个层级的 Owner 必须说清楚;
- 在改 RBAC 前先核对原始 ID;
- response request ID 应保留用于 Support;
- 不要在 access 失败时启动 poller。
ChatGPT App 版本问题
已有 `Thought Forest KB` App 保存了旧工具快照:
- 只有 11 个工具;
- 多个只读工具被错误标为 WRITE/DESTRUCTIVE/OPEN WORLD。
为避免污染旧连接,创建新版 App,确认:
- 12 个工具;
- `read_note` 等为 READ;
- `apply_proposal` 为 WRITE/DESTRUCTIVE;
- 封闭 Vault 工具不再显示 OPEN WORLD。
完成后:
- 旧 App 重命名为 `Thought Forest KB (legacy)`;
- 新 App 使用正式名称 `Thought Forest KB`;
- 暂未直接删除旧 App,保留可逆性。
Skill 上传方式
Skill 在本地维护并打包为 ZIP。上传通过已登录的 ChatGPT 浏览器页面完成:
- Workspace Admin/Skills;
- Upload skill;
- 选择生成 ZIP;
- 等待扫描;
- 在 Agent Builder 的 Add skill 中选择并挂载。
这一步没有使用 CLI 直接上传。CLI 负责同步源文件、构建 ZIP 和验证包内容。
Workspace Agent 配置
创建 Draft Agent:
- 名称:Thought Forest 知识库维护员;
- 挂载新版 Thought Forest KB App;
- 挂载 thought-forest-remote-maintainer Skill;
- 允许完整 12 个工具;
- `propose_new_note`、`propose_note_patch`、`apply_proposal` 均要求用户确认;
- 指令明确两次批准和只有成功结果才能报告已合并;
- 保持 Private/Draft,未自动 Publish。
App 绑定主要通过 Workspace Agents 管理能力完成;Skill 挂载和 Preview 使用 ChatGPT Agent Builder 网页完成。
已完成验收
只读 Preview Prompt:
只读验收:调用 Thought Forest KB 获取知识库概况,列出笔记总数、索引时间和工具是否可用。不要创建提案,不要修改任何内容。
结果:
- 工具调用成功;
- 当时读取到 3,317 篇笔记;
- 索引状态较新;
- 未创建提案;
- 未修改任何内容。
该数字只代表当时快照,不是长期产品事实。
尚需完成的真实验收
- 第一次批准后只生成 inbox 提案;
- 第二次批准后自动合并、归档、审计和重建索引;
- 拒绝审批时不写入;
- proposal 篡改或目标并发修改时拒绝。
这些验收完成前 Agent 应保持 Draft。
关键决策
不写 D 盘根目录
正式写入只进入 Vault 的 `z/`,因为知识库需要规范、链接、索引和 Git 历史。
不把 Skill 当安全边界
Skill 只指导模型;真正边界在 MCP Server。
不把 ChatGPT 订阅当 API 余额
网页 Agent 的推理使用 ChatGPT/Workspace 额度;API Platform 仍独立计费。Tunnel key 用于控制面认证,不代表本地工具再次调用模型 API。
不自动发布
创建和配置 Agent 只改变 Draft。Publish 是独立的外部可见状态变化,应在四场景完成后由用户明确决定。
后续动作
- 完成剩余三个写入/拒绝验收场景
- 验收后 Publish Workspace Agent
- 确认 legacy App 无依赖后再断开
- 定期刷新官方文档中的 Beta、权限和菜单变化
- 避免在笔记和交接文档中保留真实密钥