mcpField
S
strava-mcp

strava-mcp

ローカル
github.comヘルスケア03 日前に更新

strava-mcp について

strava-mcpは、Stravaデータにアクティビティ編集、セグメントやルートの管理、分析機能を加えるリモートMCPサーバーです。StravaをMCPクライアントで扱う人向けで、トレーニング分析とインタラクティブな可視化も提供します。

主な機能

  1. 01アクティビティの作成と更新
  2. 02セグメントの検索と管理
  3. 03ルートの表示とエクスポート
  4. 04インターバルとトレーニング負荷の分析
  5. 05写真、ゾーン、ランニング概要の表示
  6. 069種類のインタラクティブな可視化

活用シーン

  1. 01アクティビティの編集や手動ワークアウトの追加
  2. 02セグメントの記録と進捗の確認
  3. 03ルートのGPXまたはTCXエクスポート
  4. 04トレーニング傾向の比較とレースコンディションの評価

MCP 対応

Streamable HTTP経由で、Stravaのアクティビティ、セグメント、ルート、分析、可視化のツールをMCPクライアントに提供します。リモートデプロイとトークンの自動更新に対応します。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"ljcl-strava": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"STRAVA_CLIENT_ID",
"-e",
"STRAVA_CLIENT_SECRET",
"-e",
"PUBLIC_URL",
"-e",
"STRAVA_ACCESS_TOKEN",
"-e",
"STRAVA_REFRESH_TOKEN",
"-e",
"MCP_AUTH_TOKEN",
"-e",
"PORT",
"-e",
"TOKEN_DATA_DIR",
"-e",
"ROUTE_EXPORT_PATH",
"ghcr.io/ljcl/strava-mcp:3.0.0"
],
"env": {
"STRAVA_CLIENT_ID": "<STRAVA_CLIENT_ID>",
"STRAVA_CLIENT_SECRET": "<STRAVA_CLIENT_SECRET>",
"PUBLIC_URL": "<PUBLIC_URL>",
"STRAVA_ACCESS_TOKEN": "<STRAVA_ACCESS_TOKEN>",
"STRAVA_REFRESH_TOKEN": "<STRAVA_REFRESH_TOKEN>",
"MCP_AUTH_TOKEN": "<MCP_AUTH_TOKEN>",
"PORT": "<PORT>",
"TOKEN_DATA_DIR": "<TOKEN_DATA_DIR>",
"ROUTE_EXPORT_PATH": "<ROUTE_EXPORT_PATH>"
}
}
}
}
起動コマンドdocker run -i --rm -e STRAVA_CLIENT_ID -e STRAVA_CLIENT_SECRET -e PUBLIC_URL -e STRAVA_ACCESS_TOKEN -e STRAVA_REFRESH_TOKEN -e MCP_AUTH_TOKEN -e PORT -e TOKEN_DATA_DIR -e ROUTE_EXPORT_PATH ghcr.io/ljcl/strava-mcp:3.0.0
設定が必要な環境変数
STRAVA_CLIENT_IDStrava API client ID
STRAVA_CLIENT_SECRETシークレットStrava API client secret
PUBLIC_URLPublic HTTPS URL used for the Strava OAuth callback
STRAVA_ACCESS_TOKENシークレットOptional initial access token from setup-auth
STRAVA_REFRESH_TOKENシークレットOptional initial refresh token from setup-auth
MCP_AUTH_TOKENシークレットShared secret gating /mcp and the OAuth web routes (recommended when internet-facing)
PORTServer port (default 3000)
TOKEN_DATA_DIRシークレットOverride token storage directory (default ./data)
ROUTE_EXPORT_PATHAbsolute directory for exported route files

ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
ocighcr.io/ljcl/strava-mcp:3.0.0

ツール

ツール一覧はまだ取得されていません

ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。

詳細

Strava MCP

CI Storybook License: MIT

公式の Strava MCP コネクターを補完する Model Context Protocol(MCP)サーバーです。公式コネクターにはない書き込みアクセス、セグメント、ルート、写真、派生分析、インタラクティブな視覚化を追加します。

機能

  • アクティビティの書き込みと更新(タイトル、説明、スポーツの種類、ギア、フラグ)
  • デバイスで記録していないセッション(筋力トレーニング、ヨガ、トレッドミル)の手動アクティビティを作成
  • セグメントの探索、表示、お気に入り登録、管理
  • アクティビティごとの写真、ゾーンの内訳、ランニングの概要を取得
  • 保存済みルートの一覧表示と詳細表示
  • ルートのエクスポート(GPX/TCX)とアクティビティのトラックのエクスポート(ストリームからGPXを生成)
  • Strava が公開していない派生分析:インターバル検出、登り/下りの内訳、有酸素デカップリング、トレーニング負荷、フィットネス/疲労/フォーム(CTL/ATL/TSB)、目標レース当日のフォームに向けたテーパリングの最適化
  • MCP を介した AI に適した JSON レスポンス
  • MCP 互換ホストで表示される9種類のインタラクティブな視覚化 — アクティビティチャート、ケイデンストレンド、ルートマップ、アクティビティセグメント、トレーニング負荷、アクティビティ比較、アクティビティゾーン、セグメントの進捗、フィットネストレンド
  • 週次レビュー、ランニングの注釈付け、セグメント探しのガイド付きプロンプト(docs/tools.md)
  • トークンの自動更新
  • リモートデプロイ向けの Streamable HTTP トランスポート

