strava-mcp

Open Source

Your Strava data,
ready to query.

A read-only MCP server that connects your Strava account to any MCP-compatible assistant — Claude, Cursor, Windsurf, and others. Ask questions about your training data directly in conversation. No data stored. No model training. No sharing.

Connect now GitHub

Connect to the hosted instance

No account or deployment needed. Authorise via Strava and start querying your data.

  1. Open your MCP client's connector settings. In Claude: Settings → Connectors → Add custom connector. In Cursor: Settings → MCP → Add server.

  2. Enter the server URL:

    https://strava-mcp.mikekeefe.workers.dev/mcp
  3. Click Connect. Your MCP client opens a Strava authorisation page — approve access and you're done.

  4. Test it: ask "what's my latest activity?" or "show me my 5k PR history."

By connecting, you agree to the privacy policy. Your tokens are stored per-user in Cloudflare KV and can be revoked at any time from strava.com/settings/apps.
Your MCP client ──OAuth 2.0──▶ strava-mcp Worker ──Strava API──▶ Your data
Claude · Cursor · Windsurf · VS Code Copilot · any MCP-compatible client

What this is not

No model training — Strava data is never used to train AI models
No data aggregation — each user accesses only their own data
No persistent storage — activity data is never stored permanently
No cross-user visibility — one user's data is never accessible to another
No write operations — read-only Strava scopes, always
No replication of Strava features — no leaderboards, no public rankings

19 read-only tools

get_athlete_profile

Name, location, weight, FTP

get_recent_activities

Activity list with filters & pagination

get_activity_details

Full activity breakdown

get_activity_streams

Raw per-second sensor data

get_activity_best_efforts

Best efforts with PR ranks

get_athlete_best_efforts

Best efforts at a distance, over time

get_athlete_summary

Weekly / monthly rollups

get_activity_zones

HR & power zone distribution

get_activity_laps

Lap-by-lap breakdown

get_athlete_zones

Your zone thresholds

get_athlete_stats

Recent / YTD / all-time totals

get_segment_details

Segment info & your PR

list_my_segment_efforts

All your efforts on a segment

get_segment_effort_streams

Per-second segment streams

explore_segments

Find segments in a bounding box

list_routes

Your saved routes

get_route_details

Route metadata & streams

list_gear

Bikes & shoes with mileage

health

Rate limits, cache stats, diagnostics

Deploy your own in 8 steps

  1. Clone the repo and run pnpm install.

  2. Create a Strava API app at strava.com/settings/api. Note your Client ID and Secret. Set the callback domain to localhost for now.

  3. Create a Cloudflare account (free tier works) and run npx wrangler login.

  4. Create KV namespaces — run npx wrangler kv namespace create TOKEN_CACHE and STREAM_CACHE (plus --preview variants). Paste the IDs into wrangler.jsonc.

  5. Deploy with pnpm run deploy. Your Worker URL is printed at the end.

  6. Set secrets via npx wrangler secret putSTRAVA_CLIENT_ID, STRAVA_CLIENT_SECRET, MCP_AUTH_TOKEN, and WEBHOOK_VERIFY_TOKEN.

  7. Update the Strava callback domain to your Worker's hostname, then register the webhook subscription so Strava can notify you on deauthorisation. See the README for the one-line curl command.

  8. Add the server in your MCP client. In Claude: Settings → Connectors → Add custom connector → paste your Worker URL + /mcp. Other clients follow a similar pattern — check their MCP documentation.

Privacy: This server is a thin pass-through. It stores only the OAuth tokens needed to call the Strava API on your behalf. No activity data is stored permanently. Strava data is never used for model training. You can revoke access at any time from Strava's connected apps page or by disconnecting in your MCP client. Full privacy policy →