关于 trip2g
trip2g 是一个可自托管的服务,把 Obsidian 笔记库发布为网站,同时以 MCP 服务的形式向 AI Agent 提供检索与读取能力。它面向希望让同一份 Markdown 笔记同时服务读者和 Agent 的用户。项目以单个 Go 二进制文件加 SQLite 运行,笔记以纯 Markdown 文件保存。
主要功能
- 01混合全文与语义检索
- 02通过 note_html 按 id、路径或匹配读取笔记
- 03similar 工具查找相似笔记
- 04federated 系列工具跨对等节点检索
- 05笔记版本快照并镜像到 git
- 06可自托管,单进程运行
适用场景
- 01让 AI 客户端检索个人或团队的 Obsidian 笔记库
- 02将同一套笔记同时发布为网站和 Telegram 频道内容
- 03在多个知识库之间进行联邦检索
MCP 相关
trip2g 作为 MCP 服务运行,在每个 hub 上暴露 search、note_html、similar 及 federated_* 等工具,并提供 instructions 提示词。访问范围按调用方的订阅权限限定。
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
https://trip2g.com/_system/mcpclaude mcp add --transport http trip2g-trip2g https://trip2g.com/_system/mcp{"mcpServers":{"trip2g-trip2g":{"type":"http","url":"https://trip2g.com/_system/mcp"}}}在 Cursor 中打开{"servers":{"trip2g-trip2g":{"type":"http","url":"https://trip2g.com/_system/mcp"}}}在 VS Code 中打开{"mcpServers":{"trip2g-trip2g":{"type":"http","url":"https://trip2g.com/_system/mcp"}}}{"mcpServers":{"trip2g-trip2g":{"serverUrl":"https://trip2g.com/_system/mcp"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
工具
11| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| pid | number | 否 | 非负整数(uint64)的笔记 ID,逐字复制自搜索结果的 note_id 字段。不是路径、slug 或 match_id。优先使用 path |
| href | string | 否 | 字符串形式的笔记 href,逐字复制自搜索结果的 href 字段 |
| last | number | 否 | 仅列出最新的指定数量小节,而非全部小节。一篇笔记每天增加一个带日期的章节,一年后就会有数百个章节;此选项可避免为了到达最新的几个章节而读取整个列表。summary、total_children 和 omitted 会说明省略了什么,因此有界列表不会被误认为完整列表。范围相接或重叠时会返回全部内容,而不会重复列出一段。 |
| path | string | 否 | 字符串形式的笔记路径,例如 "concepts/maska-i-glubina.md" — 逐字复制自搜索结果的 note_path 字段。引用笔记的默认且首选方式 |
| first | number | 否 | 仅列出这么多个最早的子部分。与 `last` 配合使用,可了解主题的起始情况和当前状态,省略中间部分;摘要会标记省略部分所在的位置。 |
| note_id | number | 否 | 与 pid 相同:非负整数(uint64)的笔记 ID,逐字复制自搜索结果的 note_id 字段。不是路径、slug 或 match_id。优先使用 path |
| toc_path | array | 否 | 要展开的节点的面包屑路径,例如 ["Chapter 1"]。顶层可省略或传入 []。 |
详细介绍
trip2g
将你的 Obsidian 知识库发布为网站。为 AI Agent 提供可自托管的 MCP 记忆库。
在 Obsidian 中写作,按下同步,笔记即刻上线。同一个可自托管枢纽既为读者提供网站,也为 Agent 提供 MCP 端点,还能发布到 Telegram 并限制付费内容的访问。其底层是一个 Markdown 操作系统:每篇笔记都是一个文件,同一篇笔记既是供人阅读的网页,也是供 Agent 调用的工具。
为什么选择 trip2g
- 你的笔记,一用两得。 一个 Markdown 文件既能呈现为供读者阅读的页面,也能响应任何 MCP 客户端发出的
search/note_html调用。不需要导出,也不会把知识副本锁在你无法读取的向量存储中。 - 你的数据归你所有。 纯 Markdown、可通过 git 克隆的知识库,每次编辑都是清晰可读的差异。不依赖 SaaS 服务,你也可以随时通过
git clone迁出。 - 只需运行一个进程。 单个 Go 二进制文件搭配 SQLite。无论在笔记本电脑、小型虚拟机还是容器中,它都能以相同方式启动。采用 MIT 许可证。