ライブ Storybookで UI コンポーネントをご覧いただけます。

ツールカタログ、プロンプト、権限の動作、リクエスト例については、docs/tools.mdをご覧ください。

クイックスタート(Docker)

1. Strava API アプリケーションを作成する
  1. strava.com/settings/apiにアクセスします
  2. 新しいアプリケーションを作成します:
    • アプリケーションの詳細(名前、ウェブサイト、説明)を入力します
    • 「Authorization Callback Domain」に公開 URL のホスト名(例:strava-mcp.example.com)を設定します
    • Client IDとClient Secretを控えます
2. 環境を設定する
cp .env.example .env

.envを編集して値を設定します:

STRAVA_CLIENT_ID=your_client_id
STRAVA_CLIENT_SECRET=your_client_secret
PUBLIC_URL=https://your-public-url.example.com

すべての変数はdocs/operations.mdに記載されています。ビルド済みイメージを使いますか?ghcr.io/ljcl/strava-mcp:latest(MCP registryではio.github.ljcl/strava-mcpとしても公開)をプルし、ビルドする代わりに compose のimage:をそのイメージに指定してください。Strava の認証情報は引き続きご自身で用意する必要があります。公開イメージには SBOM/来歴のアテステーションが付属しており、検証できます。詳しくはoperations.mdをご覧ください。

**./dataのバインドマウントに関する注意:**トークンはここに保存されます。また、distroless イメージは非 root の UID 65534 で実行されるため、この UID がディレクトリに書き込める必要があります。そうでない場合、初回起動時にトークンの永続化に失敗します:

mkdir -p data
sudo chown -R 65534:65534 data

代わりに、docker-compose.ymlで名前付きボリューム(例:strava-data:/app/data)を使用すると、Docker が適切な所有権で初期化します。詳しくはoperations.mdをご覧ください。

3. サーバーを起動する
docker compose up -d

GET /healthは Strava API のリクエストを消費せずに稼働状況を報告します。MCP_AUTH_TOKENを設定している場合は、認証とレート制限の状態も報告します。レスポンス形式と監視方法については、operations.mdをご覧ください。

4. Strava で認証する

ブラウザーでhttps://your-public-url/auth/startにアクセスします。認証後、トークンは自動的に保存され、以降は自動で更新されます。ステータスはいつでも/auth/statusで確認できます。

MCP_AUTH_TOKENを設定している場合は、両方の URL に?token=<MCP_AUTH_TOKEN>を追加してください。

5. Claude Desktop に接続する

Claude の設定(macOS の場合は ~/Library/Application Support/Claude/claude_desktop_config.json)に追加します。

{
  "mcpServers": {
    "strava": {
      "type": "url",
      "url": "https://your-public-url/mcp",
      "headers": { "Authorization": "Bearer your-mcp-auth-token" }
    }
  }
}

headers エントリーが必要なのは、MCP_AUTH_TOKEN が設定されている場合のみです(トンネル経由で公開するサーバーでは設定を推奨します。エンドポイントの保護を参照してください)。

新しい設定を読み込むため、Claude Desktop を再起動します。

AI ツールへの接続

ほとんどの AI ツール(Claude Desktop、Claude Code など)が MCP サーバーに接続するには、HTTPS URL が必要です。サーバーはローカルネットワーク上で動作するため、公開するにはトンネルが必要です。

Tailscale Funnel(推奨)

Tailscale Funnel を使うと、設定なしでローカルポートを HTTPS 経由でインターネットに公開できます。

tailscale funnel --bg 3000
# → https://your-machine.tail1234.ts.net

.env の PUBLIC_URL に、生成された URL を設定します。

Cloudflare Tunnel
cloudflared tunnel --url http://localhost:3000
エンドポイントの保護

トンネルを使うと、URL を知っている人なら誰でも /mcp にアクセスできるようになります。これには update-activity 書き込みツールも含まれます。MCP_AUTH_TOKEN に長くランダムなシークレット(openssl rand -hex 32)を設定してください。これにより、すべての /mcp リクエストで Authorization: Bearer <token> が必要になります。各クライアントの設定例では、ヘッダーを指定する場所を示しています。このシークレットは /auth/start と /auth/status も保護します。詳細(OAuth コールバックの安全性を保つ方法を含む)については、operations.mdを参照してください。

