garmin-mcp について
garmin-mcpは、Garmin公式Personal APIを通じてGarmin Connectのトレーニング、睡眠、回復データをAIアシスタントに読み取り専用で提供するMCPサーバーです。ローカルまたは利用者自身のCloudflareアカウントで動作し、クラウド版はWebやモバイルのクライアントから利用できます。
主な機能
- 01Garminデータへの読み取り専用アクセス
- 02トレーニング、睡眠、回復の照会
- 03ローカルとCloudflareへのデプロイ
- 0426個のツールと5個のプロンプト
- 05要求時に最新データを取得
活用シーン
- 01運動前に直近のトレーニングと回復を確認
- 02ランニングの合計、ペース、長距離走を比較
- 03睡眠パターンと心拍数の推移を調べる
MCP 対応
MCPツールとプロンプトを通じてGarmin Connectのデータを提供します。ローカルのstdio接続と、クラウド配置向けのリモートHTTPエンドポイントに対応しています。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
26掲載時のツール一覧 · 3 日前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| date | any | いいえ | YYYY-MM-DD、または 'today' / 'yesterday'(ユーザーの Garmin タイムゾーンで解決されます)。 |
詳細
garmin-mcp
自分のGarminデータを使って、トレーニング、睡眠、回復についてAIアシスタントに質問できます。これは、Garminの公式 Personal APIを通じて、Claude、ChatGPTなどのアシスタントにGarmin Connectデータへの読み取り専用アクセスを提供するMCPサーバーです。
使いやすい方法で実行できます。どちらの方法でも、利用できるツールは同じです。
- ローカル。 AIアプリから起動して、お使いのコンピューター上で実行します。セットアップは約1分で、必要なのはGarminキーだけです。Claude Desktopではワンクリックでインストールできます。
- クラウド。 お使いのCloudflareアカウント上で実行します(無料プランで十分です)。GitHubサインインで保護されます。セットアップには約20分かかりますが、その後はウェブ、デスクトップ、スマートフォンなど、すべてのデバイスで使えます。
Claude、ChatGPT、Claude Code、Codex、Gemini CLI、Cursor、VS CodeなどのMCPクライアントで動作します。各方法に対応するアプリについては、ローカルとクラウドのどちらを選ぶかをご覧ください。
どちらの方法でも、次のことができます。
- グラフではなく、洞察を得る。 質問すると、自分のデータに基づいた回答が得られます。
- パスワード不要。 Garminのログイン情報ではなく、いつでも無効化できるGarmin公式APIキーを使用します。
- 仲介者なし。 データはGarminからお使いのコンピューター、またはご自身のCloudflareアカウントに直接送られます。第三者のサービスにデータが保存されることはありません。
- 常に最新。 質問するたびにGarminからデータを取得するため、同期を気にする必要はありません。
- 追加料金なし。 すでに利用しているAIサブスクリプションを使い、クラウド版もCloudflareの無料プランで利用できます。
たとえば、次のような質問ができます。
- 「今日はハードなトレーニングをしても大丈夫ですか?」
- 「5月以降、安静時心拍数とHRVはどのように変化しましたか?」
- 「今年、月ごとのランニング合計距離と平均ペースを教えてください。」
- 「ランニングのうち、イージーランとハードランの割合はどれくらいですか?」
- 「睡眠の質が最も悪い曜日はいつですか?」
- 「直近2回のロングランを比較してください。」
- 「日曜日のレースの1kmごとのスプリットを教えてください。ネガティブスプリットでしたか?」
スマートフォンのClaude(クラウド版)で、最近のランニング記録から10kmの予想タイムを算出している様子です。
Garminとは提携関係になく、Garminから推奨も受けていません。「Garmin」と「Garmin Connect」は、Garmin Ltd.またはその子会社の商標です。
ローカルとクラウドのどちらを選ぶか?
| ローカル | クラウド | |
|---|---|---|
| Claude Desktop(ワンクリックインストール)、Claude Code | ✅ | ✅ |
| Codex(CLI、およびChatGPTデスクトップアプリ内) | ✅ | ✅ |
| Gemini CLI、Cursor、VS Code | ✅ | ✅ |
| ChatGPTアプリ:ウェブ、デスクトップチャット、スマートフォン | ✅ | |
| ウェブ版Claude | ✅ | |
| スマートフォンまたはタブレットのAIアプリ | ✅ | |
| コンピューターの電源がオフでも動作 | ✅ | |
| 約1分でセットアップ | ✅ | |
| CloudflareアカウントやGitHubアカウントが不要 | ✅ | |
| Garminキーはお使いのコンピューターにのみ保存 | ✅ | |
| ネットワーク上で待ち受けるプロセスなし | ✅ | |
| セッション間でキャッシュを保持 | ✅ | |
| 無料で実行可能 | ✅ | ✅ |
| 26個のツールと5個のプロンプトすべてを利用可能 | ✅ | ✅ |
まだ迷っていますか?
Claude Desktop または Claude Code を 1 台のコンピューターで使っています
ローカルで実行しましょう。すべての機能を約 1 分で利用できます。Claude Desktop ならダウンロードは 1 回だけです。Node も設定ファイルも必要ありません。
たとえばランニングの直後に、スマートフォンから質問したいです
クラウドで実行しましょう。スマートフォンアプリはローカルプロセスを起動できないため、インターネット経由で接続できるサーバーが必要です。
ChatGPT を使っています
クラウドで実行しましょう。ChatGPT アプリ自体(ウェブ、デスクトップチャット、スマートフォン)はリモート MCP サーバーにのみ接続します。例外は Codex です。Codex CLI と ChatGPT デスクトップアプリ内の Codex なら、ローカルで実行できます。
複数のコンピューターを使っています
クラウドで実行しましょう。ローカルの場合は各コンピューターにインストールする必要がありますが、クラウドなら一度設定し、各アプリに URL を追加するだけです。
まだ決めかねています
まずはローカルで始めましょう。後からスマートフォンでも使いたくなったら、クラウドを設定してください。データは Garmin に保存されているため、移行するものはありません。
両方を実行できますか?
はい。Garmin キーを共有できます。
どちらのほうが安全ですか?
どちらも異なる方法で保護されています。ローカル版はサインインする対象がないため、サインインは不要です。起動したアプリだけが接続でき、キーはコンピューター上のそのアプリの設定に保存されます。クラウド版はインターネットからアクセスできるため、GitHub アカウントに限定され、キーは Cloudflare のシークレットに保存されます。セキュリティモデルを参照してください。
ターミナルの操作にどの程度慣れている必要がありますか?
ローカルの場合は、コマンドを 1 つ貼り付けるか、設定スニペットを 1 つ貼り付けるだけです。クラウドの場合は、十数個ほどのコマンドに加えて、Cloudflare と GitHub のダッシュボードでいくつか設定する必要があります。
ローカルで実行する
AI アプリがサーバーをローカルプロセスとして起動し、直接通信します。 Cloudflare や GitHub の設定は必要ありません。
必要なのは Garmin Personal API キーだけです( Garmin Personal API キーを作成するを参照してください)。
Claude Desktop:ワンクリック
- garmin-mcp.mcpbをダウンロードします。
- ダブルクリックし、求められたら Garmin キーを貼り付ければ完了です。
Claude Desktop が拡張機能自体を実行するため、Node も設定ファイルも必要ありません。キーはシステムのキーチェーンに保存されます。
Claude Code、Cursor、VS Code、その他のアプリ
これらのアプリでは Node 22 以降が必要です。個別にインストールするものはありません。アプリが garmin-mcp パッケージを npx で実行します。
Claude Code:
claude mcp add garmin --env GARMIN_API_KEY=<your key> -- npx -y garmin-mcp
Cursor、VS Code、その他のアプリ(または拡張機能を使わない場合の Claude Desktop):アプリの MCP 設定に次の内容を追加します。
{
"mcpServers": {
"garmin": {
"command": "npx",
"args": ["-y", "garmin-mcp"],
"env": {
"GARMIN_API_KEY": "<your key>"
}
}
}
}
VS Code の mcp.json では、"mcpServers" ではなく "servers" を使います。
Codex
同じ設定を共有する Codex CLI と ChatGPT デスクトップアプリ内の Codex の場合は、~/.codex/config.toml に次の内容を追加します(Node 22 以降が必要です)。
[mcp_servers.garmin]
command = "npx"
args = ["-y", "garmin-mcp"]
env = { GARMIN_API_KEY = "<your key>" }
Gemini CLI
~/.gemini/settings.json の "mcpServers" の下に次の内容を追加します(Node 22 以降が必要です)。
"garmin": {
"command": "npx",
"args": ["-y", "garmin-mcp"],
"env": { "GARMIN_API_KEY": "<your key>" }
}
アプリを再起動してから、「今日、トレーニングをする準備はできていますか?」と聞いてみてください。
クラウドで実行する
MCP client ──OAuth──▶ Worker (/mcp) ──Bearer JWT──▶ Garmin Personal API
│
└─ /authorize ──▶ GitHub sign-in ──▶ allowed user ID? ──▶ token
各ユーザーは自分の Cloudflare アカウントに独自のコピーをデプロイします。単一の GitHub アカウントに限定されるため、Garmin データにアクセスできるのは本人だけです。
必要なもの
- Garmin Connect アカウントと Garmin デバイス
- Cloudflare アカウント(無料プラン)
- GitHub アカウント
- Node 22 以降
- 約 20 分
すべてのコマンドはリポジトリのフォルダーから実行してください。
1. Cloudflare をインストールしてログインする
git clone https://github.com/colincooperio/garmin-mcp.git
cd garmin-mcp
npm install
npx wrangler login
cp wrangler.example.jsonc wrangler.jsonc
wrangler.jsonc は Git の追跡対象外なので、設定がコミットされることはありません。
2. KV 名前空間を作成する
npx wrangler kv namespace create OAUTH_KV
表示された id を wrangler.jsonc に貼り付け、YOUR_KV_NAMESPACE_ID を置き換えます。
3. GitHub アカウントに固定する
https://api.github.com/users/<your-github-username> を開き、数値の
id をコピーします。wrangler.jsonc の ALLOWED_GITHUB_USER_ID に設定します。
ユーザー名は変更でき、その後、別の人に取得される可能性があるため、ユーザー名ではなく数値 ID を使用します。
4. Worker の URL を確認する
URL は https://garmin-cloud-mcp.<your-subdomain>.workers.dev になります。
workers.dev のサブドメインは、Cloudflare ダッシュボードの Workers & Pages の概要に表示されています。
wrangler.jsonc の MCP_RESOURCE に、末尾に /mcp を付けたこの URL を設定します。
5. GitHub OAuth アプリを作成する
GitHub → Settings → Developer settings → OAuth Apps → New OAuth App の順に移動し、次の項目を入力します。
- ホームページ URL:
https://garmin-cloud-mcp.<your-subdomain>.workers.dev - 認可コールバック URL:
https://garmin-cloud-mcp.<your-subdomain>.workers.dev/callback
次に、クライアントシークレットを生成します。
6. Garmin Personal API キーを作成する
Garmin Connect → Personal API Token → Create Key に移動します。有効期間を 1 年に設定してキーをコピーします。Garmin でキーが表示されるのは一度だけです。
7. シークレットを保存する
各コマンドで、値を貼り付けるよう求められます。
npx wrangler secret put GITHUB_CLIENT_ID
npx wrangler secret put GITHUB_CLIENT_SECRET
npx wrangler secret put COOKIE_ENCRYPTION_KEY # paste output of: openssl rand -hex 32
npx wrangler secret put GARMIN_API_KEY
wrangler から先に Worker を作成するか尋ねられた場合は、yes と答えます。
8. デプロイする
npm run deploy
このコマンドは、デプロイの前に型チェックを行い、テストスイート全体を実行します。失敗があれば、何もデプロイされません。テスト出力には、expected とラベル付けされたエラー行がいくつか含まれています。これらは、Worker が不正なリクエストを拒否することを確認するテストによるものです。
9. AI アプリを接続する
サーバーの URL は https://garmin-cloud-mcp.<your-subdomain>.workers.dev/mcp です。
すべてのアプリで、初回に GitHub サインインが開きます。サインインして承認してください。
- Claude:Settings → Connectors → Add custom connector を選択し、URL を貼り付けます。 コネクターは、使用するすべてのデバイスで Claude アカウントに引き継がれます。
- ChatGPT:OAuth 認証を使用するカスタムコネクター(MCP サーバー)として追加します。 カスタムコネクターには開発者モードが必要で、利用できるかどうかはプランによって異なります。最新の手順については、OpenAI のヘルプページを参照してください。
- Claude Code:
claude mcp add --transport http garmin <url>を実行し、その後/mcpを実行してサインインします。 - Cursor、VS Code、その他の MCP アプリ:URL を指定して、リモート(HTTP)MCP サーバーを追加します。 MCP OAuth に対応したアプリでは、アプリ内でサインインが処理されます。
「今日はトレーニングをする準備ができていますか?」と試してみてください。Claude のコネクターメニューのように MCP プロンプトを表示するアプリでは、あらかじめ用意されたプロンプトを選ぶこともできます。
この方法を選ぶ理由
パスワードベースの Garmin MCP サーバーとの比較
ほとんどの Garmin MCP サーバーは、Personal API が登場する前から存在しています。Garmin のメールアドレスとパスワードでログインし、Garmin Connect の非公開ウェブエンドポイントを呼び出して、ユーザー自身のマシン上で動作します。
| パスワードベース | これ(ローカル) | これ(クラウド) | |
|---|---|---|---|
| Garmin へのアクセス | メールアドレスとパスワード、セッショントークンをディスクに保存 | 公式 Personal API キー:失効可能、有効期限は 30 日〜1 年 | ローカルと同じ |
| Garmin のログインや MFA の変更で動作しなくなるか | はい。頻繁に発生します | いいえ。ドキュメント化された API を使用します | いいえ |
| ウェブアプリやスマートフォンアプリで動作するか | いいえ | いいえ | はい |
| 認証情報が漏えいした場合 | Garmin アカウント全体が危険にさらされます | キーを削除するまで、読み取り専用の健康データが漏えいします | ローカルと同じです。また、キーはノートパソコンではなく Cloudflare のシークレットに保存されます |
トレードオフとして、Personal API で扱える範囲はより限定的です。ゴルフのスコアカード、トレーニングプラン、Garmin Training Status、レース予測、ギア、コースには対応しておらず、書き込みもできません。サーバーはこの点をあらかじめモデルに伝えるため、機能を探し回るのではなく、利用できないと回答します。
API の基本的なラッパーと比べて
エンドポイントごとにツールを1つずつ用意するラッパーでも動作しますが、時間がかかり、トークンも多く消費します。 Garmin はアクティビティごとに100以上のフィールドを返し、心拍数については2分ごとの測定値を返します。このサーバーが複雑な処理を担います。
- 1回の呼び出しで質問に回答します。
get_readiness、summarize_wellness、summarize_activitiesは、サーバー内でデータを取得、結合、集計します。5か月分のランニングデータも、約190,000文字ではなく約1,000文字で返されます。 - デフォルトでコンパクトです。 読みやすい単位、フラット化された行、すべての測定値ではなく時間ごとの心拍数を返します。すべてのツールで、生データを取得する
detail: "full"を指定できます。 - Garmin の1回あたりのリクエスト上限に対応しています。 一部のエンドポイントでは、1回のリクエストで取得できる期間が28日または31日に制限されています。より長い期間は分割して並列取得するため、モデルは4回の呼び出しと失敗ではなく、1回の呼び出しで済みます。
- タイムゾーンに合わせた期間名を使えます。
last_30_days、this_week、last_month、today、yesterdayは、Garmin プロフィールのタイムゾーンに基づいて解決されます。 - DST の切り替え時も、時刻は現地時間で返されます。 Garmin は時刻を生のエポック値、GMT 文字列、「現地」値として送信しますが、時計が切り替わる夜は現地値が1時間ずれています。すべての時刻は、正確な瞬間とプロフィールのタイムゾーンから算出した現地時間の
YYYY-MM-DD HH:MMで返されます。旅行中は、ウォッチのタイムゾーンが使われます。 - 一部の結果が取得できなくても、残りは返されます。 たとえば、ある夜の HRV の取得に失敗しても、残りのデータは短い注記とともに返されるため、モデルはすべてを再試行せずに済みます。
- キャッシュ。 3日以上前のデータは確定しているため、7日間キャッシュされます。アクティビティの詳細は1日間キャッシュされます。アクティビティ分析の内容は変わらないため、無期限でキャッシュされます(ファイルではなく、派生テーブルのみが対象です)。追加の質問では Garmin へのアクセスを省略します。(ローカルでは、アプリがサーバーを再起動するまでキャッシュが保持されます。)
- Garmin の API から直接取得できない情報: 1km/1マイルごとのスプリットとベストエフォート(サーバー内でアクティビティの FIT ファイルから算出するため、2時間のランニングでも、7,000件のサンプルではなく数KBのテーブルとして返されます)、トレーニング負荷(急性:慢性比)、心拍ゾーンごとの時間(1つのアクティビティについて、その当時のゾーンを使ったウォッチ独自の数値を返すため、Garmin Connect の表示と一致します)、曜日ごとのパターン、距離加重ペース、アクティビティの並列比較。
- MCP プロンプトに対応するアプリ(Claude のコネクタメニューなど)向けのプロンプトテンプレート: 今日のトレーニングへの準備はできていますか?、睡眠レポート、トレーニングの振り返り、週間チェックイン、最近のセッションを比較
ツール
すべてのツールは読み取り専用です。期間は最大92日間(summarize_* ツールでは366日間)を指定できます。期間を指定するすべてのツールで period も指定でき、単日を対象とするツールでは today または yesterday を指定できます。summarize_* ツールでは、start_date のみを指定すると「その日以降」として扱われ、終了日は今日になります。
まずはこちらから。 よくある質問に、少ない応答量で1回の呼び出しで回答します。
| ツール | 回答内容 |
|---|---|
get_readiness | 「どれくらい回復していますか?」「よく眠れましたか?」:その夜の睡眠、HRV とベースラインとの比較、安静時心拍数、Body Battery をそれぞれ過去 7 日間と比較します。トレーニング負荷と、直近 3 日間のトレーニングも確認できます |
summarize_wellness | 睡眠、安静時心拍数、HRV、ストレス、歩数、Body Battery の傾向:週別、月別、曜日別、または全体 |
summarize_activities | トレーニングの合計:距離、時間、ペース、心拍数、トレーニング負荷、心拍ゾーン別の時間を週別、月別、曜日別、または全体で確認できます |
compare_activities | 2~5 件のアクティビティを並べて比較できます |
get_activity_analysis | 元の FIT ファイルから 1 件のアクティビティを分析します:1 km または 1 マイルごとのスプリット、ウォッチのラップとワークアウトの反復、ベスト記録(1 km からマラソンまで)、ウォッチが記録した心拍ゾーン別の時間、前半と後半のドリフト |
詳細。 デフォルトでは簡潔に表示します。Garmin の生データを表示するには、detail: "full" を指定してください。
| ツール | データ |
|---|---|
get_daily_summaries | 1日ごとの行:歩数、カロリー、心拍数、運動強度の高い時間、ストレス、Body Battery |
get_sleep_summaries / get_sleep | 期間または1晩分の睡眠時間(ステージ別)、スコア、心拍数、呼吸数、SpO2、必要な睡眠時間とその要因 |
get_hrv_summaries / get_hrv | 期間内のHRV、または1晩分の測定値 |
get_body_battery、get_stress、get_steps | 期間内の日ごとのデータ(Body Batteryには、その日の主要な測定値を含みます) |
get_heart_rate | 1日分の時間別最小値/平均値/最大値。from/toの期間が指定されている場合は、その期間内のすべての測定値も取得します |
get_spo2、get_fitness_age | 1日分の詳細 |
get_weight、get_weight_goals、get_hydration、get_wellness_activity_summaries | 期間データ |
search_activities | 個々のアクティビティ。種類、サブタイプ、レース、距離、時間、獲得標高、名前、地域で絞り込み、距離または速度で並べ替えできます |
get_activity、get_activity_workouts | 1件のアクティビティの詳細 |
get_nutrition、get_menstrual_cycle | 1日分の詳細 |
get_profile | 単位、タイムゾーン、心拍ゾーン |
これらを合わせると、
Garmin の Personal API 仕様
のすべてのエンドポイントを網羅します。これには、get_activity_analysisが読み込むアクティビティファイルのダウンロードも含まれます。
意図的に「任意のパスを GET する」ツールは用意していません。このツールがあると、モデルが存在しないエンドポイントを推測し、呼び出しを無駄にしていました。
トレーニング負荷
急性:慢性比は、直近7日間と直近28日間の平均的な1週間を比較します。Garmin 独自の Training Status は Personal API に含まれていないため、サーバーは対象期間内の各アクティビティで利用可能な最良の指標を使って算出し、使用した指標を示します。
- アクティビティごとのトレーニング負荷。記録機能を備えたウォッチで利用できます
- 心拍ゾーンの負荷(各ゾーンの時間 × ゾーン番号)。心拍数を測定できるすべてのウォッチまたはストラップで利用できます
- 心拍データがない場合は、運動時間
これらを混在させると比率に意味がなくなるため、期間全体で1つの指標を使います。Garmin の数値ではなく、目安として扱ってください。
管理
Garmin キーのローテーション。 キーの有効期限が切れる前に、Garmin からメールが届きます。新しいキーを作成してから、次の手順を実行します。
- ローカル:AI アプリの MCP 設定で
GARMIN_API_KEYを置き換え、アプリを再起動します。Claude Code の場合は、claude mcp remove garminを実行してから、もう一度追加します。Claude Desktop 拡張機能の場合は、Claude Desktop の拡張機能の設定に新しいキーを貼り付けます。 - クラウド:
npx wrangler secret put GARMIN_API_KEYを実行します。すぐに反映されます。キャッシュされたデータは、そのデータの取得に使用したキーに紐付いています。
その後、Garmin Connect で古いキーを削除します。
更新。
- Claude Desktop 拡張機能:最新リリースから新しい garmin-mcp.mcpb をダウンロードして、ダブルクリックします。
npxを使ったローカル環境:AI アプリがサーバーを起動するたびに、npxは最新バージョンを取得するため、アプリを再起動するだけです。特定のバージョンを使い続けるには、設定内のgarmin-mcpの代わりに[email protected]を指定します。- クラウド:
git pullを実行し、続いてnpm installとnpm run deployを実行します。更新によってwrangler.jsoncが変更されることはありません。wrangler.example.jsoncに新しい設定が追加された場合は、それをコピーしてください。
ログ。 ローカル環境では、サーバーは AI アプリの MCP ログに記録します。クラウドでは、npm run tail を実行するか、Cloudflare ダッシュボードで Workers → garmin-cloud-mcp → Logs を開きます。ログに記録されるのはエラーと拒否されたログインのみで、Garmin のデータは記録されません。
すべてのアクセスを一度に遮断する。 Garmin Connect で Garmin キーを削除すると、ローカルとクラウドの両方でアクセスが停止します。クラウドでは、ALLOWED_GITHUB_USER_ID を "0" に設定して npx wrangler deploy を実行することもできます。接続済みのすべてのアプリは、次のリクエスト時に拒否されます。
クラウドのデプロイに問題があり、ロールバックする。 npx wrangler rollback を実行します。
値が空ですか? デバイスによって異なるフィールドがあります。Garmin から送信されたすべての情報を確認するには、detail: "full" を指定してもう一度質問してください。フィールドが存在するのに簡略表示の回答に含まれていない場合は、issue を作成してください。
セキュリティモデル
共通
- 読み取り専用、固定パス。 すべてのツールは、固定された Garmin パスに GET でアクセスします。Garmin に書き込んだり、任意の URL を取得したりするツールはありません。
- データの経路。 Garmin → コンピューターまたは Worker → AI アプリ。データは、このツールを使うチャットに送られ、それぞれのプロバイダーのデータポリシーに従って扱われます。
ローカル
- ネットワークリスナーなし。 サーバーは、起動したアプリと stdin および stdout で通信するため、ほかのものから接続することはできません。そのため、サインインは不要です。HTTP プロキシで中継したり、ネットワーク上に公開したりしないでください。リモートアクセスにはクラウド版を使用してください。
- Garmin の認証情報。 キーは、コンピューター上の AI アプリの MCP 設定に保存されます。ベアラートークンとキャッシュされた応答はメモリーに保持され、プロセスの終了時に消去されます。
クラウド
- トークンを取得できるのはあなただけです。 GitHub サインイン後、コールバックで GitHub の数値ユーザー ID と
ALLOWED_GITHUB_USER_IDを照合します。それ以外のユーザーには、MCP トークンが発行される前に 403 を返します。すべての/mcpリクエストで ID を再確認するため、値を変更すると既存のセッションが無効になります。 - 安全側に失敗します。 許可 ID が未設定、
"0"、または数値以外の場合、誰もアクセスできません。 - GitHub へのアクセスは最小限です。 GitHub トークンはスコープを指定せずにリクエストし、ユーザー ID の読み取りに一度だけ使用した後、破棄します。
- 標準的な OAuth です。
@cloudflare/workers-oauth-providerを介して、PKCE(S256)、CSRF 対策済みの同意画面、/mcpリソースに紐づくトークンを使用した OAuth 2.1 に対応しています。 - Garmin の認証情報。 キーは Cloudflare のシークレットにのみ保存されます。有効期間が 24 時間のベアラートークンは、キーそのものではなくキーのハッシュを使って KV にキャッシュされます。過去の日付のレスポンスも同じ KV 名前空間にキャッシュされますが、保存先はお客様の Cloudflare アカウント内に限られ、有効期限は 7 日です。アクティビティのファイルは変更されないため、アクティビティ分析(スプリットとラップの表のみ。FIT ファイルや GPS 位置情報は含みません)は期限を設けずに保存されます。
- プライベートアドレスにはアクセスしません。
global_fetch_strictly_publicにより、Worker がプライベートアドレスへリクエストするのをブロックします。
セキュリティ上の問題を発見しましたか? Issue を作成するのではなく、このリポジトリの GitHub にある Security → Report a vulnerability から非公開で報告してください。
コントリビュート
バグ報告やプルリクエストを歓迎します。問題の報告方法、テストの実行方法、リリースの作成方法については、CONTRIBUTING.md をご覧ください。
既知の制限
- クラウドへのデプロイまたはローカルインストール 1 件につき、Garmin アカウントは 1 つです。 家族で共有する場合は、各自が自分の Garmin キーを使って、それぞれ自分用のコピーをセットアップしてください。
- 個人向け API の範囲に限られます。 ゴルフ、トレーニングプラン、Garmin Training Status、レース予測、VO2 最大値の履歴、個人記録、ギア、コース、バッジ、ソーシャル機能には対応していません。
- 読み取り専用です。 アクティビティ、体重、水分補給、食事の記録や、目標、設定、ワークアウトの変更はできません。Personal API には書き込みアクセスがないため、AI アプリは Garmin データを読み取ることはできますが、変更することはできません。
- 生のアクティビティファイルや GPS トラックは扱いません。
get_activity_analysisはサーバー内で FIT ファイルを読み取り、そこから生成した表のみを返します。ファイル、サンプル、位置情報がモデルに渡ることはありません。手動入力や GPX/TCX インポートには FIT データが含まれないため、その場合はツールがその旨を伝えます。 - レート制限は公開されていません。 Garmin は Personal API のレート制限を公開していません。429 が返された場合は、内容のわかるツールエラーとして通知されます。
クレジット
OAuth フローは、Cloudflare の
remote-mcp-github-oauth
デモを基にしています。src/workers-oauth-utils.ts は、同デモから MIT ライセンスの下で取り込んだものです。
作者
Colin Cooper が開発しました。
ライセンス
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。