快速开始
30 秒内查看运行效果。 将公共知识枢纽添加到任意 MCP 客户端,然后向它提问。它会搜索所有已连接的知识库,并附上来源作答:
{
"mcpServers": {
"trip2g": {
"url": "https://trip2g.com/_system/mcp"
}
}
}
运行你自己的枢纽:
git clone https://github.com/trip2g/trip2g && cd trip2g/quickstart
docker compose up
打开 http://localhost:8081,使用 [email protected] 和验证码 111111 登录,然后从主页下载预配置的 Obsidian 知识库。只需一个容器,文件保存在本地磁盘,支持全文搜索——无需其他服务。
不想使用终端?获取一个免费的云实例。所有方案(单个二进制文件、使用 TLS 的 Docker Compose、fly.io)都收录在自托管指南中。
文档 · 入门指南 · MCP 工具 · 自托管 · 参与贡献
一切皆为笔记
Unix 将一切视为文件。trip2g 将一切视为笔记。
一个全局命名空间,按路径寻址,由人和 Agent 共享。笔记是 Markdown 文件:frontmatter 是其元数据,正文是其内容。同一篇笔记既会作为网页提供(展示界面),也会通过 MCP 提供(Agent 的系统调用接口);每次编辑都会保存到 note_versions,并同步到 git。因此,历史记录是清晰可读的差异,而不是二进制块。
human A human B human C
│ │ │
▼ ▼ ▼
agent A agent B agent C
│ │ │
▼ ▼ ▼
┌────────┐ MCP ┌────────┐ MCP ┌────────┐
│ hub A │ ◄───► │ hub B │ ◄───► │ hub C │
└────────┘ └────────┘ └────────┘
▲ ▲ ▲
└─── humans browse · agents query ──┘
同一个枢纽既服务于人(提供带订阅、RSS 和 Telegram 的网站),也服务于 Agent(提供 MCP)。你的数据始终以纯 Markdown 格式保存,可随时迁出。
映射
trip2g 借用了操作系统的词汇,因为这些基本构件一一对应。每行都标注了其实现状态:已上线表示代码已在 main 上运行,分支表示代码已在 feat/agent-runtime 上运行,计划中表示有设计文档。
| 操作系统概念 | trip2g 基本构件 | 状态 |
|---|---|---|
| 文件系统 | 一个按路径寻址的笔记命名空间,由人类和 Agent 共享 | 已上线 |
| 文件 | 笔记:Markdown frontmatter(元数据)+ 正文(内容) | 已上线 |
| 覆盖文件系统 | frontmatter 补丁(Jsonnet)覆盖笔记,而不触及源文件 | 已上线 |
| 快照 | note_versions + 以数据库为准的 git 镜像(gitapi) | 已上线 |
| 基于 git 的文件系统 | 通过 Smart HTTP(/_system/git)对知识库执行 git clone/pull/push | 已上线 |
| 系统调用 | MCP 工具:search、note_html、similar、federated_* | 已上线 |
| 网络栈 | 联邦:将一个查询分发到多个对等中心 | 已上线 |
| 虚拟主机 | 通过 route/routes frontmatter 按域名路由 | 已上线 |
| 调度器 | cron Webhook(next_run_at)+ goqite 工作线程池 | 已上线 |
| 进程分发 | Webhook 投递:创建/更新/移除笔记 → POST | 已上线 |
| 进程间通信 | 将笔记用作事件总线:一个 Agent 的写入会触发下一个 Agent | 已上线 |
| 显示服务器 | 网站渲染:默认模板 + Jet 模板、mermaid、datachart | 已上线 |
| 页面缓存 | 匿名渲染页面缓存,按版本键控 | 已上线 |
| 输出目标 | 将笔记发布到 Telegram 频道,并保留链接 | 已上线 |
| 标准输入 | frontmatter 中的表单,提交内容按笔记存储 | 已上线 |
| 权限(用户) | 子图 + 订阅 ACL、管理员、API 密钥 | 已上线 |
| 身份验证提供方 | 电子邮件魔法链接、Google/GitHub OAuth、OIDC SSO | 已上线 |
| 权限(Agent) | 作用域令牌中每个 Webhook 的 read_patterns/write_patterns | 已上线 |
| 凭据存储 | 加密的 secrets / federation_secrets(AES-256-GCM) | 已上线 |
| 能力令牌 | HAT:已签名的短 TTL 令牌,ae=true 可提升为管理员权限 | 已上线 |
| 控制界面 | 看板笔记(layout: kanban) | 已上线(布局),分支(Agent 接线) |
| 内核配置 | 功能标志,在启动时验证(缺少依赖时触发 panic) | 已上线 |
| 进程执行器 | 内部大模型运行循环(agentruntime),工具允许列表 + 上限 | 分支 |
| 包管理器 | 角色即笔记:添加一条笔记,fleet 即可注册该 Agent | 分支 |
| 资源限制 | 每次运行的令牌数和步骤数上限,且不可覆盖 | 分支 |
系统调用:MCP 服务
每个中心都内置 MCP 服务。Agent 不会直接接触数据库,而是调用一组精简的 MCP 工具,访问范围限定为调用者的订阅权限。
| 工具 | 用途 |
|---|---|
search | 混合全文 + 语义搜索 |
note_html | 按 ID、路径或匹配项读取笔记(或其中一个章节) |
similar | 查找与指定笔记相似的笔记 |
federated_search / federated_similar / federated_note_html | 同上,并分发到多个对等中心 |
instructions | 由作者为 Agent 定义的提示词 |
可在笔记 frontmatter 中定义自定义工具(mcp_method:)。
网络栈:联邦
graph LR
O[Obsidian vault] --> H[your hub]
T[Telegram] --> H
H <-->|MCP federation| H2[peer hub]
H2 --> B[their bases]
H -->|/_system/mcp| A[agent]
H2 -->|/_system/mcp| A
与可信的人或组织建立对等中心。每个中心都会按知识库控制访问权限。一个 Agent 问题即可触达所有已连接知识的并集。循环会像 IP 数据包一样受到限制:每个中心都会根据逐跳计数器(X-MCP-Federation-Depth 标头)强制执行 max_depth,并且每次调用都会携带一个有效期较短、经 HMAC 签名的令牌。
每个中心本身都是一个 Markdown OS,因此网络是操作系统之间的网状网络,就像互联网是计算机之间的网络一样。下表列出的是常见形态,并非全部形态。协议不预设拓扑,因此你可以构建任意拓扑。
| 拓扑 | 配置 | 结果 |
|---|---|---|
| 单机 | 一个中心,多个知识库 | 一次查询即可检索你的所有笔记、书籍和课程 |
| 朋友 | 每个人运行一个中心,中心之间建立对等连接 | 汇集所有人的知识 |
| 公司 | 中心化中心 + 每位员工各自的中心 | 可查询内部经验知识和文档 |
| B2B | 两个星型拓扑,一个桥接点 | 共享知识而不合并系统 |
进程调度与调度器:Webhook Agent
在内核侧运行 Agent 的机制。已在 main 上发布。
- 变更 Webhook。 创建/更新/移除笔记时,会向 Agent 发送 POST 请求,Agent 则通过 API 写回笔记。Glob 过滤可选择触发该 Agent 的笔记,HMAC 会为投递签名,而
max_depth可防止递归。 - 定时 Webhook。 按计划运行 Agent(
0 9 * * *)。next_run_at列和每分钟运行一次的系统 cron 负责调度,goqite 工作池则提供按队列划分的并发控制和优先级。支持同步或异步运行,并可选带上指令上下文。
Agent 本身可以运行在任何地方。这些 Webhook 只负责投递事件并接收写回的笔记。
用户空间:Agent 集群
正在
feat/agent-runtime上开发,尚未合并到main。
核心思路是:编辑笔记时,会启动一个作用域受限的服务端 Agent 运行。与本地编辑器或静态构建器不同,Agent 在中心上运行,作用域受笔记的 glob 模式限制,而不是在你的笔记本电脑上运行。
Agent 本身就是一条笔记。其 frontmatter 是配置:model、tools、read_patterns/write_patterns、trigger_on、for_each、max_depth、timeout_seconds。正文是指令,是一个可引用已更改笔记的 Jet 模板。fleet 守护进程会监视 Agent 文件夹,解析各个角色笔记,并将其注册为指向自身的变更 Webhook。添加笔记即可安装 Agent,移除笔记即可卸载 Agent。
graph LR
E[note edited] --> W[change webhook fires]
W --> F[fleet /deliver]
F --> R[agentruntime loop]
R -->|search / read_note| KB[(knowledge base)]
R -->|write_note / patch_note| KB
KB -.re-trigger.-> E
监视的笔记发生变化时,trip2g 会触发 Webhook,集群则运行一个作用域受限的循环(agentruntime):模型会获取指令和作用域内的上下文,并调用 search/read_note/write_note/patch_note。读写操作受角色 glob 模式限制;不可覆盖的令牌数与步数上限会限制运行;max_depth 则会阻止重新触发形成循环。trip2g 始终只是一个普通事件源。指令、作用域和触发器都保存在笔记中。
此功能所依赖的基础设施(变更/定时 Webhook、作用域令牌、投递任务)已在 main 上发布。feat/agent-runtime 新增的是笔记内 LLM 执行器(agentruntime)和集群协调器(internal/fleet、cmd/fleet)。
控制界面:看板
看板是一条带有 layout: kanban 的笔记,卡片则是类似 - ship the docs @status:doing @assigned:bob 的行。编辑卡片就是编辑笔记,因此,任何 Agent 都会使用的同一触发器,也可以驱动一个负责读取看板并在原处对卡片执行 patch_note 的分流 Agent。笔记既是人类指挥工作的方式,也是 Agent 的输入和输出。
看板布局(docs/_layouts/kanban.html)和独立的 kanban_template 已在 main 上发布。将看板接入集群是 feat/agent-runtime 的一部分。
显示服务:模板和渲染器
有两种方式,每个知识库任选其一。
A. 默认模板(无需代码,仅需 frontmatter)。通过小组件和内容块组合页面:
---
header: "[[Navigation]]"
left_sidebar: [TOC, inlinks]
content: [selfcontent, magazine]
magazine_include_files: "blog/**/*.md"
footer: "[[Footer]]"
---
通过 quicktemplate 渲染。笔记也可以通过 content_type frontmatter 渲染为 HTML、JSON 或 RSS。
B. 自定义 Jet 模板(完全掌控)。将自己的 .html 文件放入布局文件夹,并通过 layout: path/to/template 切换。模板可以获取 markdown AST,因此你可以遍历各个部分、渲染特定内容,并深入定制 HTML。基于 Jet 模板引擎 构建。
在这两种方式之上,还可以使用渲染器扩展。后端只会在笔记请求时按需加载这些扩展:mermaid 图表,以及可将引用的 CSV 转换为图表的 datachart 小组件(通过 ECharts)。笔记声明所需的内容,页面只会加载相应脚本。
Telegram:笔记变成频道帖子
同一批笔记可以按计划或即时发布到 Telegram 频道。trip2g 会保留链接:指向已有独立帖子的笔记的 wiki 链接会指向该帖子;尚未发布的笔记则会回退到网站上的笔记页面,因此不会出现失效链接。编辑笔记并重新同步后,频道帖子也会自动更新。查看完整指南 →
表单:结构化输入
笔记不仅可以展示内容,还可以收集输入。在 frontmatter 中添加 form: 块后,trip2g 会在页面上呈现表单,通过 GraphQL API 接收提交内容,并将每份提交关联到该笔记。
---
title: Say hello
form:
fields:
- name: email
type: email
required: true
- name: message
type: text
max_length: 2000
---
字段类型和验证器定义在 frontmatter 中;Cloudflare Turnstile 默认保护公开表单,can_submit 则限制可以提交的用户。提交内容会进入管理面板和 GraphQL API,并通过电子邮件发送给知识库管理员。只需定义一次规范,然后通过 form_ref: 重用;也可以通过 frontmatter 补丁将表单附加到整个文件夹。从操作系统的角度来看,这就是笔记的标准输入。查看完整指南 →
Git:知识库就是一个仓库
trip2g 通过 /_system/git,以 Git Smart HTTP 提供整个知识库。你可以像操作任何仓库一样克隆、拉取和推送。数据库是权威数据源;Git 树并不是存放在磁盘上的检出副本,gitapi 会在你与端点交互时按需生成内容,推送操作则会应用到笔记中。因此,你可以使用 git clone 备份知识库(完整历史也会一并下载),并通过提交来编写脚本修改内容,而不必使用 API。
变现
通过子图付费墙将笔记分组成付费产品,同时让免费笔记保持公开。付款可通过加密货币(NowPayments)、Patreon 或 Boosty 完成。
来源
| 来源 | 状态 |
|---|---|
| Obsidian | 已就绪:知识库保留在本地,支持双向同步 |
| Telegram | 已就绪:发布到频道并镜像历史记录 |
| RSS 输出 | 已就绪:每个知识库均提供订阅源 |
| Notion | 计划中 |
| Google Drive | 计划中 |
| Linear、Slack 归档、RSS 导入 | 计划中 |
自托管
cd quickstart && docker compose up
trip2g 在 SQLite 上以单个进程运行,无需搭建数据库服务,因此无论是在笔记本电脑、小型 VM 还是容器上,都可以用相同方式启动枢纽。需要高可用性时,可以添加只读副本来横向扩展读取能力,同时由单个主节点处理写入(位于 feat/read-replica 分支)。
查看完整指南 → · MIT · 仅使用 SQLite 运行;语义搜索需要嵌入 API(OpenAI 或任何兼容端点),而全文搜索可离线运行。
技术栈
| 后端 | Go、FastHTTP、gqlgen(GraphQL) |
| 数据库 | SQLite + Litestream,用于流式备份 |
| 搜索 | bleve(全文搜索)+ 通过任何兼容 OpenAI 的 API 生成嵌入向量(语义搜索) |
| Markdown | Goldmark:维基链接、frontmatter |
| 模板 | quicktemplate(默认)+ Jet(自定义) |
| 图表与示意图 | mermaid、ECharts(datachart) |
| 前端 | $mol、TypeScript |
| 资源文件 | 兼容 S3(开发环境使用 MinIO) |
灵感来源
操作系统的构想改编自 Markdown as an Operating System,也源于 Unix 的 everything is a file。我们铭记于心的三句话:
- Markdown 是通用基础。 所有工具和模型都已能读取的单一文件;从中渲染网站、信息流和 git 历史记录。
- 文件是进程之间的接口。 Agent 写入一条笔记,就会触发下一个 Agent,因此无需单独的队列 API 来协调。
- 人类可读的差异就是审计日志。 每次编辑都会生成一个
note_version和一个提交,五秒内即可读懂并还原。
许可证
MIT
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。