このブログのランニング記録(週ごとの記録や月ごとのまとめ)は、COROSのデータをClaude Codeで集計・分析して書いている。その仕組みと、やってみて分かったことをまとめる。

実際の練習の中身から分かったことは、データで練習を振り返って分かったことに分けて書いた。

やりたかったこと

ランニングの記録を、Claude Codeに楽に分析させたい。週・月ごとの集計、計画どおりの強度で走れたか、インターバルの速い区間だけのペースと心拍。こういったものを、手で集計せずに出したかった。

COROS MCPとは

MCP(Model Context Protocol)は、AIのアプリが外部のデータやツールにつながるための仕組み。COROSは公式のMCPサーバーを公開していて、つなぐとAIがCOROSアカウントのデータを読めるようになる。

COROSの公式ページや、COROSがGitHubで公開しているCOROS-MCPのREADME(2026年10月時点)によると、読めるデータは主に次のとおり。

  • ランの記録、ラップ(スプリット)、.fitファイル(.fitは1日50回まで)
  • VO2max、閾値ペースなどの指標、トレーニング負荷、回復状態
  • 睡眠、心拍、HRV、ストレス

トレーニングプランやワークアウトを作って、COROSのカレンダーに入れる書き込み機能もある。今回は読み取りだけを使っている。

つなぎ方

公式に案内されているサーバーのURLはhttps://mcp.coros.com/mcp。2026年5月に、それまで地域ごとに分かれていた3つのURLが、この1つにまとめられた。アカウントの地域に合わせて、自動でそれぞれのサーバーに振り分ける仕組みになっている。

ただ、Claude CodeではこのURLではつながらず、次のエラーになった。

coros: https://mcp.coros.com/mcp (HTTP) - ✘ Failed to connect — Protected resource https://mcpus.coros.com/mcp does not match expected https://mcp.coros.com (or origin)

mcp.coros.comの認証情報(/.well-known/oauth-protected-resource)を見ると、resourceが地域別のhttps://mcpus.coros.comになっている。MCPのクライアントは、つないだURLとこのresourceが一致することを確かめるので、Claude Codeは別のサーバーとみなして接続を止める。

COROS-MCPのREADMEにも、この振り分けに対応していないAIのクライアントでは接続に失敗することがあり、その場合はアカウントの地域に合わせたURLを直接使うように、と書かれている。

アカウントの地域URL
中国本土https://mcpcn.coros.com/mcp
ヨーロッパhttps://mcpeu.coros.com/mcp
アメリカhttps://mcpus.coros.com/mcp

自分の場合はresourceに出てくるとおりmcpusで、これを直接指定したらつながった。

claude mcp add --transport http coros https://mcpus.coros.com/mcp

どの地域のURLを使えばいいか分からないときは、目安として次のコマンドでresourceを確かめられる。ただしログインする前の情報なので、アカウントの地域と一致するとは限らない。つながらなければ、表の別のURLを試す。

curl -s https://mcp.coros.com/.well-known/oauth-protected-resource

追加したあと、Claude Codeの中で/mcpを開いてcorosを選ぶと、ブラウザでCOROSアカウントのログインと許可の画面が出る。許可すれば使えるようになる。claude.aiやClaudeのデスクトップアプリなら、設定の「コネクタ」からカスタムコネクタとしてURLを追加する。

使ったツール

COROS MCPにはたくさんのツールがあるが、ランの記録を書くのに使ったのは主に2つ。

querySportRecords:ランの一覧

期間と種目(ランニングはsportTypeCodesの100〜103)を指定して、ランの一覧を取る。1本ごとに日付、距離、時間、平均心拍などが返ってくる。

件数が多いと、結果はClaude Codeの会話には直接入らず、ファイルに保存される。ブログ公開日(2026年3月23日)からの392本を取ったときもそうなったので、Pythonでファイルを読んで集計した。週・月の合計、最長ラン、ペース帯ごとの距離などは、すべてこの一覧から出している。

queryActivityLapData:ラップ

1本のランのラップを取る。返ってくるのは、区切り方の違う何種類かのラップのまとまり。

  • 1kmごとの自動ラップ
  • 時計で記録したとおりのラップ(手動で区切った流しなども、ここに入る)
  • 5km・10kmごとのラップ

