mcpField
H
Health by Dr Brad

Health by Dr Brad

リモート
drstanfield.comヘルスケア10今日更新
リポジトリ公式サイト

Health by Dr Brad について

Health by Dr Bradは、健康指標の記録と検診案内を行うツールです。測定値、検査結果、検診計画を管理したい個人向けで、記録は本人のクラウドストレージまたはブラウザーに保存され、ウェブ、CLI、MCPから利用できます。

主な機能

  1. 01健康測定値と検査結果の記録
  2. 02受診時期が来た検診の表示
  3. 03出典付きの根拠に基づく提案
  4. 04本人が管理する保存先への記録
  5. 05ウェブ・CLI・MCPでの利用

活用シーン

  1. 01個人の健康指標を記録して確認する
  2. 02測定値や検査結果をもとに検診予定を確認する
  3. 03健康記録をClaudeまたはChatGPTに接続する
  4. 04ローカルMCPツールで自分の記録にアクセスする

MCP 対応

ホスト型MCPエンドポイント https://mcp.drstanfield.com/mcp は、健康記録用ツールを公開し、DropboxとGoogle Drive内の記録にアクセスします。ホスト側を使わず、利用者の端末でstdio MCPサーバーを実行する方法もあります。

設定

リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。

エンドポイントhttps://mcp.drstanfield.com/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 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。

ツール

詳細

Health by Dr Brad

無料の健康ロードマップです。測定値と血液検査の結果を入力すると、受ける時期が来ているスクリーニング検査を、エビデンスに基づく提案とその引用元とともに表示します。アカウントは不要で、https://drstanfield.com/pages/roadmap で利用できます。Claude または ChatGPT にコネクター URL https://mcp.drstanfield.com/mcp で接続できます。記録は、ご自身の Dropbox または Google Drive、あるいはブラウザー内にある単一のファイル health-roadmap.json です。当社のサーバーに保存されることはありません。

パーソナライズされた提案を提供する健康指標トラッキングです。Shopify のストアフロントテーマ拡張機能と、セルフホスト可能なページとして提供されます。

ローカルファースト。 ユーザーの健康データは、本人のクラウド(Google Drive、Dropbox、GitHub、WebDAV)または localStorage に、単一の health-roadmap.json ファイルとして保存されます。ウェブサイトもローカルツールも、そのファイルを当社のサーバーに送信することはありません。ホスト型コネクター mcp.drstanfield.com は、1 回のリクエストの処理中のみサーバーのメモリ上にデータを保持し、保存はしません。「ログイン済み」とは、クラウドプロバイダーに接続されていることを意味します。Fly バックエンドの役割は限定的で、チャットボット、検査結果インポート時のデータ抽出、A/B テストおよび製品イベント、メールリマインダー、Klaviyo への登録、ホスト型 MCP サーバーを担います。Supabase が保持するのは運用データの行のみで、健康値は一切保持しません。スクリーニング検査名が当社に届く唯一のケースはメールリマインダーです。その行には登録済みメールアドレス、スクリーニング検査のラベル、受ける時期のみが含まれ、それ以外は含まれません(app/lib/reminder-v2.server.ts)。

3 つのエージェント用インターフェース

同じファイル、同じ書き込み経路への 3 つの入口です。

  1. ウィジェット:ストアフロントまたはセルフホストページ上の React アプリです。 RoadmapStore を介して読み書きします。
  2. CLI と stdio MCP:ユーザー自身のマシン上で、ユーザー自身のファイルを対象に実行する tools/get-plan.ts、tools/edit-record.ts、tools/mcp-server.ts です。docs/guides/getting-started.md(「あらゆる AI に接続できるオープンソースの健康記録」、ハブガイド)、docs/guides/command-line.md、docs/guides/connect-claude-desktop.mdをご覧ください。
  3. ホステッド MCP:https://mcp.drstanfield.com/mcp。2026-09-02 から Fly アプリ health-tool-edu 上で稼働しており、Dropbox と Google Drive に対応しています。2026-09-07 時点でツールは 9 つです。ホステッド専用の import_documents(US-35)は Dropbox アプリフォルダーから検査ファイルを読み取ります(Drive の drive.file スコープでは、ドロップされたファイルを参照できません)。また、file_results(US-36)は、チャットにドロップされたファイルからアシスタントが読み取った行を受け取るため、ファイルが当社のサーバーに届くことはありません。Dropbox では、読み取り時に、記録にまだ含まれていないフォルダー内のファイルも提示されます(US-37)。