Strava の認証情報とともに .env に設定します。docker-compose.yml によって自動的に転送されます。

AI Tool (Claude Desktop, Claude Code, etc.)
    │  HTTPS
HTTPS Tunnel (Tailscale / Cloudflare)
    │  HTTP (localhost:3000)
Strava MCP Server (Docker / Bun)
    │  HTTPS
Strava API
クライアントの設定

このサーバーは、Streamable HTTP トランスポートをサポートするあらゆる MCP クライアントで動作します。以下の各設定例では、https://your-public-url をトンネルの URL に置き換えてください(ローカル開発の場合は http://localhost:3000 を使用します)。MCP_AUTH_TOKEN を設定した場合のみ、Authorization ヘッダーを含めてください。

Claude Code
claude mcp add --transport http strava https://your-public-url/mcp \
  --header "Authorization: Bearer your-mcp-auth-token"
Cursor

プロジェクトの .cursor/mcp.json に追加します(すべてのプロジェクトに適用する場合は ~/.cursor/mcp.json に追加します)。

{
  "mcpServers": {
    "strava": {
      "url": "https://your-public-url/mcp",
      "headers": { "Authorization": "Bearer your-mcp-auth-token" }
    }
  }
}
VS Code

ワークスペースの .vscode/mcp.json に追加します(または、コマンドパレットから MCP: Add Server を実行します)。

{
  "servers": {
    "strava": {
      "type": "http",
      "url": "https://your-public-url/mcp",
      "headers": { "Authorization": "Bearer your-mcp-auth-token" }
    }
  }
}
その他のクライアント(汎用 Streamable HTTP)