それぞれのラップに、距離、時間、平均ペース、平均心拍・最大心拍、上りの標高(elevGain)などが入っている。距離の単位はcmで、1kmのラップは100000になっている。

この2種類のラップを組み合わせて、次のようなことをしている。

  • 速い区間を取り出す:1kmラップのペースを並べて、ビルドアップの上げ方や、インターバルの速い区間とつなぎを分ける。
  • 流しを数える:記録したとおりのラップから、200〜300mほどの短くて速いラップを数える。
  • 坂の区間を見つける:1kmで20m以上上るラップが続くところを、坂の区間とする。

記事にするまでの流れ

ブログのリポジトリでClaude Codeを開き、だいたい次の順で進めている。

  1. 曜日ごとの計画や強度の基準、データに出ない練習の中身(坂ダッシュなど)を、最初にClaude Codeに説明しておく
  2. querySportRecordsで対象期間のランを取り、週・月の数字を集計する
  3. 水・土(高強度)と火・金(中強度)、日曜(坂)のランは、queryActivityLapDataでラップを見る
  4. 曜日ごとの計画と照らし合わせて、強度を判定する
  5. Zolaの記事(Markdown)にして、zola buildが通ることを確かめる
  6. ローカルのサーバーで記事を読んで、直してからコミットする

うまくいかなかったこと

平均ペースだけでは、強度を判定できない

最初、Claude Codeは1本のランの平均ペースで強度を分けていた。でも、ビルドアップやインターバルはウォームアップやつなぎで平均が遅くなるので、高強度の日まで中強度と判定してしまう。そこで、ラップを見て「速い区間がどれだけあるか」で判定するように指示した。

その基準も、一度では決まらなかった。「4:00/kmを切る区間があれば高強度」という基準だと、火・金のビルドアップの最後の1〜2kmまで高強度に入ってしまう。自分の中では、高強度の日は4:00/kmよりはっきり速く走っているので、それを伝えて次の基準にした。

  • 中:ゆっくり入って、4:00/km前後まで上げる
  • 高:3:50/km前後かそれより速い区間が、3km以上まとまってある

データに出ないものは、こちらから説明する

日曜の坂練習では、100mの坂ダッシュを7本ほど入れている。でも、ダッシュごとにラップを取っていないので、1kmラップをClaude Codeに分析させると、坂の区間を5:20/km前後でゆっくり上っていると解釈してしまう。坂ダッシュをしていることに気づかず、ジョグだと認識する。そこで、こういう練習の中身はこちらから詳しく説明して、記事に反映させている。

心拍の数字にも注意がいる。ペースのわりに心拍がかなり低く出ている日があった。計測の影響かもしれないので、その日の心拍は他の日と単純に比べないことにした。

理由や感想は、自分で伝える

「9月は心拍が高かった」はデータから言える。でも、その理由はデータには出ない。自分では、8月の休養明けと仕事が多忙だったことだと思っているので、それをClaude Codeに伝えて書かせている。記事では、データから言える事実と自分の考えを分けて書き、AIに理由を推測させて、それらしく書かせることはしない。

これから

ランニングの記録は、毎週の記事と毎月のまとめをこの流れで書いていく。COROS MCPには睡眠やHRV、トレーニング負荷のデータもあるので、練習の記録と合わせて見ていきたい。

練習の中身を検知する機械学習モデルを作りたい

今は、ラップのデータをそのままLLMに読ませて、速い区間やつなぎを見分けさせている。でも、数字の並びを毎回LLMに読ませるのはtokenの無駄が大きい。

そこで、次のようなものを自動で検知する機械学習モデルを作りたい。

  • インターバルの速い区間とつなぎ
  • 坂ダッシュ
  • 流し

それぞれについて、距離、スピード、心拍を取り出す。COROS MCPからは秒単位のデータが入った.fitファイルも取れるので、ラップを取っていない坂ダッシュも、そこから見つけられるはず。

LLMには、モデルが取り出した結果だけを渡して、記事にする部分を任せる。作ったら、このブログで報告する。

(2026/10/18追記)坂ダッシュと流しについて作った。機械学習ではなく、しきい値で判定するルールにしている。COROSの.fitファイルから、坂ダッシュと流しを自動で見つけるにまとめた。

参考