ホステッド環境での呼び出しに応答するため、サーバーはアシスタントが保持するクラウド認証情報の封印を解除し、それを使ってユーザーのフォルダーを開き、リクエストの処理中は記録をサーバーのメモリ上に保持します。データは一切保存しません。(例外が 1 つあります。架空のアカウントについて、OpenAI または Anthropic のアプリ審査が完了するまで、サーバーは審査担当者の Dropbox 認証情報自体を保持します。US-32 AC38。)これを望まない場合は、インターフェース 2 を使用します。tools/mcp-server.ts は、当社のサーバーをまったく介さずに、同じファイルに対して同じツールレイヤーを実行します(docs/guides/getting-started.md、ハブガイド、およびdocs/guides/connect-claude-desktop.md)。

ブラウザー以外からのすべての書き込みは、同じ SyncManager(packages/health-core/src/sync-manager.ts)を通過します。競合をマージし、書き込み後に検証します。CLI と stdio MCP は file-adapter.ts を介してこれを実行し、ロックファイルを取得してバックアップを保持します。ホステッド MCP は REST アダプター(dropbox-rest.ts、drive-rest.ts)を介してこれを実行します。ここでは、プロバイダー独自の条件付き書き込みが同じ役割を果たします。 packages/health-core/README.mdをご覧ください。

行が変更されることはありません。修正時は新しい行を追加し、古い行を entered-in-error としてマークします。

2 つのビルド、1 つのソース

ビルドコマンド配置先
Shopify ストアフロントnpm run build:shopify-prod両方のストア、テーマ拡張機能
セルフホストnpm run build:pagesGitHub Pages、バックエンドはほぼ不要、キーは各自で用意

フラグ:すべての v2 の動作には VITE_LOCAL_FIRST、サーバーを必要とする機能の制御には VITE_SHOPIFY_SURFACE を使用します。

「バックエンドはほぼ不要」というのが、Pages ビルドの正確な説明です。Pages ビルドでは、レコードも チャットも当社のサーバーには一切アクセスしません。レコードはユーザー自身のクラウドに直接書き込まれ、 チャットはユーザー自身のキーで実行されます。任意の呼び出しが 2 つあり、ユーザーが実行した場合に限って 当社に接続します。Google でサインインすると、OAuth コードが /api/google-token に送信され、 Google に転送されます。何も保存されません(widget-src/standalone/google-config.ts)。メールの リマインダーに登録すると、メールアドレスと期限が /api/reminders-v2 に送信されます (widget-src/standalone/reminders.ts)。このビルドでは Sentry によるエラー報告も実行されます (widget-src/standalone/app.tsx が initSentry を呼び出します)。ブラウザーから送信される前に、 widget-src/src/lib/sentry.ts によって情報が除去されます。drbradstanfield.github.io では、 環境名 standalone で有効になっているため、このページは sentry.io に接続します。除去処理は ストアフロントのビルドと同じで、イベントのすべての自由記述フィールドに対して共有の scrubEventText を実行するため、Pages のエラーもほかのエラーと同じルールで報告されます。

ページが読み込むその他のものは、すべてページ独自のものです。widget-src/standalone/index.html には モジュールスクリプトが 1 つ含まれており、読み込み時にサードパーティのスクリプトは読み込まれません。 Sentry はそのスクリプトにバンドルされ、ヒーロー画像もビルドに含まれます (widget-src/standalone/hero-dr-brad.webp、26 KB)。cdn.shopify.com から取得されないため、 ページを読み込んでも Shopify に情報は伝わりません。Google Drive に接続すると、Google のサインイン スクリプトが accounts.google.com から読み込まれます。クラウドの認証情報と任意の Anthropic キーは、 そのオリジンの localStorage に保存されます (hr_anthropic_key、health_roadmap_dropbox_tokens、health_roadmap_gdrive、 health_roadmap_gdrive_tokens、health_roadmap_github、および WebDAV のユーザー名と パスワードを保存する health_roadmap_selfhost)。そのオリジン上で実行されるスクリプトは、 どれもこれらを読み取れます。/roadmap/ と /roadmap/dev/ は同じオリジンなので、 ステージングプレビューは本番ページとストレージを共有します。

はじめに

git clone <repo-url>
cd roadmap
npm install
cp .env.example .env   # fill in what you need
npm run test:all

Node 22 以降が必要です。shopify app dev は実行しないでください。開発プレビューによって 本番環境が上書きされます。