Streamable HTTP に対応したクライアントなら、/mcp エンドポイントに直接接続できます。1 つの URL で、どちらのプロトコル世代にも対応します。2026-07-28 のクライアントは、io.modelcontextprotocol/* エンベロープキーを含むステートレスリクエストを送信し(server/discover で機能を通知します)、2025 年世代のクライアントは通常の initialize ハンドシェイクを使用します。Accept: application/json, text/event-stream ヘッダーを付けて JSON-RPC メッセージを POST します。プロトコルの詳細については、docs/architecture.mdを参照してください。

公式 Strava MCP と併用する

Strava の公式 MCP コネクターは、アクティビティの検索と基本的な読み取りに対応します。このサーバーは、公式コネクターが提供していない機能、つまりアクティビティ、セグメント、ルートへの書き込み、GPX/TCX エクスポート、写真、派生分析、インタラクティブな可視化を補います。

両方をインストールする
  • 公式:claude mcp add --transport http strava-mcp https://mcp.strava.com/mcp(または claude.ai Connectors/Claude Desktop から)。
  • このサーバー:上記のインストール手順を参照してください。
それぞれの役割
機能公式このサーバー
アクティビティ、ストリーム、プロフィール、ゾーン、ギア、クラブ、トレーニングプランの一覧表示/読み取りはいいいえ(公式を使用)
アクティビティの更新、セグメントへのスター付けいいえはい
セグメントの詳細/検索/走行記録いいえはい
ルートおよび GPX/TCX エクスポートいいえはい
アクティビティの GPX エクスポート(ストリームから合成)いいえはい
アクティビティの写真いいえはい
アスリートの統計、アクティビティごとのゾーン、ベスト記録、ランニング概要、トレーニング負荷、比較いいえはい
インターバル、登坂、有酸素運動の分析、フィットネス/疲労/フォーム(CTL/ATL/TSB)いいえはい
インタラクティブアプリ:アクティビティのグラフ、ケイデンスの傾向、ルートマップ、アクティビティのセグメント、トレーニング負荷、アクティビティの比較、アクティビティのゾーン、セグメントの進捗、フィットネスの推移いいえはい
注意事項
  • 公式コネクターの利用には Strava のサブスクリプションが必要で、現在は Anthropic のクライアントでのみ動作します。
  • 重複する読み取りをなくしたため、このサーバーでアクティビティを検索するには、公式コネクターがインストールされていることが実質的に前提となります。集計分析ツール(get-best-efforts、get-training-load)は独自にアクティビティ一覧を取得しますが、アクティビティ単位のツール(get-running-summary、compare-activities、get-activity-zones など)には、公式の list_activities から取得したアクティビティ ID が必要です。
  • 2つのツールは異なるレート制限枠を使用するため、両方を実行すると API の負荷を分散できます。
推奨ワークフロー

公式コネクターでアクティビティを検索して読み取り、その後、このサーバーを使って書き込み、セグメントの探索、ルートの管理とエクスポート、可視化を行います。モデルは公式の list_activities から取得したアクティビティ ID を、このサーバーのツールに直接渡せます。

リクエスト例

次のような質問を AI アシスタントにしてみてください(公式の Strava MCP を使ってアクティビティ ID を検索し、その後、これらのツールに渡します)。

  • 「アクティビティ 12345678 のタイトルを『Morning Threshold』に変更して」
  • 「アクティビティ 12345678 の心拍ゾーンの内訳を表示して」
  • 「アクティビティ 12345678 のインターバルを分析して。各反復でペースが落ちている?」
  • 「日曜日のロングランは前半より後半のペースが落ちていた?それとも、坂のせいだった?」
  • 「レースは9月13日です。TSB +10 で当日を迎えるには、次の3週間をどう過ごせばよい?」
  • 「セグメント 8109834 で速くなっている?これまでの記録を見せて」
  • 「10k、21k、32k 地点に補給ポイントを設けたレースルートを地図に表示して、28k 地点の上り坂に目印を付けて」

詳細は docs/tools.md を参照してください。

ローカル開発

前提条件:Bun と Strava アカウント。

bun install

# Guided OAuth flow using localhost as redirect URI
cd apps/server && bun run setup-auth && cd ../..

# Start dev server (server + MCP App watchers)
bun run dev

任意のクライアントから http://localhost:3000/mcp に接続してください。リポジトリの構成、タスクランナー、テスト、カバレッジゲート、Storybook のワークフローについては、docs/development.md を参照してください。エージェントの規約は AGENTS.md に記載されています。

ドキュメント

ドキュメント内容
docs/tools.mdツールの全カタログ、プロンプト、権限の動作、リクエスト例
docs/operations.md環境変数、認証/トークンの取り扱い、ヘルスエンドポイント、レート制限、エンドポイントのセキュリティ
docs/architecture.mdサーバーアーキテクチャ:トランスポート、HTTP レイヤー、キャッシュ、エラー分類、分析の計算
docs/mcp-apps.mdMCP App パッケージ:共有シェル、モバイル、テーマ設定、アプリごとの詳細
docs/development.mdモノレポの仕組み:Turborepo、カバレッジゲート、Storybook ゲート、Docker ビルド
docs/releasing.mdリリースの自動化:Conventional Commit 形式の PR タイトル、release-please、公開
docs/project.mdIssue の追跡とプロジェクトボード

PR は squash merge され、PR タイトルが main 上のコミットになります。そのため、Conventional Commit の形式で記述してください(feat: はマイナー、fix: はパッチ、feat!: はメジャー、chore:/docs:/refactor:/ci: はリリースなし)。CI チェックにより、形式に準拠していないタイトルは拒否されます。詳細は docs/releasing.md を参照してください。

トラブルシューティング

AI ツールがサーバーに接続できない — MCP では HTTPS URL が必要です。トンネル(Tailscale Funnel または Cloudflare Tunnel)を使って、ローカルサーバーを公開してください。AI ツールへの接続を参照してください。

OAuth コールバックが失敗する — .env の PUBLIC_URL がトンネルの URL と完全に一致していること、また同じホスト名がStrava API の設定で「Authorization Callback Domain」として設定されていることを確認してください。

トークンエラーまたはトークンの期限切れ — まず /health を確認してください。authenticated と token_expires_at から、サーバーが使用可能なトークンを保持しているかどうかがわかり、認証の問題と接続可能性の問題を区別できます。次に /auth/start にアクセスして、再認証してください。トークンは自動的に更新されますが、リフレッシュトークンが取り消された場合や、新しいリリースでスコープが追加された場合は、完全な再認証が必要です。operations.mdを参照してください。

サーバーは起動していて、接続可能ですか? — curl https://your-public-url/health を実行してください。Strava API にアクセスせずに応答するため、レート制限を使い切った場合でも動作します。

コンテナーを再起動するとトークンが保持されない(Docker) — コンテナーは非 root の UID 65534 で実行されるため、./data のバインドマウントはその UID で書き込み可能である必要があります(sudo chown -R 65534:65534 data)。または、代わりに名前付きボリュームを使用してください。クイックスタートの手順 2とoperations.mdを参照してください。

許可したのに、クライアントが読み取りツールの使用許可を再度求める — リリースでツール名が変更されたか、入力スキーマが変更された可能性があります。許可はツールの識別情報ごとに保存されるため、変更によって許可が失われます。該当する場合は、リリースの変更履歴に記載されています。それ以外の場合、設定の保持はクライアント側で行われるため、コネクター単位とツール単位の両方の設定を確認してください。docs/tools.mdを参照してください。

ライセンス

MIT

コメント

MCP は初めてですか?

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

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