Thought Forest 与 ChatGPT 知识库集成实践

记录 2026-08-08 将 ChatGPT Workspace Agent 通过 Secure MCP Tunnel 接入本地 Thought Forest 的过程、故障、决策与验证证据。

#type / journal #status / growing #tech / ai #discipline / obsidian #resource / chatgpt #resource / mcp #resource / obsidian

[!abstract] 实践结论 最终可用方案不是“让 ChatGPT 任意写 D 盘”,而是用 12 个受限知识库工具、两阶段批准、服务端哈希校验、归档和索引重建组成闭环。网页端承担推理和审批,本机承担受限数据操作。

[!info] related notes

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 浏览器页面完成:

  1. Workspace Admin/Skills;
  2. Upload skill;
  3. 选择生成 ZIP;
  4. 等待扫描;
  5. 在 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、权限和菜单变化
  • 避免在笔记和交接文档中保留真实密钥
创建于 2026/8/8 更新于 2026/8/8