trip2g について
trip2g は、Obsidian のボルトをウェブサイトとして公開し、同じノートを MCP エンドポイント経由で AI エージェントに提供するセルフホスト型のハブです。1 組の Markdown ノートを読者とエージェントの両方に使いたいユーザーを対象としています。単一の Go バイナリと SQLite で動作し、ノートはプレーンな Markdown ファイルとして保存されます。
主な機能
- 01全文検索とセマンティック検索のハイブリッド検索
- 02ID、パス、一致条件によるノートの読み取り
- 03類似ノートを探すツール
- 04ピアハブをまたぐフェデレーション検索
- 05git に反映されるノートのバージョン履歴
- 06セルフホスト可能な単一プロセス構成
活用シーン
- 01AI クライアントから個人やチームの Obsidian ボルトを検索する
- 02同じノートをウェブサイトと Telegram チャンネルに公開する
- 03接続された複数のナレッジベースをまたいで一度に問い合わせる
MCP 対応
trip2g は各ハブで MCP サーバーとして動作し、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 | いいえ | 検索結果の note_id フィールドからそのままコピーした、0 以上の整数(uint64)のノート ID。パス、slug、match_id ではありません。path を優先してください |
| href | string | いいえ | 検索結果の href フィールドからそのままコピーしたノート href 文字列 |
| last | number | いいえ | すべてではなく、最新の下位項目を指定数だけ列挙します。ノートに日付付きセクションが毎日追加されると、1 年後には数百件になります。最新の数件に到達するために一覧全体を読むコストを避けられます。summary、total_children、omitted が省略内容を示すため、件数を制限した一覧が完全な一覧と誤解されることはありません。範囲が接する、または重なる場合は、同じ部分を重複して返さず、すべてを返します。 |
| path | string | いいえ | 文字列形式のノートパス。例:"concepts/maska-i-glubina.md" — 検索結果の note_path フィールドからそのままコピーします。ノートを参照するデフォルトかつ推奨の方法です |
| first | number | いいえ | 最も古いサブセクションを指定した数だけ列挙します。`last` と組み合わせると、途中を省いて、対象の始まりと現在の状況を確認できます。要約には省略部分の位置が示されます。 |
| note_id | number | いいえ | pid と同じです。検索結果の note_id フィールドからそのままコピーした、0 以上の整数(uint64)のノート ID。パス、slug、match_id ではありません。path を優先してください |
| toc_path | array | いいえ | 展開するノードへのパンくずパス。例:["Chapter 1"]。最上位では省略するか [] を渡します。 |
詳細
trip2g
Obsidian の保管庫をウェブサイトとして公開します。AI エージェント向けのセルフホスト可能な MCP メモリです。
Obsidian で書いて、同期を押せば、ノートが公開されます。同じセルフホスト可能なハブが、読者にはウェブサイトを、エージェントには MCP エンドポイントを提供し、Telegram に投稿し、有料コンテンツへのアクセスを制限します。内部では、Markdown オペレーティングシステムとして動作します。すべてのノートはファイルであり、1 つのノートが人間向けのウェブページにも、エージェント向けのツール呼び出しにもなります。
trip2g を選ぶ理由
- ノートを 2 通りに活用できます。 1 つの Markdown ファイルが、読者向けのページとして表示されると同時に、あらゆる MCP クライアントからの
search/note_html呼び出しに応答します。エクスポートの手間はなく、読み取れないベクトルストアに知識のコピーを閉じ込めることもありません。 - データは自分の手元に残ります。 プレーンな Markdown、Git でクローンできる保管庫、すべての編集が読みやすい差分になります。間に SaaS は介在せず、いつでも
git cloneで移行できます。 - 実行するプロセスは 1 つだけです。 SQLite 上で動作する単一の Go バイナリです。ノート PC、小規模な VM、コンテナのいずれでも、同じように起動します。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 保管庫をダウンロードしてください。コンテナは 1 つ、ファイルはローカルディスクに保存され、全文検索も利用できます。ほかのサービスは必要ありません。
ターミナルを使わずに始めたい場合は、無料のクラウドインスタンスをご利用ください。単一バイナリ、TLS 対応の Docker Compose、fly.io など、すべての選択肢をセルフホストガイドで紹介しています。
ドキュメント · はじめに · MCP ツール · セルフホスト · コントリビューション
すべてはノートです
Unix はすべてをファイルにしました。trip2g はすべてをノートにします。
人間とエージェントが共有する、パスで指定可能な単一のグローバル名前空間です。ノートは Markdown ファイルです。フロントマターはメタデータ、本文はコンテンツです。同じノートがウェブページ(表示サーバー)としても MCP 経由(エージェントのシステムコールインターフェース)としても提供され、すべての編集は 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 を利用可能)を、エージェントには MCP を提供します。データはプレーンな Markdown のままなので、いつでも移行できます。
マップ
trip2g では、プリミティブの対応関係が明確なため、オペレーティングシステムの用語を採用しています。各行には、実装の状況を示すタグが付いています。実装済みは main 上で動作するコード、ブランチは feat/agent-runtime 上で動作するコード、計画中は設計ドキュメントです。
| OS の概念 | trip2g のプリミティブ | 状況 |
|---|---|---|
| ファイルシステム | 人間とエージェントが共有する、パスで指定する単一のノート名前空間 | 実装済み |
| ファイル | ノート:Markdown のフロントマター(メタデータ)+本文(コンテンツ) | 実装済み |
| オーバーレイファイルシステム | フロントマターのパッチ(Jsonnet)で、ソースに触れることなくノートを上書き | 実装済み |
| スナップショット | note_versions + DB を正とする Git ミラー(gitapi) | 実装済み |
| Git 上のファイルシステム | Smart HTTP(/_system/git)経由でボールトを git clone/pull/push | 実装済み |
| システムコール | MCP ツール:search、note_html、similar、federated_* | 実装済み |
| ネットワークスタック | フェデレーション:クエリをピアハブに一斉送信 | 実装済み |
| 仮想ホスト | フロントマターの route/routes によるドメインごとのルーティング | 実装済み |
| スケジューラー | cron Webhook(next_run_at)+ goqite ワーカープール | 実装済み |
| プロセスのディスパッチ | Webhook 配信:ノートの作成/更新/削除 → POST | 実装済み |
| IPC | イベントバスとしてのノート:あるエージェントの書き込みで次の処理が起動 | 実装済み |
| ディスプレイサーバー | ウェブサイトのレンダリング:デフォルト+Jet テンプレート、mermaid、datachart | 実装済み |
| ページキャッシュ | 匿名ユーザー向けのレンダリング済みページキャッシュ。バージョンをキーに使用 | 実装済み |
| 出力先 | ノートを Telegram チャンネルに公開し、リンクを維持 | 実装済み |
| 標準入力 | フロントマターのフォーム。送信内容はノートごとに保存 | 実装済み |
| 権限(ユーザー) | サブグラフ+サブスクリプション ACL、管理者、API キー | 実装済み |
| 認証プロバイダー | メールのマジックリンク、Google/GitHub OAuth、OIDC SSO | 実装済み |
| 権限(エージェント) | スコープ付きトークン内の Webhook ごとの read_patterns/write_patterns | 実装済み |
| 認証情報ストア | 暗号化された secrets/federation_secrets(AES-256-GCM) | 実装済み |
| ケイパビリティチケット | HAT:署名付きの短い TTL のトークン。ae=true で管理者権限に昇格 | 実装済み |
| 制御サーフェス | カンバンボードのノート(layout: kanban) | 実装済み(レイアウト)、ブランチ(エージェント接続) |
| カーネル設定 | 機能フラグ。起動時に検証(依存関係が欠けているとパニック) | 実装済み |
| プロセス実行環境 | 内部 LLM 実行ループ(agentruntime)、ツールの許可リスト+上限 | ブランチ |
| パッケージマネージャー | ノートをロールとして使用:ノートを置くと fleet がエージェントを登録 | ブランチ |
| リソース制限 | 実行ごとのトークン上限とステップ上限。どちらも上書き不可 | ブランチ |
システムコール:MCP サーバー
すべてのハブに組み込まれています。エージェントがデータベースに直接アクセスすることはありません。MCP 経由でツールを呼び出し、アクセス範囲は呼び出し元のサブスクリプションに限定されます。
| ツール | 用途 |
|---|---|
search | 全文検索とセマンティック検索のハイブリッド |
note_html | ID、パス、または一致条件でノート(またはセクション)を読み取る |
similar | 指定したノートに類似するノート |
federated_search / federated_similar / federated_note_html | 同じ処理をピアハブに一斉送信 |
instructions | エージェント向けに作成者が定義したプロンプト |
カスタムツールは、ノートのフロントマター(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
信頼できる人や組織とピアハブを構築します。各ハブは、ベースごとにアクセスを制御します。エージェントへの1つの質問で、接続されているすべてのナレッジをまとめて検索できます。ループは IP パケットと同じ仕組みで制限されます。各ハブは、ホップごとのカウンター(X-MCP-Federation-Depth ヘッダー)に対して max_depth を適用し、すべての呼び出しには有効期限の短い HMAC 署名付きトークンが含まれます。
各ハブはそれ自体が Markdown OS であり、ネットワークはコンピューター同士をつなぐインターネットのように、オペレーティングシステム同士をつなぐメッシュです。以下の構成はよくある例であり、これだけに限りません。プロトコルはトポロジーを前提としないため、どのような構成も構築できます。
| トポロジー | セットアップ | 結果 |
|---|---|---|
| 個人 | 1つのハブ、多数のベース | すべてのメモ、本、コースを1回のクエリで検索 |
| 友人 | 各人がハブを運用し、ハブ同士がピア接続 | 全員のナレッジをまとめて利用 |
| 企業 | 中央ハブと従業員ごとのハブ | 組織内の知識やドキュメントを検索可能に |
| B2B | 2つのスター型トポロジーを1つのブリッジで接続 | システムを統合せずにナレッジを共有 |
プロセスディスパッチとスケジューラー:Webhook エージェント
エージェントを実行するカーネル側の仕組みです。main に含まれています。
- 変更 Webhook。 メモの作成・更新・削除時にエージェントへ POST し、エージェントは API 経由でメモを書き戻します。Glob フィルタリングで実行対象のメモを選択し、HMAC で配信に署名し、
max_depthで再帰を停止します。 - Cron Webhook。 スケジュール(
0 9 * * *)に従ってエージェントを実行します。next_run_at列と毎分実行されるシステム cron がこれを駆動し、goqite ワーカープールがキューごとの並行処理数と優先度を管理します。同期または非同期で実行でき、任意で指示コンテキストを指定できます。
エージェント自体はどこに配置してもかまいません。これらの Webhook はイベントを配信し、メモの書き込みを受け付けるだけです。
ユーザーランド:エージェントフリート
feat/agent-runtimeで開発中です。まだmainには含まれていません。
基本となる考え方は、メモを編集すると、対象を限定したサーバーサイドのエージェント実行が開始されることです。ローカルエディターや静的ビルダーとは異なり、エージェントはハブ上で実行され、ノート PC 上ではなく、メモの Glob パターンに従って対象が限定されます。
エージェントはメモです。フロントマターが設定であり、model、tools、read_patterns/write_patterns、trigger_on、for_each、max_depth、timeout_seconds を指定します。本文は指示であり、変更されたメモを参照できる Jet テンプレートです。fleet デーモンはエージェント用フォルダーを監視し、各ロールメモを解析して、自身を指す変更 Webhook として登録します。メモを追加するとエージェントがインストールされ、削除するとアンインストールされます。
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 は単純なイベントソースのままです。指示、対象範囲、トリガーはすべてメモに記述されています。
この仕組みを支える基盤(変更/Cron Webhook、スコープ付きトークン、配信ジョブ)は main に含まれています。メモ内の LLM 実行機能(agentruntime)とフリートのリコンシラー(internal/fleet、cmd/fleet)は、feat/agent-runtime で追加されます。
コントロールサーフェス:カンバンボード
ボードは layout: kanban を指定したメモで、カードは - ship the docs @status:doing @assigned:bob のような行です。カードを編集するとメモが編集されるため、あらゆるエージェントを動かすのと同じトリガーで、ボードを読み、カードをその場で patch_note するトリアージエージェントを起動できます。メモは、人間が作業を指示する手段であると同時に、エージェントの入力と出力にもなります。
カンバンレイアウト(docs/_layouts/kanban.html)とスタンドアロンの kanban_template は main に含まれています。ボードをフリートに接続する機能は feat/agent-runtime の一部です。
表示サーバー:テンプレートとレンダラー
2 つの方法があり、ナレッジベースごとにどちらかを選びます。
A. デフォルトテンプレート(コード不要、フロントマターのみ)。ウィジェットとコンテンツブロックからページを構成します。
---
header: "[[Navigation]]"
left_sidebar: [TOC, inlinks]
content: [selfcontent, magazine]
magazine_include_files: "blog/**/*.md"
footer: "[[Footer]]"
---
quicktemplate を使ってレンダリングします。ノートはフロントマターの content_type を使って、HTML、JSON、RSS としてもレンダリングできます。
B. カスタム Jet テンプレート(自由に制御できます)。独自の .html ファイルを layouts フォルダーに配置し、layout: path/to/template で切り替えます。テンプレートには Markdown AST が渡されるため、セクションを反復処理したり、特定の部分をレンダリングしたり、HTML の細部までカスタマイズしたりできます。Jet テンプレートエンジンをベースにしています。
どちらの方法でも、バックエンドは各ノートが要求した場合に限り、ノートごとにレンダラー拡張機能を読み込みます。mermaid の図と、参照先の CSV をグラフに変換する datachart ウィジェット(ECharts 経由)が利用できます。ノートで必要な機能を宣言すると、そのページには必要なスクリプトだけが含まれます。
Telegram:ノートをチャンネル投稿に
同じノートを、スケジュールに従って、または即時に Telegram チャンネルへ公開できます。trip2g はリンクを維持します。独自の投稿があるノートへのウィキリンクはその投稿を指し、まだ投稿されていないノートへのリンクはウェブサイト上のページにフォールバックするため、リンク切れが発生しません。ノートを編集して再同期すると、チャンネルの投稿も自動的に更新されます。完全なガイド →
フォーム:構造化された入力
ノートは情報を表示するだけでなく、入力も受け付けられます。フロントマターに form: ブロックを追加すると、trip2g はページにフォームを表示し、GraphQL API 経由で送信を受け付けて、各送信内容をそのノートに関連付けて保存します。
---
title: Say hello
form:
fields:
- name: email
type: email
required: true
- name: message
type: text
max_length: 2000
---
フィールドの型とバリデーターはフロントマターで指定します。公開フォームはデフォルトで Cloudflare Turnstile によって保護され、can_submit で投稿できるユーザーを制限できます。送信内容は管理パネルと GraphQL API に保存され、それぞれの送信内容が vault 管理者にメールで通知されます。仕様を一度定義して form_ref: で再利用するか、フロントマターパッチを使ってフォルダー全体にフォームを設定できます。OS の用語で言えば、これはノートの標準入力です。完全なガイド →
Git:vault はリポジトリです
trip2g は /_system/git で、ナレッジベース全体を git Smart HTTP 経由で提供します。他のリポジトリと同じように、クローン、プル、プッシュできます。データベースが正本であり、git ツリーはディスク上にあるチェックアウトではありません。エンドポイントを操作した時点で gitapi が必要に応じてツリーを生成し、プッシュ内容はノートに反映されます。そのため、git clone で vault をバックアップでき(全履歴も取得できます)、API の代わりにコミットを使って変更をスクリプト化できます。
収益化
サブグラフのペイウォールでノートを有料プロダクトにまとめ、無料のノートは公開したままにできます。支払いには暗号資産(NowPayments)、Patreon、Boosty を利用できます。
ソース
| ソース | 状態 |
|---|---|
| Obsidian | 利用可能:vault はローカルに保持され、双方向で同期します |
| Telegram | 利用可能:チャンネルへの公開と履歴のミラーリング |
| RSS output | 利用可能:すべてのベースでフィードを提供します |
| Notion | 予定 |
| Google Drive | 予定 |
| Linear、Slack archive、RSS import | 予定 |
セルフホスト
cd quickstart && docker compose up
trip2g は SQLite 上で単一プロセスとして動作し、データベースサーバーを別途用意する必要がないため、ノート PC、小規模な VM、コンテナーのいずれでも同じようにハブを起動できます。高可用性が必要な場合は、単一のリーダーが書き込みを処理する構成で、読み取りを水平方向にスケールできる読み取り専用レプリカを追加できます(feat/read-replica ブランチ)。
完全なガイド → · MIT · SQLite のみで動作します。セマンティック検索には埋め込み API(OpenAI または互換性のある任意のエンドポイント)が必要ですが、全文検索はオフラインで利用できます。
技術スタック
| バックエンド | Go、FastHTTP、gqlgen(GraphQL) |
| データベース | SQLite + ストリーミングバックアップ用の Litestream |
| 検索 | bleve(全文検索)+ OpenAI 互換 API を利用した埋め込み(セマンティック検索) |
| Markdown | Goldmark:ウィキリンク、フロントマター |
| テンプレート | quicktemplate(デフォルト)+ Jet(カスタム) |
| チャートと図 | mermaid、ECharts(datachart) |
| フロントエンド | $mol、TypeScript |
| アセット | S3 互換(開発用は MinIO) |
インスピレーション
OS という捉え方は、Markdown as an Operating System と、Unix の everything is a file から着想を得ています。私たちが大切にしているのは、次の 3 つです。
- Markdown は汎用的な基盤です。 どのツールもどのモデルもすでに読み込めるファイルを 1 つ用意し、そこからウェブサイト、フィード、Git の履歴を生成します。
- ファイルはプロセス間のインターフェースです。 エージェントがノートを書くと次のエージェントが起動するため、連携に別個のキュー API は必要ありません。
- 人が読める差分は監査ログです。 編集内容はすべて
note_versionとコミットとして記録され、5 秒で読み取って元に戻せます。
ライセンス
MIT
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。