Oxynote について
Oxynoteは、技術チーム向けのセルフホスト可能なワークスペースです。ドキュメント、ライブメトリクス、変更レビューを組み合わせ、MCPクライアントから内蔵アシスタントと同じページやクエリを利用できます。
主な機能
- 01PrometheusとSQLのメトリクスチャートを埋め込み
- 02ブロック単位の差分で下書きをレビュー
- 03ページのリアルタイム共同編集
- 04ドキュメントの依存情報の更新状況を追跡
- 05ページとクエリ用のMCPツール
活用シーン
- 01メトリクスと説明を同じページに記録
- 02技術ドキュメントの変更をレビュー
- 03チームとエージェントでシステム文書を共有
MCP 対応
OxynoteはOAuth経由でClaude CodeやCodexなどのMCPクライアントにツールを提供します。内蔵アシスタントと同じページやクエリを利用できます。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://{host}/core/api/mcpclaude mcp add --transport http oxynote-oxynote https://{host}/core/api/mcp{"mcpServers":{"oxynote-oxynote":{"type":"http","url":"https://{host}/core/api/mcp"}}}Cursor で開く{"servers":{"oxynote-oxynote":{"type":"http","url":"https://{host}/core/api/mcp"}}}VS Code で開く{"mcpServers":{"oxynote-oxynote":{"type":"http","url":"https://{host}/core/api/mcp"}}}{"mcpServers":{"oxynote-oxynote":{"serverUrl":"https://{host}/core/api/mcp"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
ツール
詳細
Oxynote
システムに字幕を。
ライブのメトリクスチャートを説明文の隣に表示し、社内 API に Stripe 風のドキュメントを用意し、変更を下書き、差分、承認の流れに通せるセルフホスト可能なワークスペースです。ttlcache の作者が開発しています。
Oxynote を選ぶ理由
Grafana でパネルの説明を書く場所は説明フィールドです。情報アイコンの背後にあるツールチップで、Grafana のドキュメントでも短く保つよう案内されています。説明を代わりに Notion に書くと、チャートは埋め込みの Grafana パネルとしてしか表示できません。その表示は、すでに Grafana にサインインしている人にしか見えず、Grafana Cloud ではまったく表示されません。各ツールはそれぞれ独自の履歴を持つため、チャートと説明をひとつの変更としてレビューする人はいません。Oxynote では、チャートはページ内で独自のクエリを実行し、その下に入力した内容が説明になり、下書きブランチによって両方がひとつの差分とひとつの承認を経て反映されます。
長い話は少し愚痴っぽいですが、個人的な理由を説明しています
長い間、私の会社で最も信頼できるドキュメントは、自分宛てに書いた Slack のチャットでした。そうなった経緯は、ダッシュボードから始まります。Grafana、Sentry、なぜか少しだけ Datadog、そしてチャートを載せたセルフホスト型のカスタム HTML ページがいくつかあり、たくさんのダッシュボードがありました。それに加えて、担当するデプロイのヘルスチェックを自分で実行するよう勧められていました(なぜ Grafana などでできないのか、誰にも説明できませんでした)。そのデプロイ対象は、WebSocket 経由で金融市場データを取得するサービスでした。負荷が高いとメモリリークが起き、OOM で強制終了されていました。原因不明のバグをしばらく追っていましたが、その間、強制終了のたびにイベントが取りこぼされ、取りこぼされたイベントを補うために手動でバックフィルスクリプトを実行していました。そうした状況は、どのダッシュボードにも表示されませんでした。そこで、cron と各サービスのステータスエンドポイントへの curl を使い、その結果を Slack で自分だけに送っていました。まったく便利ではありませんでした。
ほかにも、いろいろありました。終了した試験製品のデプロイ手順をいまだに記載している社内 Wiki、秘密情報の保管庫、サーバー管理コマンドや curl リクエスト。情報はどれも一か所にまとまっておらず、アクセス権の管理も問題でした。それぞれに権限を付与できる別々の担当者がいたため、その担当者が誰なのかを調べて、さらに連絡を取ることに多くの時間を費やしました。Slack でやり取りしていたので、すべて Slack で尋ね、回答もそこで受け取っていました。ときには認証情報がそのまま送られてくることもありました(恐ろしいことです)。情報を失わないよう、それらのメッセージを自分宛てのチャットに転送していました。こうしてそのチャットは、長い間、私にとって信頼できる唯一の情報源になりました。たくさんある中で重要な Grafana ダッシュボードへのリンク、連携時にレスポンスを照合できるようにした他チームのサービスへの curl リクエストの例(リクエストもレスポンスもどこにも文書化されていませんでした)、そして何がどこにデプロイされているかを記したサーバーの IP アドレスなどです。 当然、私も解決しようとしました。Notion のドキュメントを書き、そこから Grafana のグラフにリンクしていました。しばらくはそれで問題ありませんでしたが、 やがて内容が食い違うようになりました。あるドキュメントでは、取り込みレートのグラフにある market、region などのラベルを説明していましたが、新しいラベルが次々に追加されても、 誰も記録せず、その半分はそもそもグラフで使われていませんでした。しかも、ラベルが一つ増えるたびに Prometheus の時系列も一つ増えます。ドキュメントとグラフを同期させるには、 Notion と Grafana の両方にリンクを置く必要があり、私には面倒すぎました。 説明とグラフの内容が今も一致しているかを確かめるだけなのに、 ブラウザーのタブを切り替える必要もありました。そして、これはオブザーバビリティの話にすぎません。 そのほかにも、管理操作には特定の curl リクエストが必要で、 機能フラグはほかのすべてから切り離されたサービスにありました。どれも GitHub のように、テキスト、メトリクスのグラフ、その他の視覚的な構造に対応した差分を使って 適切にレビューできるワークフローが必要でした。ところが、そうした仕組みは 何もありませんでした。
私と一緒に Oxynote を始めた David(@davseby、 @swithek)は、別の会社で初めてオンコールを担当したとき、 システムとそのドキュメントを一通り把握しなければなりませんでした。Grafana と社内ドキュメントの経験が 何年もあった彼は、いつもどおりに済むと思っていました。ところが実際に使うことになったのは、 一度も使ったことのない Datadog と、まったく異なる構成の Notion でした。そして最初の当番で、 画像メタデータを補完するサービスが停止しました。ユーザーがアップロードした画像の検索精度が落ち、 そこから製品全体に影響が広がりました。モニターは発火しましたが、どれもリンクがなく、 どのサービスが故障し始めたのかも示されていませんでした。そのため、手作業で情報をつなぎ合わせる、 神経のすり減る夜になりました。あるサービスが過負荷で応答しなくなっていることを示すメトリクスは、 ずっと存在していました。しかし Datadog の UI は複雑で、どのグラフが何を追跡しているのかを 説明するものもなかったため、David はそのメトリクスを見つけられませんでした。Datadog の MCP サーバーに接続した AI エージェントは見つけました。
私たち二人が求めていたのは、グラフ、説明、コマンド、フラグが一つのページにまとまり、 一緒に編集でき、コードのようにレビューでき、夜中に疲れた人にもエージェントにも 読みやすいものでした。私たちが使っていたツールはどれも、特定のことには優れていても、 ほかのツールに目を向けることはありませんでした。Oxynote は、そのギャップを埋めるためのものです。 まず、私たちが最も必要としていた要素、つまり Notion のようにライブで使えるドキュメント、 メトリクスのグラフ、レビューのワークフロー、そしてリアルタイムシステム向けの Stripe のような分割ドキュメントから始めます。パズルのほかの要素も、順次追加していきます。
クイックスタート
Oxynote は単一のコンテナーです。これだけで実行できます。
docker run -d --name oxynote \
-p 8080:8080 \
-v oxynote_data:/oxynote/data \
ghcr.io/oxynote/oxynote:latest
http://localhost:8080 を開き、[email protected] と
oxynote-admin-1234 でログインしてください。
ソースから実行する方法については、CONTRIBUTING.md をご覧ください。
含まれる機能
メトリクスグリッド
Live Metrics ブロックには、1 つ以上の Prometheus または SQL クエリから作成した
時系列グラフ、棒グラフ、またはゲージが表示されます。SQL では PostgreSQL、MySQL、
MariaDB に対応しています。メトリクスグリッドは、こうしたブロックを横に並べたものです。
Grafana ならダッシュボードにあたります。Oxynote ではページ内にダッシュボードを配置できるため、
グラフの周囲に説明を加えられます。グラフが何を示しているのか、しきい値がなぜその位置にあるのか、
しきい値を超えたときに何をすべきかを、グラフと同じページにまとめられます。
レビュー
どのページもレビュー可能にでき、その後の変更はすべて下書きに反映されます。差分はテキストだけでなくブロックを理解します。エンドポイント名の変更、レスポンスフィールド名の変更、文章の書き換えが、ひとつの画面に赤と緑で、該当箇所に表示されます。レビュアーが承認すると、下書きはmainにマージされます。また、mainを保護して、誰も直接編集できないようにすることもできます。
コラボレーション
ページはリアルタイムで編集されるため、ページを開いている人、操作中のブロック、入力位置がわかります。誰かの編集が他の人の編集を上書きすることもありません。コメントは単語、図のソース内の行、またはチャート全体に付けられ、返信を追加できます。変更が反映されると解決済みになります。メンションや返信はすべて受信トレイに届きます。
その他
- ブロック:見出し、リスト、チェックリスト、引用、タイトル付きコードブロック、コールアウト、画像、ファイル、Figmaの埋め込み、Mermaid図。
- 最新状態の確認機能:ブロックやページは、依存するGitHubファイル、コンテナイメージ、Webページ、日付を追跡し、それらに変更があるとメンテナーにリマインダーを送ります。
- サブページ、タグ、全文検索、あらゆる操作に使えるキーボードショートカット、ライトテーマとダークテーマを備えたページツリー。
- 招待機能、GitHubアプリとSlackアプリ、GitHub、Google、Slackを使ったソーシャルログインを備えたワークスペース。
- 組み込みアシスタントのRubber Duckは、ページを編集し、ブロックと同じクエリを実行します。モデルはAnthropic、OpenAI、Google、OpenRouter、またはOllamaを介したローカルモデルから選べます。Claude CodeやCodexなどのMCPクライアントは、OAuth経由で同じツールを利用できます。
シンプルさを大切に
どんな人に向けたものなのか、率直にお伝えします。
Oxynoteは、次のような方に向いています。
- 技術者にシステムを説明することがあり、メトリクスのチャートと説明を1つのページにまとめたい
- ドキュメントジェネレーターを使わずに、社内サービス向けのStripe風ドキュメントを作りたい
- ページへの変更を、プルリクエストのように下書き、差分、承認を通して進めたい
- チームとエージェントの両方が読む1つのページがほしい
- セルフホストしたい
次のような方には、おそらく向いていません。
- ホステッドサービスを使いたい。現時点では提供していません
- 全社向けのWikiがほしい。Oxynoteは技術者と、その人たちが運用するシステムを対象としています
- あらゆるオプションがほしい。Oxynoteは明確な方針を持ち、使いやすいデフォルト設定を提供して、オプションを最小限に抑えています
FAQ
Grafanaを置き換えるものですか? それが目標です。現在はPrometheusとSQLのメトリクスチャートやダッシュボード風のグリッドに対応し、その横に説明を書けます。ログとアラート機能にはまだ対応していませんが、開発を進めています。
なぜこの名前なのですか? 開発当初は「breathing docs」と呼んでいました。呼吸には酸素が必要なので、oxyを接頭辞にして、その後にnoteを付けました。
コミュニティ
質問したり、Oxynoteの活用方法を共有したり、開発チームと話したりするには、Discordに参加してください。バグを見つけた場合やアイデアがある場合は、issueを作成してください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。