@kotyのブログ

PythonとかAWSとか勉強会のこととかを、田舎者SEがつづります。記事のライセンスは"CC BY"でお願いします。

Google Antigravity と MCP で Strava / Garmin / Intervals.icu を統合して専属AIコーチを作った話

私は週末にヒルクライムやロングライドをしているしがない自転車乗りである。FTPは3.1W/kg程度で、大して強くない。9月末の高山ヒルクライムに向けて練習している。

最近、自転車のデータ分析やトレーニングメニューの組み立てに Google Antigravity(AGY)を使い始めた。

Strava、Garmin Connect、Intervals.icu の3つのサービスから MCP(Model Context Protocol)経由で生データを取得し、AIに専属コーチをやってもらう環境を作ったので、セットアップ手順をメモしておく。

私はgoogle oneでAIつきのプランに入っている関係で、AIはGemini、インターフェースはantigravity-cliを使っている。claude codeなどでも同様のことはできると思う。

構成

全体の構成としてはこんな感じである。

  • Strava: 走行中のミリ秒単位のストリームデータ(パワー、心拍、ケイデンス、GPS)を取得
  • Garmin Connect: 夜間のHRV、安静時心拍(RHR)、Body Battery(回復度)、FirstbeatのTraining Effectを取得
  • Intervals.icu: 長期のCTL(体力)、ATL(疲労)、Form(TSB/コンディション)を取得

これをローカルの Antigravity CLI から直接叩いて、走行直後の解析やメニュー作成、ダッシュボード生成をやらせている。

                    ┌─────────────────────────┐
                    │    Google Antigravity   │
                    │   (ローカル AI コーチ)   │
                    └────────────┬────────────┘
                                 │
     ┌───────────────────────────┼───────────────────────────┐
     ▼                           ▼                           ▼
【Strava MCP】           【Garmin Connect MCP】      【Intervals.icu API】
・ミリ秒単位パワー/心拍   ・夜間HRV / 安静時心拍(RHR)  ・長期フィットネス (CTL)
・セグメントGPS/勾配      ・Body Battery (回復度)      ・短期疲労蓄積 (ATL)
・ケイデンス/トルク       ・Firstbeat Training Effect  ・コンディション (Form/TSB)

正直Garminだけでも必要なデータは取れそうな気がするが、面白いのでStravaとIntervals.icuも連携している。

前提環境

  • macOS
  • Google Antigravity CLI (agy)
  • Node.js
  • uv(Pythonのパッケージマネージャー)

uvが入っていない場合は以下で入れておく。

curl -LsSf https://astral.sh/uv/install.sh | sh

Strava MCP のセットアップ

走行ログのパワーや心拍の推移(ストリーム)を取るための設定。

Strava API の登録

  1. Strava API Settings でアプリを作成する。
  2. Client ID と Client Secret を控える。
  3. 認可コードを取得して Refresh Token を生成しておく。

1-2. Strava MCP サーバー

ローカルディレクトリ(例えば ~/src/strava-mcp)に Strava MCP サーバーを配置してビルドしておく。


Garmin Connect MCP のセットアップ

Garmin Connectからは、睡眠データやBody Battery、夜間HRV、FirstbeatのTraining Effect(有酸素/無酸素負荷)を取得する。

OSSの taxuspt/garmin_mcp を使うと楽だった。

初回ログイン認証

ターミナルで以下のコマンドを1回実行する。

uvx --python 3.12 --from git+https://github.com/Taxuspt/garmin_mcp garmin-mcp-auth

メールアドレス、パスワード、MFA(2要素認証コード)をプロンプトで入力すると、~/.garminconnect/ にOAuthトークンが保存される。設定ファイルにパスワードを平文で書かなくて済むので安心である。


Antigravity の MCP 設定(mcp_config.json)

~/.gemini/config/mcp_config.json に Strava と Garmin の設定を追加する。

