セルフホスト版ミラー
自分のハードウェアで動く小さなサーバーで、Marrowのデータの完全なライブコピーを保持し、iPhoneがスリープ中でも、ポケットの中でも、地球の反対側にあっても、エージェントに答えます。
アプリごとのセットアップは、接続の中の専用ページにあります.
Marrowのガイド一覧: MCP · セルフホスト版ミラー · オートメーション · ファイル · サポート
内容
自分のハードウェア(Raspberry Pi、NAS、古いノートパソコン、$5のVPS)で動かす、小さなオープンソースのサーバーです。iPhoneは、QRコードをスキャンして一度ペアリングすれば、あとはアプリを閉じたままでも、すべての変更をバックグラウンドで送ります。サーバーはMarrowのデータの完全なSQLiteコピーを保持し、読み取り用の13個のMCPツールを提供します。iPhone版の7つ、sleep_logとsymptoms_and_mood、そしてアプリ自身の言葉で答える4つ(daily_brief、baselines、what_changed、data_quality)です。そのため、エージェントは、iPhoneが引き出しの中にあっても、午前3時に「今週の睡眠はどうだった?」と尋ねられます。MITライセンス:github.com/MarrowHealth/marrow-mcp.
インストール
Pythonのファイル1つ、標準ライブラリのみ、Python 3.10以降:
pip install marrow-mcp marrow-server # or: python3 marrow_server.py
またはDockerで:
git clone https://github.com/MarrowHealth/marrow-mcp cd marrow-mcp docker compose up -d
初回の起動時に、ペアリング用のURLが表示され、ネットワーク内の任意のブラウザでQRコードが表示されます。
iPhoneをペアリングする
- 近くにある画面で、ペアリング用のURLを開きます。
- Marrowでエクスポート、サーバーMCP、サーバーとペアリングの順に進み、コードをスキャンします。
- 完了です。iPhoneが送信を始め、サーバーのページに、最後に送信した時刻と、待機中のレコード数が表示されます。
ペアリングすると、サーバーのデータディレクトリに2つのトークンができます。iPhoneが送信に使うものと、エージェントが読み取りに使うものです。トークンのファイルを削除すると、新しいものに切り替わります。
エージェントを接続する
claude mcp add --transport http marrow http://<server-ip>:8800/mcp \ --header "Authorization: Bearer <mcp token>"
13個のツールで、すべて読み取りです。生データの9個:health_summary、list_metrics、metric_daily、metric_samples、workouts、nutrition_log、strength_log、sleep_log、symptoms_and_mood。そして、生データのツールが終わるところから始まる4つで、アプリのホームと同じ計算で、あなた自身の直近の普段の値と比べて評価します:daily_brief(1日分:主要な各指標の値とアプリ自身の言葉、目標に対する食事と水分、昨夜の睡眠、行ったトレーニング、触れておく価値のあるフラグ)、baselines(指標ごとのあなたの普段の値、最新の値のz、90日間の傾向)、what_changed(直近1週間と、その前の4週間との比較:何が動いたか、あなたにとってどれだけ注目に値するか、睡眠と就寝時刻の変化、始まったり止まったりしたデータの流れ)、data_quality(何が新しく、何が古く、何が欠けているか。エージェントが欠けた部分を事実と取り違えないようにします)。すべての読み取りは、iPhoneのカレンダーに沿った、さかのぼる日数、またはfromとtoを受け付けます。サーバーは、表示に対応するクライアント向けに、4つのプロンプト(how_am_i_doing、weekly_review、doctor_prep、log_from_text)と4つのリソースも一覧に出します。12個の書き込みツールもあり、iPhoneが許可すると一覧に出ます。Marrow 1.5以降では、エクスポート、あなたの接続でサーバーのAIの書き込みを許可をオンにすると、AIがそれを通じて、食事、水分、体重、ワークアウト、睡眠、症状、気分、目標を、無料で記録できます。サーバーは各エントリを待機させ、Marrowが開いたとき、またはスリープから復帰したときに、iPhoneが適用し、どれも元に戻せます。Claude Desktop、Cursorなどのセットアップは、MCPのページにあります。変わるのはURLだけです。
LANの外から接続する
サーバーは平文のHTTPで通信し、TLSは備えていません。そのままポートフォワードしないでください。サーバー機とiPhoneにTailscaleを入れてtailscale serveを使うか、Cloudflare Tunnel、またはHTTPSを終端する任意のリバースプロキシを前に置いてください。ペアリング用のQRには、サーバーが公開するアドレス、つまりサーバー自身のLANアドレス、または--urlで渡したアドレスが入っています。実際に使うアドレスを指定して起動し、たとえばmarrow-server --url https://pi.your-tailnet.ts.netのようにしてから、ペアリングしてください。
ディスクに残るもの
- すべての日次データ系列、サンプル、日記のエントリ、筋トレのセットを持つSQLiteデータベース。iPhoneのプッシュで最新に保たれます。
- 受け取ったすべての生のプッシュは、そのそばにJSONLとして残されるので、データベースを壊してしまっても再構築できます。
- 完全な精度の履歴で、1年あたり50〜150 MBを見込んでください。
単位:健康指標は、保存されたSI単位のまま、ラベルつきで届きます。筋トレのセットは、iPhoneの表示設定にかかわらず、"unit": "lb"のポンド単位で届くので、ミラーで単位が混ざることはありません。Grafana、DuckDB、cronジョブを、データベースファイルに直接向けられます。
トラブルシューティング
AIが動いているパソコンからできる2つのテストで、問題のある場所がわかります。まず、サーバーが起動しているかを確認します。これにはトークンは要りません:
curl http://<server-ip>:8800/health
{"server": "marrow", "ok": true}が返ります。次に、エージェントのトークンが使えるかを確認します:
curl -i http://<server-ip>:8800/mcp \ -H "Authorization: Bearer <mcp token>" \ -H "Content-Type: application/json" \ -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
| 結果 | 意味 |
|---|---|
200 OKとツールの一覧 | サーバーは動いています。エージェントの設定で、アドレス、トークン、サーバータイプ(HTTP)を確認し、エージェントを再起動してください。 |
401とbad bearer token | トークンが違います。エージェントが使うのはmcpトークンで、iPhoneのペアリングに使うものではありません。下をご覧ください。 |
| 接続が拒否される、またはタイムアウト | サーバーが動いていない、ポートが違う、またはサーバー機のファイアウォールがポート8800を塞いでいます。Dockerの場合は、8800:8800のポートマッピングを確認してください。 |
- どのトークンか。サーバーは起動時に、
agents:で始まる行に、エージェント用のトークンを表示します。データフォルダの.mcp-tokenファイルにも入っています(--dataを渡さなければ./data、Dockerでは/data)。iPhoneは別のトークンを使い、.app-tokenにあります。エージェント用のトークンを変えるには、.mcp-tokenを削除して、サーバーを再起動し、すべてのエージェントを更新します。 - ペアリングのページに「bad or missing token」と表示される。サーバーが表示したとおりに、
?token=の部分も含めて、ペアリングのリンクを開いてください。 - ペアリングのページにQRコードではなくテキストが表示される。QRには、任意のパッケージ
segnoが必要です:pip install "marrow-mcp[qr]"。または、Marrowで手動で入力するを選び、そのテキストにあるurlとtokenを入力してください。 - iPhoneで「ペアリングに失敗しました」と表示される。iPhoneがQRのアドレスに届きませんでした。Dockerでは、サーバーにはコンテナ自身のアドレスしか見えないので、あなたのアドレスを教えてください。コマンドに
--url http://<your-computer-ip>:8800を追加します。自宅のWi-Fiの外では、tailscale serveかトンネルから得たHTTPSアドレスを使ってください。 - ローカルネットワークのアクセス。自宅のネットワーク上のサーバーに届くには、Marrowにローカルネットワークへのアクセスが必要です。iOSは、最初にペアリングするときに尋ねます。許可しなかった場合は、設定、プライバシーとセキュリティ、ローカルネットワークでMarrowをオンにして、Marrowを開いた状態でもう一度ペアリングしてください。
- 「そのQRコードはMarrowのペアリングコードではありません」と表示される。カメラが別のコードを読み取りました。サーバーのペアリングページにあるコードをスキャンしてください。
- データが古い、またはMarrowに「配信されていません」と表示される。iPhoneがサーバーに送信できていません。MarrowのサーバーMCPのページに、最後の送信と、待機中のレコード数が表示されます。サーバーが動いているか確認してから、Marrowを開いて、待機中のものを送信してください。バックグラウンドでの送信は、iOSが許す範囲で行われます。
- 「このサーバーは記録する前にアップデートが必要です」と表示される。サーバーを
pip install -U marrow-mcpでアップデートして、再起動してください。Dockerの場合は、クローンの中でgit pullとdocker compose up -d --buildを実行します。 - AIからのエントリが表示されない。エクスポート、あなたの接続で、サーバーのAIの書き込みを許可をオンにしてください。書き込みツールがサーバーに表示されるのは、そのあとです。各エントリはサーバーで待機し、Marrowが次に開いたとき、またはスリープから復帰したときに反映されます。
- 接続がオンにならない。無料では同時に1つの接続、Marrow Proでは最大10個までオンにできます。AI、サーバー、オートメーションの合計です。
ほかの方法ではなく、これを選ぶとき
iPhoneがスリープ中や外出中でもエージェントがデータを必要とするとき、またはファイルではなくクエリできるデータベースが欲しいときは、ミラーを選びます。エージェントがiPhoneの近くで動いていて、ほかに保守するものを増やしたくないときは、iPhone上のMCPサーバーを選びます。データの届け先がすでにあるときは、オートメーションを選びます。