{
  "markdown": "<!-- delx-wellness header v2 -->\n<h1 align=\"center\">Strava MCP</h1>\n\n<div align=\"center\">\n  <img src=\"assets/banner.png\" alt=\"Strava MCP — Strava MCP for AI agents\" width=\"85%\" />\n</div>\n\n<h3 align=\"center\">\n  Give your AI agent your Strava activities, streams, segments and routes &mdash; locally.<br>\n  Local-first MCP server &mdash; <strong>tokens never leave your machine</strong>.\n</h3>\n\n<p align=\"center\">\n  <a href=\"https://www.npmjs.com/package/strava-mcp-unofficial\"><img src=\"https://img.shields.io/npm/v/strava-mcp-unofficial?style=for-the-badge&labelColor=0F172A&color=10B981&logo=npm&logoColor=white\" alt=\"npm version\" /></a>\n  <a href=\"https://www.npmjs.com/package/strava-mcp-unofficial\"><img src=\"https://img.shields.io/npm/dm/strava-mcp-unofficial?style=for-the-badge&labelColor=0F172A&color=0EA5A3&logo=npm&logoColor=white\" alt=\"npm downloads\" /></a>\n  <a href=\"LICENSE\"><img src=\"https://img.shields.io/badge/LICENSE-MIT-22C55E?style=for-the-badge&labelColor=0F172A\" alt=\"License MIT\" /></a>\n  <a href=\"https://wellness.delx.ai/connectors/strava\"><img src=\"https://img.shields.io/badge/SITE-wellness.delx.ai-0EA5A3?style=for-the-badge&labelColor=0F172A\" alt=\"Site\" /></a>\n</p>\n\n<p align=\"center\">\n  <a href=\"https://github.com/davidmosiah/strava-mcp/stargazers\"><img src=\"https://img.shields.io/github/stars/davidmosiah/strava-mcp?style=for-the-badge&labelColor=0F172A&color=FBBF24&logo=github\" alt=\"GitHub stars\" /></a>\n  <a href=\"https://modelcontextprotocol.io\"><img src=\"https://img.shields.io/badge/BUILT_FOR-MCP-7C3AED?style=for-the-badge&labelColor=0F172A\" alt=\"Built for MCP\" /></a>\n  <a href=\"https://github.com/davidmosiah/delx-wellness-hermes\"><img src=\"https://img.shields.io/badge/HERMES-one--command_setup-10B981?style=for-the-badge&labelColor=0F172A\" alt=\"Hermes one-command setup\" /></a>\n  <a href=\"https://github.com/davidmosiah/delx-wellness\"><img src=\"https://img.shields.io/badge/Strava-FC4C02?style=for-the-badge&labelColor=0F172A&logoColor=white&logo=strava&logoColor=white\" alt=\"Strava\" /></a>\n</p>\n\n> ⚡ **One-command install** with [Delx Wellness for Hermes](https://github.com/davidmosiah/delx-wellness-hermes):\n> `npx -y delx-wellness-hermes setup` &mdash; preconfigures this connector and the other 8 in a dedicated Hermes profile.\n>\n> Or wire it standalone into Claude Desktop / Cursor / ChatGPT Desktop &mdash; see the install section below.\n\n---\n\n## HTTP (v2 stateless)\n\nDefault is **stdio**. Optional Streamable HTTP — no session id, JSON responses, loopback only:\n\n```bash\nnpx -y strava-mcp-unofficial --http\n# GET  http://127.0.0.1:3000/health\n# POST http://127.0.0.1:3000/mcp   (sessionless)\n```\n\nEnv: `STRAVA_MCP_HOST`, `STRAVA_MCP_PORT`, `STRAVA_MCP_TRANSPORT=http`.\n\n\n<!-- /delx-wellness header v2 -->\n\n**Local-first MCP server that connects AI agents to your Strava activities, routes, streams and training context.**\n\n> **Unofficial project.** Not affiliated with, endorsed by or supported by Strava, Inc. Strava is a trademark of its respective owner. Use this only with your own Strava account and in line with Strava's API agreement.\n\nBuilt by [David Mosiah](https://github.com/davidmosiah) for people who use Claude, Cursor, Hermes, OpenClaw or other MCP-compatible agents to think about training, endurance and performance — without copy-pasting numbers from Strava.\n\nPart of [Delx Wellness](https://github.com/davidmosiah/delx-wellness), a registry of local-first wellness MCP connectors.\n\n> If this connector helps your agent workflow, please star the repo. Stars make the project easier for other AI builders to discover and help Delx keep shipping local-first wellness infrastructure.\n\n## Why this exists\n\nStrava holds the long memory of your training — every ride, run, swim, segment, route and stream. But it lives behind an OAuth API with strict rate limits (200 req/15min, 2k/day per app) and GPS data that's privacy-sensitive by default.\n\nThis package does the OAuth dance locally, throttles under Strava's per-app limits, redacts GPS lat/lng unless you explicitly opt in, and exposes Strava through the Model Context Protocol. Any MCP-compatible agent gets your training context with one config snippet. Tokens never leave your machine.\n\n## Quickstart\n\nFrom zero to your first agent call in about a minute. You only need a Strava app ([create one here](https://www.strava.com/settings/api)) with redirect URI `http://127.0.0.1:3000/callback`.\n\n**1. Paste your app's client id + secret** (interactive, stored at `~/.strava-mcp/config.json` with `0600`):\n\n```bash\nnpx -y strava-mcp-unofficial setup\n```\n\n**2. Authorize Strava.** `auth` opens your browser; `--no-open` prints the URL so you can paste it yourself (handy on a headless box). Tokens are saved locally — the command never prints them:\n\n```console\n$ npx -y strava-mcp-unofficial auth --no-open\nStrava MCP · Authorization\n\nOpen this URL manually:\n  https://www.strava.com/oauth/authorize?client_id=12345&redirect_uri=http%3A%2F%2F127.0.0.1%3A3000%2Fcallback&response_type=code&approval_prompt=auto&scope=read%2Cactivity%3Aread_all%2Cprofile%3Aread_all&state=aa38f29b\n\nSteps\n  1. Approve access in the browser tab that opens.\n  2. Strava will redirect to the local callback.\n  3. Tokens are saved locally; this command never prints them.\n\nWaiting for callback...\n```\n\n**3. Verify you're ready** — `doctor` confirms scopes and setup without calling Strava:\n\n```console\n$ npx -y strava-mcp-unofficial doctor\nStrava MCP · Doctor\nStatus: READY ✓\n\nChecks\n  ✓  Node.js >=20\n  ✓  Env vars\n  ✓  Local config\n  ✓  Automatic auth redirect\n  ✓  Token file\n  ✓  Token permissions\n  ✓  Refresh token\n  ✓  OAuth scopes\n  ·  Privacy mode\n  ·  Cache\n\nNext steps\n  1. Ready. Add this MCP server to your agent and start with strava_daily_summary.\n```\n\nIf `OAuth scopes` shows a `✗`, re-run `auth` and approve `activity:read_all profile:read_all read`.\n\n**4. Make a first call — no live account required.** Ask your agent to run `strava_demo`. It returns realistic, synthetic payloads (tagged `is_demo: true`) so you can wire prompts before connecting real data:\n\n```text\n> Call strava_demo and summarize my week.\n\n# Strava Demo\n\n- **is_demo**: true\n- **recent_sessions**: 3\n- **load_classification**: moderate\n- **primary_signal**: Recent Strava load is manageable; use intent and consistency as the main lever.\n- **recommended_handoff**: exercise_catalog_recommend_session\n```\n\nCall it with `response_format: \"json\"` for the full shapes. The `sample` block mirrors `strava_daily_summary`, `strava_training_context` and `strava_list_activities` key-for-key — `npm run test:demo-contract` runs the real builders over `fixtures/strava-activities.mjs` and fails the build if the demo ever invents a field or omits one. Swap `strava_demo` for the real tool and the same shape arrives filled with your Strava data.\n\n**5. Wire it into your MCP client:**\n\n```json\n{\n  \"mcpServers\": {\n    \"strava\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"strava-mcp-unofficial\"]\n    }\n  }\n}\n```\n\nFor Claude Desktop, run `setup --client claude` and the snippet is written for you. For Hermes, see [Hermes / remote setup](#hermes--remote-setup) below.\n\n## Try it with your agent\n\nThree things to ask first:\n\n```text\nUse strava_connection_status to check setup, then run strava_daily_summary.\nTell me what my training context looks like in 5 lines.\n```\n\n```text\nCall strava_weekly_summary with response_format=json. Find my biggest\nload/intensity bottleneck and give me a next-week endurance plan.\n```\n\n```text\nUse the strava_activity_stream_investigator prompt for activity_id=<id>.\nDon't expose GPS unless I explicitly ask for it.\n```\n\n## Data availability\n\nThis package uses the official Strava API v3. When this README says `raw`, it means the upstream Strava JSON for a supported endpoint — not continuous device telemetry.\n\n| Data | Available | Notes |\n|---|:---:|---|\n| Activities (runs, rides, swims, walks, workouts) | ✓ | All recorded activities |\n| Activity details + zones + splits | ✓ | HR, power, cadence, elevation, gear |\n| Activity streams (HR / cadence / watts / altitude) | ✓ | Per-second samples for the activity |\n| GPS lat/lng streams | opt-in | Hidden by default; requires `include_gps=true` or `raw` mode |\n| Athlete profile + zones + aggregate stats | ✓ | Authenticated athlete |\n| Routes + clubs + gear | ✓ | Route geometry redacted in summary/structured modes |\n| Live device telemetry / continuous HR | — | Not exposed by Strava's public API |\n\n## Tools\n\n**Start with these:**\n\n- `strava_connection_status` — verify local setup, scopes and readiness before calling Strava\n- `strava_data_inventory` — inventory supported data domains, scopes, privacy modes and recommended first calls without calling Strava APIs.\n- `strava_daily_summary` — latest activity, weekly load and intensity context for today\n- `strava_weekly_summary` — scorecard, comparison vs prior week, next-week training plan\n\n**Auth & diagnostics**\n\n- `strava_capabilities`, `strava_agent_manifest`, `strava_privacy_audit`, `strava_cache_status`\n- `strava_get_auth_url`, `strava_exchange_code`, `strava_revoke_access`\n\n**Athlete & training**\n\n- `strava_get_athlete`, `strava_get_zones`, `strava_get_athlete_stats`\n\n**Activities & streams**\n\n- `strava_list_activities`, `strava_get_activity`, `strava_get_activity_zones`\n- `strava_activity_series`, `strava_get_activity_streams` — GPS lat/lng requires `include_gps=true` or `raw` mode\n\n**Routes & context**\n\n- `strava_list_routes`, `strava_get_route`, `strava_list_clubs`, `strava_get_gear`\n\n## Prompts\n\n- `strava_daily_training_director` — practical daily training brief\n- `strava_weekly_endurance_review` — week comparison + next-week endurance plan\n- `strava_activity_stream_investigator` — investigate one activity using streams (GPS-aware)\n\nEach accepts `timezone` (IANA, default `UTC`).\n\n## Resources\n\n- `strava://capabilities`, `strava://agent-manifest`\n- `strava://athlete`\n- `strava://latest/activity`\n- `strava://summary/daily`, `strava://summary/weekly`\n\n## Privacy & security\n\n- OAuth tokens are stored in `~/.strava-mcp/tokens.json` with `0600` permissions and are never returned by tools.\n- Write/upload scopes are **not** requested by default — read-only by design.\n- GPS lat/lng and route geometry are recursively removed in `summary` and `structured` modes, and only included with explicit `include_gps=true` for stream calls or `raw` mode.\n- Structured mode otherwise preserves complete upstream physiological records and future Strava fields.\n- Activity `after` / `before` filters retain instant semantics when converted from timezone-aware ISO date-times to Strava epoch seconds; invalid ranges fail before HTTP.\n- Route geometry is also redacted unless raw mode is explicitly requested.\n- The MCP client never sees access or refresh tokens.\n- This is **not medical advice**. The server exposes user-authorized data for personal AI workflows, not diagnosis or training prescription.\n\n## Configuration\n\n`setup` writes most of these into `~/.strava-mcp/config.json` (`0600`). Manual env override is supported:\n\n```bash\nSTRAVA_CLIENT_ID=…\nSTRAVA_CLIENT_SECRET=…\nSTRAVA_REDIRECT_URI=http://127.0.0.1:3000/callback\n\n# Optional\nSTRAVA_SCOPES=\"read activity:read_all profile:read_all\"\nSTRAVA_PRIVACY_MODE=structured        # summary | structured | raw\nSTRAVA_CACHE=sqlite                   # optional read-through cache\n```\n\n## Hermes / remote setup\n\n```bash\nnpx -y strava-mcp-unofficial setup --client hermes --no-auth\nnpx -y strava-mcp-unofficial auth                       # run locally if browser auth is needed\nnpx -y strava-mcp-unofficial doctor --client hermes\nhermes mcp test strava\n```\n\nHermes commonly exposes Strava tools with a prefix:\n\n- `mcp_strava_strava_agent_manifest`\n- `mcp_strava_strava_connection_status`\n- `mcp_strava_strava_daily_summary`\n- `mcp_strava_strava_weekly_summary`\n- `mcp_strava_strava_get_activity_streams`\n\nAfter Hermes config changes, use `/reload-mcp` or `hermes mcp test strava`. Don't restart the gateway for normal data access.\n\nIf browser OAuth has to happen on a different machine than Hermes, run `auth` locally and copy `~/.strava-mcp/tokens.json` to the server with `chmod 600`. The token must include `activity:read_all profile:read_all read` for activity history and streams.\n\n## Requirements\n\n- Node.js 20+\n- A Strava app with redirect URI `http://127.0.0.1:3000/callback`\n\nWhy these scopes:\n\n- `read` — public profile, routes and public Strava resources\n- `activity:read_all` — your activities, including private activities visible to your app\n- `profile:read_all` — fuller authenticated athlete profile fields\n\nNo write scope is requested by default.\n\n## Development\n\n```bash\ngit clone https://github.com/davidmosiah/strava-mcp.git\ncd strava-mcp\nnpm install\nnpm test\nnpm run build\n```\n\nTest with MCP Inspector:\n\n```bash\nnpx @modelcontextprotocol/inspector node dist/index.js\n```\n\n## Links\n\n- npm: <https://www.npmjs.com/package/strava-mcp-unofficial>\n- Docs site: <https://wellness.delx.ai/connectors/strava>\n- Legacy docs: <https://stravamcp.vercel.app/>\n- GitHub Pages mirror: <https://davidmosiah.github.io/strava-mcp/>\n- Delx Wellness registry: <https://github.com/davidmosiah/delx-wellness>\n- Connector quality standard: <https://github.com/davidmosiah/delx-wellness/blob/main/docs/connector-quality-standard.md>\n- Strava API docs: <https://developers.strava.com/docs/reference/>\n- Strava auth docs: <https://developers.strava.com/docs/authentication/>\n\n<!-- delx-wellness see-also -->\n\n## See also\n\nThe full [Delx Wellness](https://wellness.delx.ai) connector library:\n\n| Provider | Package | Repo |\n|---|---|---|\n| WHOOP | [`whoop-mcp-unofficial`](https://www.npmjs.com/package/whoop-mcp-unofficial) | [whoop-mcp](https://github.com/davidmosiah/whoop-mcp) |\n| Oura | [`oura-mcp-unofficial`](https://www.npmjs.com/package/oura-mcp-unofficial) | [ouramcp](https://github.com/davidmosiah/ouramcp) |\n| Garmin | [`garmin-mcp-unofficial`](https://www.npmjs.com/package/garmin-mcp-unofficial) | [garminmcp](https://github.com/davidmosiah/garminmcp) |\n| Strava | [`strava-mcp-unofficial`](https://www.npmjs.com/package/strava-mcp-unofficial) | [strava-mcp](https://github.com/davidmosiah/strava-mcp) |\n| Fitbit | [`fitbit-mcp-unofficial`](https://www.npmjs.com/package/fitbit-mcp-unofficial) | [fitbitmcp](https://github.com/davidmosiah/fitbitmcp) |\n| Withings | [`withings-mcp-unofficial`](https://www.npmjs.com/package/withings-mcp-unofficial) | [withingsmcp](https://github.com/davidmosiah/withingsmcp) |\n| Apple Health | [`apple-health-mcp-unofficial`](https://www.npmjs.com/package/apple-health-mcp-unofficial) | [apple-health-mcp](https://github.com/davidmosiah/apple-health-mcp) |\n| Polar | [`polar-mcp-unofficial`](https://www.npmjs.com/package/polar-mcp-unofficial) | [polarmcp](https://github.com/davidmosiah/polarmcp) |\n| Nourish (nutrition) | [`wellness-nourish`](https://www.npmjs.com/package/wellness-nourish) | [wellness-nourish](https://github.com/davidmosiah/wellness-nourish) |\n\n**One-command setup for Hermes** — preconfigures every connector above plus wellness skills + onboarding: [`delx-wellness-hermes`](https://github.com/davidmosiah/delx-wellness-hermes).\n\n<!-- /delx-wellness see-also -->\n\n## 📧 Contact & Support\n\n- 📨 **support@delx.ai** — general questions, integration help, partnerships\n- 🐛 **Bug reports / feature requests** — [GitHub Issues](https://github.com/davidmosiah/strava-mcp/issues)\n- 🐦 **Updates** — [@delx369](https://x.com/delx369) on X\n- 🌐 **Site** — [wellness.delx.ai](https://wellness.delx.ai)\n\n\n## License\n\nMIT — see [LICENSE](LICENSE).\n\n## Disclaimer\n\nThis software is provided as-is. It is not a medical device, does not provide medical advice, and should not be used for diagnosis, treatment or training prescription. Always consult qualified professionals for medical or training concerns.\n\n## Skill or MCP\n\nSame package, two doors. MCP registers tools on stdio/HTTP. The [skill](skill/SKILL.md) can drive the **same** tools through the CLI when the client has no MCP:\n\n```bash\nnpx -y strava-mcp-unofficial call strava_connection_status --json '{}'\n```\n\nCopy `skill/SKILL.md` into your agent skills dir.\n",
  "bytes": 16159,
  "sha": "367e80ef480892974a7f7455d8a0ad4ccda1294f165dc0d737b179200d0727ee",
  "repo_slug": "davidmosiah/strava-mcp",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_davidmosiah_strava_mcp_cc9771c0/readme"
}