{
  "mcpServers": {
    "strava-local": {
      "command": "node",
      "args": [
        "/Users/YOUR_USERNAME/src/strava-mcp/dist/server.js"
      ],
      "env": {
        "STRAVA_CLIENT_ID": "YOUR_CLIENT_ID",
        "STRAVA_CLIENT_SECRET": "YOUR_CLIENT_SECRET",
        "STRAVA_REFRESH_TOKEN": "YOUR_REFRESH_TOKEN"
      }
    },
    "garmin": {
      "command": "/Users/YOUR_USERNAME/.local/bin/uvx",
      "args": [
        "--python",
        "3.12",
        "--from",
        "git+https://github.com/Taxuspt/garmin_mcp",
        "garmin-mcp"
      ]
    }
  }
}

Intervals.icu API の連携

疲労管理(CTL / ATL / Form)は Intervals.icu から取得している。

  1. Intervals.icu の設定(Settings ➔ Developer Settings)から Athlete ID と API Key を取得する。
  2. Antigravity から Basic認証(API_KEY:your_key)で https://intervals.icu/api/v1/athlete/{athlete_id}/wellness を叩くスクリプトを実行させる。

コーチの人格とルール設定(~/.geminirules)

Antigravity に自分の目標レースや機材設定、ペダリングの意識を記憶させておく。

~/.geminirules に以下のようなルールを書いておく。書いておくといっても、これも「あなたの人格を設定したい」などとAIにお願いすれば書いてくれる。

# 目的とミッション
あなたは専属データ駆動型トレーニングコーチ「Nagano Climb & Data Coach」です。
9月末の「高山ヒルクライム(20km / +1,300m)」での目標タイム達成に向けた指導を行うこと。

# 指導方針
1. Intervals.icuの指標(CTL, ATL, Form)を監視し、Formが -20 以下の場合は完全休養を指示すること。
2. ペダリング解析では「10時からの入力(大腰筋引き上げ)」および「自重移動」を軸に、Pythonで心拍デカップリングやトルクを評価すること。
3. 機材設定:
   - クランク: Magene PES P505
   - スマートトレーナー: Cycplus T2(内蔵パワーはP505より約9.5%低く出る)
   - MyWhoosh登録FTP: 『179 W』(P505実測 198W と同期させるための値)

実際に使ってみてどうなのか

練習から帰ってきて「練習してきました」と伝えるだけで、以下を勝手にやってくれる。

  1. マルチデータの突合
    • Stravaから区間ごとの平均パワー、心拍数、デカップリング(有酸素ドリフト率)を算出
    • Garminから本日のTraining Effect(有酸素4.2/VO2MAX刺激など)やBody Batteryを確認
    • Intervals.icuから最新のFitness(CTL)とForm(TSB)を更新
  2. HTMLダッシュボード(cycling_dashboard.html)の自動更新
    • パワー・心拍プロットやケイデンス・トルクのSVGグラフをローカルHTMLにインラインで自動描画してくれる。
  3. スマートトレーナー用ワークアウト(.zwo)の生成
    • 雨の日に室内ローラーをやる際、指定したメニュー(30分SST ➔ ラスト10分200Wビルドアップ等)の .zwo ファイルを日本語メッセージ付きで生成してくれるので、MyWhooshにインポートしてすぐ走れる。

市販のAIアプリ(RestOrTrain等)との違い

RestOrTrainなどのスマホ向けAIコーチアプリもあるが、2026年9月からStravaの規約改定でサードパーティAIへのデータ提供が遮断されたりしている。

ローカルMCP環境なら自分のAPIキーで直接生データを取れるし、何より「スマートトレーナーとクランクの9.5%の出力差を自動補正したワークアウトを作る」とか「目標コースの勾配と下り区間を物理シミュレーションする」といった、自分専用の細かいコード処理ができるのが便利である。

非常に快適に使っている。AIにお願いすればだいたい環境構築してくれるはずだが、そうはいってもある程度コンピュータに明るくないと厳しいかもしれない。。。参考になれば幸いです。

で、脚力はついたのか?

