mcpField
T
trip2g

trip2g

远程服务
trip2g.com记忆与知识406 天前更新

关于 trip2g

trip2g 是一个可自托管的服务,把 Obsidian 笔记库发布为网站,同时以 MCP 服务的形式向 AI Agent 提供检索与读取能力。它面向希望让同一份 Markdown 笔记同时服务读者和 Agent 的用户。项目以单个 Go 二进制文件加 SQLite 运行,笔记以纯 Markdown 文件保存。

主要功能

  1. 01混合全文与语义检索
  2. 02通过 note_html 按 id、路径或匹配读取笔记
  3. 03similar 工具查找相似笔记
  4. 04federated 系列工具跨对等节点检索
  5. 05笔记版本快照并镜像到 git
  6. 06可自托管,单进程运行

适用场景

  1. 01让 AI 客户端检索个人或团队的 Obsidian 笔记库
  2. 02将同一套笔记同时发布为网站和 Telegram 频道内容
  3. 03在多个知识库之间进行联邦检索

MCP 相关

trip2g 作为 MCP 服务运行,在每个 hub 上暴露 search、note_html、similar 及 federated_* 等工具,并提供 instructions 提示词。访问范围按调用方的订阅权限限定。

配置

远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。

服务地址https://trip2g.com/_system/mcp
一键复制安装命令
Claude CodeTerminal
Cursor.cursor/mcp.json
VS Code.vscode/mcp.json
Claude Desktopclaude_desktop_config.json
Windsurf~/.codeium/windsurf/mcp_config.json

命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。

工具

11
参数类型必填说明
pidnumber否非负整数(uint64)的笔记 ID,逐字复制自搜索结果的 note_id 字段。不是路径、slug 或 match_id。优先使用 path
hrefstring否字符串形式的笔记 href,逐字复制自搜索结果的 href 字段
lastnumber否仅列出最新的指定数量小节,而非全部小节。一篇笔记每天增加一个带日期的章节,一年后就会有数百个章节;此选项可避免为了到达最新的几个章节而读取整个列表。summary、total_children 和 omitted 会说明省略了什么,因此有界列表不会被误认为完整列表。范围相接或重叠时会返回全部内容,而不会重复列出一段。
pathstring否字符串形式的笔记路径,例如 "concepts/maska-i-glubina.md" — 逐字复制自搜索结果的 note_path 字段。引用笔记的默认且首选方式
firstnumber否仅列出这么多个最早的子部分。与 `last` 配合使用,可了解主题的起始情况和当前状态,省略中间部分;摘要会标记省略部分所在的位置。
note_idnumber否与 pid 相同:非负整数(uint64)的笔记 ID,逐字复制自搜索结果的 note_id 字段。不是路径、slug 或 match_id。优先使用 path
toc_patharray否要展开的节点的面包屑路径,例如 ["Chapter 1"]。顶层可省略或传入 []。

详细介绍

trip2g

将你的 Obsidian 知识库发布为网站。为 AI Agent 提供可自托管的 MCP 记忆库。

在 Obsidian 中写作,按下同步,笔记即刻上线。同一个可自托管枢纽既为读者提供网站,也为 Agent 提供 MCP 端点,还能发布到 Telegram 并限制付费内容的访问。其底层是一个 Markdown 操作系统:每篇笔记都是一个文件,同一篇笔记既是供人阅读的网页,也是供 Agent 调用的工具。

CI License: MIT Release GitHub stars Go

为什么选择 trip2g

  • 你的笔记,一用两得。 一个 Markdown 文件既能呈现为供读者阅读的页面,也能响应任何 MCP 客户端发出的 search / note_html 调用。不需要导出,也不会把知识副本锁在你无法读取的向量存储中。
  • 你的数据归你所有。 纯 Markdown、可通过 git 克隆的知识库,每次编辑都是清晰可读的差异。不依赖 SaaS 服务,你也可以随时通过 git clone 迁出。
  • 只需运行一个进程。 单个 Go 二进制文件搭配 SQLite。无论在笔记本电脑、小型虚拟机还是容器中,它都能以相同方式启动。采用 MIT 许可证。

trip2g 首页

快速开始

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 生成嵌入向量(语义搜索)
MarkdownGoldmark:维基链接、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

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。