テスト

npm test          # symlink guard + health-core + server
npm run test:all  # everything, and what CI runs
npx vitest run <path>

デプロイ

デプロイには CI を使用します:.github/workflows/deploy.yml。Actions → Deploy → Run workflow から 実行します。すべての認証情報は GitHub の production 環境に保存されています。手動および緊急時の手順、 ならびに 2 つのアプリに分けた Fly の構成については、 docs/deploy-runbook.md を参照してください。

自分で確認する

コードの説明を鵜呑みにする必要はありません。DevTools のネットワークタブで記録を開始してから、 サイトを開いてウィジェットを使ってみてください。

  • 指標を保存しても、当社のサーバーへのリクエストは発生しません。レコードファイルを書き込むのは widget-src/src/storage/ 内のアダプター(dropbox.ts、drive.ts、github.ts、webdav.ts、local-storage-adapter.ts)だけなので、書き込み先はお客様ご自身のDropbox、Google Drive、GitHub、WebDAVサーバー、またはlocalStorageです。当社サーバーには、レコードを保存するためのエンドポイントはありません。レコードが当社のサーバーに届くのは、ホステッドコネクターを接続した場合だけです。その場合も、1回のリクエスト処理中にサーバーのメモリ上でファイルを読み取るだけで、何も保存しません。
  • 健康情報を含むリクエストは2種類あり、どちらもお客様の操作によって送信されます。ラボ文書をアップロードすると、その文書のページ内容が /api/lab-import-v2 にPOSTされ、AnthropicのAPIに送信されて情報が抽出されます。値が返されますが、保存はされません。ストアフロントウィジェットからチャットメッセージを送信すると、そのメッセージ、それまでの会話のやり取り、および回答に必要な健康情報が /api/chat にPOSTされます。この画面では、質問ごとに1行がサーバーに保存されます。保存されるのは、入力した文章の最初の500文字(お客様が入力した健康情報が含まれる場合があります)、一致した記事、分類、ルーターの生出力とルーターエラー、画面の名前、仮名化されたセッションIDと会話IDです。それまでのやり取りと返信は保存されません。行が作成から30日経過すると、毎日のジョブによって質問文、ルーターの生出力、エラーテキストが消去されます。一致記録(記事、分類、ID)は残ります。ゲストセッションの行には、IPアドレスではなくハッシュ化されたアドレスが保存されます。
  • ブログページのチャットバブルとチャットボットの埋め込み機能は、ウィジェットのチャットより送信する情報は少ない一方で、より多くの情報を保持します。どちらも localStorage から保存済みレコードのウィジェット側コピーを読み取り、各メッセージのチャットコンテキストとして送信します(widget-src/src/lib/storage.ts の loadGuestInputs()。widget-src/src/site-chat.tsx と widget-src/src/chatbot-embed.tsx から呼び出されます)。このコンテキストには、保存済みプロフィール(性別、身長、出生年と月、単位系)、各測定値の最新の保存値とその日付、記録されている薬剤名と用量、記録されているすべてのスクリーニング回答(方法、結果、日付、フォローアップ)、喫煙歴とpack-years、PSA値、前立腺および子宮内膜のスクリーニングに関する相談への回答、異常出血に関する回答が含まれます。保存せずに入力した内容は含まれません。ウィジェット自体のチャットでは、これらすべてに加え、各測定値について日付付きの値を最大24件と、ページ上で入力済みだがまだ保存していない内容も送信されます。どちらの機能も VITE_LOCAL_FIRST を設定しないため、サーバーはこれらを保存対象の画面のデータとして扱います。質問と返信は chat_messages に書き込まれ、返信には送信された値が引用される場合があります。これらのキャッシュ値は引き続きコンテキストとして送信されます。値がないと回答の質が下がるため、Bradは2026-09-10にこの方法を維持することを決めました。会話記録も、同じ30日間の削除処理の対象になりました(app/lib/chat-purge-cron.server.ts)。行が作成から30日経過すると、ジョブによってメッセージ本文と会話タイトル(質問の冒頭部分)が消去されます。残るのはスレッドの構成であり、文章ではありません。行ID、ロール、タイムスタンプ、モデル、トークン数、フォールバックフラグが残ります。消去済みの発言は [removed after 30 days] として読み込まれます。2026-09-10に決定されたとおり、Discordボットの会話記録も同じ期間で消去されます。ボットに入力した質問も、チャットバブルに入力した質問と同じようにプライベートです。YouTubeの会話記録は残ります。これらのやり取りは動画への公開コメントであり、独自の保持ルールに従うためです。
  • 離れた場所にある2台のデバイスで編集しても、やり取りをせずに変更が統合されます。別々の場所にある両方のデバイスで同じ日の同じ測定値を記録した場合、新しい方の入力がその日の値になり、もう一方は「入力ミス」としてマークされ、履歴に残ります。何も削除されません。レコードファイルが信頼の基点です。このファイルに書き込めるものは、すでにファイル全体を削除できます。また、より後の消去を含むファイルがすべてのデバイスで優先されます。復元にはプロバイダーのバージョン履歴を使用します。
  • テレメトリーで使用できるのは、packages/health-core/src/product-events.ts に定義された許可リスト内のイベント名だけです。イベントには名前と匿名の訪問者UUIDが含まれ、サーバーはリストにない名前を拒否します。
  • 当社が呼び出すその他の機能では、値は送信されません。/api/google-token はOAuthコードまたは更新トークンをGoogleに転送しますが、何も保存しません。/api/reminders-v2 はリマインダーのスケジュールを送信します。スケジュールは「大腸内視鏡検査」などのラベルと期限日で構成されます。ストアフロントでは登録は任意ではありません。クラウドプロバイダーに接続すると登録されます。この接続が同意に当たるためです(widget-src/standalone/reminders.ts の autoEnrolReminders。2026-08-11にデフォルトで有効とする決定が行われました)。接続時に、お客様のクラウドアカウントのメールアドレス、ラベル、日付が当社に届きます。その後に届くプラン準備完了メールには、リマインダーの開始案内とワンクリックで無効にするリンクが記載されます。その後の各リマインダーにも同じリンクが含まれます。GitHub Pages版では登録されません。autoEnrolReminders はShopifyの画面以外では直ちに処理を終了し、住所を尋ねるトグルを使った場合にのみ登録されます。どちらの場合も、当社が保持するのはその住所、スケジュール、リマインダーを停止するトークンだけです。健康情報の値、アカウント情報、その他の情報は保持しません。任意のプランメールでは、入力された住所と同じスケジュールが送信されます。
  • ウィジェットのフィードバック欄に入力した内容は保存され、メールでも送信されます。このルートは、メールアドレスと最大2000文字の自由記述を受け取り、ログイン中の場合はShopifyの顧客IDを追加して、その行を feedback_submissions に書き込み、Resendを通じて同じ内容をBradに送信します(app/routes/api.feedback.ts、app/lib/product-events.server.ts の recordFeedbackSubmission)。このテキストを消去する処理も、行を削除する処理もないため、そこに記入した健康情報はそのまま残ります。
  • エラーはSentryに送信されます。ブラウザーから送信する前に、内容をマスキングします(widget-src/src/lib/sentry.ts)。コンソールのパンくずテキストは置き換えられ、fetchのパンくずURLはオリジンまでに短縮され、レコード操作のエラーは固定メッセージと限定されたタグのセットに置き換えられます。sendDefaultPii は設定されません。テキストのマスキング処理の内容はご確認ください(packages/health-core/src/sentry-scrub.ts)。メールアドレス、単位の付いた数値、およそ30種類の指標や検査項目の用語から20文字以内に記載された数値が削除されます。また、サーバー側では200文字を超える追加フィールドが削除されます。文章中の診断名や人名は認識されず、電話番号を対象にするルールもありません(電話番号のチェックはコネクターの report_feedback ツールにあります)。最も重要な対策は、その前段階にあります。読み取っていたテキストをそのまま返すのではなく、固定メッセージでエラーを送出するようにしています。JSONまたはスキーマエラーでは文書の内容が引用されるため、ラボ情報の抽出時の解析処理も2026-09-10に同じ方式に変更しました。
  • 健康情報を含むファイルがサーバーイメージに入り込むことはありません。.gitignore にある健康データのパターンはすべて .dockerignore にも除外対象として指定されています。また、テストによって両者が一致していることが検証されるため、対応する除外指定なしで無視ルールを追加するとテストに失敗します(tests/dockerignore.test.ts)。
  • プランのフッターには、どちらのビルドにもプライバシーに関するお知らせへのリンクがあります(widget-src/src/components/ResultsPanel.tsx)。そのため、お客様のデータの取り扱いは、同意画面の奥に隠されているのではなく、プランからワンクリックで確認できます。

次に読むドキュメント

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。