指導内容が適切なのかは、知識がなく正直分からない。しかし明らかに脚力はついている。同じパワーを出すのに必要な心拍数がこれまでは160bpmだったのが150bpmで済むようになっている。

知識のある人にコーチしてもらえば、さらにもっと脚力はついていたかもしれないが、「アベレージを狙ってくる」のがLLMの特徴である。知識の無い者が使うには十分価値があると感じる。

また、提案してくるメニューが具体的なのでやる気になる。さらに、garmin connectなどでできた従来の練習計画は、計画に変更が出たときのリスケが面倒だったのが、このAIコーチであれば「今日は乗る時間を取れませんでした。明日以降のメニューを作って」と言うだけでリスケしてくれる。非常に柔軟である。

もうちょっと引いた視点の話

AI全盛の今、人間がやることは「ゴールを決めること」だ。今回であれば「高山ヒルクライムで前年より良いタイムを出す」だ。そのあとはAIにお任せだ。

「メニューを考えるのが楽しいんだ、おれの楽しみを奪わないでくれ」という人もいるかもしれない。しかし人間に残された仕事は「ゴールを決めること」「成果物の価値を検証すること」なのだ。

百姓仕事メモ書き

7月に入り、2日仕事をした。

今は収穫時期の一番早い桃であるワッサーとあまとうの世話。

  • あまとうは、大きくなった実から袋外し
  • タイベックというシートを地面に敷く
    • 太陽光を反射して実に色がつくようにするため
  • 実のお尻に触れている葉っぱをむしる
    • 色をつけるため
  • 徒長枝(とちょうし)という、太い枝から上方向に伸びている枝の刈り取り
    • 木の内部にまで日が差すようにするため。やり過ぎると太い枝に直射日光が当たり木の寿命を縮めてしまうので注意
  • 垂れ下がっている枝に支え棒を入れる
    • 頭より下に垂れ下がっていると作業がしずらいのと、枝が折れるのを防ぐため

老人ふたりで面倒を見れる規模だからか、そこまで根詰めてやるという感じではない。午前中3時間、午後2時間労働程度。しかし暑さがしんどいのでこれが限界。服装など暑さ対策を考えねば。

近況

以下の記事からの続き。

koty.hatenablog.com

いろいろ考えた結果、私なりのキャリアチェンジをすることにした。

3行に要約すると、、、

  • 1年前にclaude codeが登場して、(現時点ではまだエンジニアの手が必要だが)エンジニアが不要になる(不要になるは言い過ぎだが、POやPdMなどが残る)未来が見えてきた
  • POやPdMにwillもcanもない私が、このままエンジニアを続けるのは今までよりはリスクが高くなったと考えた
  • 家業の果樹園をどうにかする必要がある。実父は82歳になり、りんごや桃の栽培方法をひととおり教えてもらえるとしたらこの先数年だろう。ちょっと前までは、私の代になったら木を切って草っぱらにでもしとくかと思っていたが。。。

であれば、このタイミングで家業に時間を割くのもありでは。と考えた次第です。

今月から、現職を週3日稼働に減らし、週2日家業の果樹園をしている。まだ果樹園での作業は二日目だが。。。

今の会社は柔軟な働き方ができてありがたい。何の初期投資なく、何の覚悟もなく、ぬるっと就農しており、決意を持って農業を始めている人には恥ずかしくて顔向けできない。

どうなることやら。続報がなかったらお察しください。このblog見てる人どれくらいいるんだろうな。

CYCPLUS T2 レビュー

私のFTPは3.1W/kgくらいです。ので、大して強くないです。だいたいどんなにがんばっても一度のライドで120km程度、獲得標高2,000mいかないくらいの脚力です。なのでそこまでスマートトレーナーにこだわる必要はありません。という前提でお読みください。

今まで3本ローラーで練習してきたが、もう少し落車の心配をせずにのんびりやりたいなと思い、スマートトレーナーのCYCPLUS T2を購入した。

正確には、カセットスプロケットのついていないT2Hという型番である。

これに、105の11速のカセットを一緒に購入した。

設置した様子がこちら。

バーチャルライドアプリとして、確か最初はRouvyを使っていた。その後にMyWhooshを使って、合計20回ほど乗った。

その後ライド中に突然電源が入らなくなってしまった。

サポートに問い合わせたら、動かない様子を撮影した動画を送れというので送ったところ、故障なので新品を送るということになった。 サポートセンター自体は中国国内にあり、そこから日本のamazonの倉庫に発送指示を出すようだ。2日後に新品が届いた。今のところ問題なく使えている。

しかし品質には問題があるらしい。以下の動画を見つけた。安いものには理由があるってことかも。


www.youtube.com

ということで、結論、個人的にはあまりお勧めできないスマートトレーナーである。。。ちなみに技適は取っていた。

MyWhooshはいまのところ快適に使えており、パワートレーニングするだけならで十分なのでお勧め。なんといっても無料。

謹賀新年2026

昨年の振り返り

年末に書いた振り返り記事を眺めると、それなりにいろいろやった年だったのかも。

保護者会長業務が、自分にとってほんとうに厳しく、エネルギーを持っていかれた。

koty.hatenablog.com

とはいえ、家族一同おおむね健康に過ごせたから良い年だったな。自分自身も、有休を病欠に使うこともなく、ほぼすべて余暇にあてることができた。

仕事

早いもので転職7年目だった。 予定していたScalaのプロジェクトは諸般の事情によりなくなり、Rails+Reactのプロジェクトのいち実装メンバーとして活動した。

AI、特にClaude Codeの登場により、システム開発の進め方が激変し、その変化に必死にしがみついていた。

koty.hatenablog.com

仕事以外

CoderDojo

ほそぼそと継続できた。 koty.hatenablog.com

IT勉強会関係

大きめのイベントだと関数型まつりに出てきた。懇親会に何も考えずにひとりで突撃したがかなり辛かった。おひとり様参加するならスタッフとして行くのがいいかもなぁと以前参加した別のイベントでも感じたのを学習していなかった。

NSEGにも参加して、小ネタを話した。

趣味プログラミング

Claude Codeフル活用で、twilogライクなblueskyアーカイブビューアを作った。なかなか満足のいく出来だった。

github.com

ゲーム

自由に使えるSwitchが手に入ったので、例年よりやった。 koty.hatenablog.com

英語

2022年秋からやっている週イチの英会話は継続できた。

5月に会社の研修でシンガポールとマレーシアに行き、現地法人の方とコミュニケーションを取る機会があった。 言いたいことは多少言えたが、相手が言っていることを聞き取るのが厳しく、会話が成立しないことが何度もあった。しかし、相手の言っていることが理解でき、コミュニケーションを取れたときは本当に嬉しく、英語学習を継続してきて良かったと感じた。

TOEICのベストスコアを出せた。 koty.hatenablog.com

ローラー台で練習するときにdisney+のWhiteCollarを見ている。日本語字幕で完走したので、今は英語字幕で見ている。が、きびしい。

ワークアウト関係

おおむね継続できた。 koty.hatenablog.com

今年の抱負

くだんの会長業務も3月で終わるので、もう少しマイペースに生活できたらと思う。でも親の年齢を考えると何かあってもおかしくないことを考えれば、バタバタしてるのが通常営業くらい思っていた方がいいのかな。

仕事

去年よりも、お仕事にエネルギーを向けていきたい。 外部環境的にはAIへのキャッチアップ、内部環境的にも社内の変化への対応が迫られる。

何と言うか、「システム構築スキル」に価値がなくなることが見えたので、今後どうやってメシを食っていくのかを模索する年になるのかな。

仕事以外

CoderDojo

様子を見て、無理のない範囲で月イチ開催を試みるのと、バイブコーディングをネタに入れてみたい。

IT勉強会関係

何かのイベントのスタッフをやってみたい。今年のRubyKaigiは函館かー。遠いわ。

英語

リスニングを強化すべく、シャドーイングに特化したアプリをやってみようと思う。

何かしら英語を使う機会があるといいのだけど、そんな予定は無いんだよな。

ワークアウト関係

ローラー台で修行して、より遠くに行けるようになりたい。鳥居峠を超えて嬬恋に行くのと、渋峠〜牧の周回ルートを完走したい。

ということで、今年も健康第一でやっていきます。

鳥居峠見学時の写真。このときはここで折り返した。

2025年振り返り - ワークアウト

カッコ内は前年比

スイム

  • 回数: 5回
  • 距離 3,700m (▲34,725m)

3月にナガデン若里校が閉校し、プール難民となってしまった。気持ち的には引退状態です。

バイク

  • 回数: 95回 (+6)
  • 距離: 2,814km (▲51km)
  • 獲得標高: 35,704m (+2,894m)

距離は昨年とほぼ同等だが、獲得標高が伸びた。3〜5月はほとんど乗れなかったものの、6月以降はコンスタントに乗れた。一度のライドで登れる高度が増えたので脚力は向上しているのでしょう。ベンチマークにしている山新田セグメントでPRを更新できた。

□ 昨年の懸案だった膝痛はサポーターで、足首痛は毎日のストレッチでかなり軽減できた。秋にスマートトレーナー(CYCPLUS T2H)を導入した。落車の心配がない安心感と、無料のMyWhooshという強い味方を得たので、冬はこれで修行したい。

□ 乗鞍、関田峠、ビーナスライン、渋峠などいろいろ行けた。天気に恵まれないことが多かったのがちょっと残念だが。。。来年は鳥居峠を越えて、嬬恋方面まで足を伸ばてみたい。

道楽をやっていられるのも、家族が健康あってのものです。 来年も健康第一でチャリンコに乗りたい。

白沢峠

大岡

渋峠

乗鞍

CYCPLUS T2H

2025年振り返り - ゲーム

あまり書くことも無いが、一応記録として。。。

秋頃に息子殿待望のSwitch2を購入し、Switchをお下がりとしてもらった。(どちらも私がお金を出したんだけど)

以前からやってみたかったFFシリーズを、5→6→4→2→3の順番で端からやった。所感をメモしておく。何十年も前のゲームに言う意味はないかもしれないけど、ネタバレもあるかもしれないがご了承ください。

2

魔法がしょぼすぎる。伝説の魔法アルテマなのに、戦闘で使えるくらい強くなるには時間をかけて育てねばならない。。。 結果として打撃系で戦うのが主になった。

おしなべて長いダンジョンの「ハズレ部屋」(何もない空っぽの部屋)の存在は納得しがたい。イラッとするだけで何のメリットがあるのか。

3

全体的にダンジョンが鬼のように長い。昔はマップもなかったから、よくやってたと思う。

4

月に行くってストーリーは良い。ジョブチェンジが無い分、キャラごとの個性が最後まで残っていた。今回やった中ではシリーズ中一番良かった。

5

ジョブをマスターしていくと最終的にすっぴんが最強になり、全員すっぴんになる。こうなるとキャラクターの個性がなくなってしまい、戦闘に作戦も何もなくなってしまう。

6

最後は全員アルテマ連発になってしまい、キャラの個性がなくなってしまったのが本当に惜しい。全体に暗い雰囲気のストーリーは好き。

所感

我ながら中身のなさ過ぎる投稿だな。

昔やったようにレベル上げするのがじれったく感じて、経験値4倍のチートを発動してしまった。

ゲームやってると「おれはこんなことしていて良いのか?勉強すべきではないのか?」と感じてしまってどうも没頭できず、早く終わらせねばと焦ってしまう。切り替えのできる人間になりたい。

来年はどうしようかな。ずっと中断している真・女神転生Vを再開するのと、積まれているFF1と7をやろうかな。。。

あと、同僚がこのゲーム激推ししていたので興味はあるのだけど、PS5本体が必要なんだよな。

expedition33.sega.jp