# How to connect Strava to Hermes Agent (no API keys)

> Connect Strava to Hermes with ClawLink in one click — 33 tools your AI agent can call from chat via hosted OAuth. No API keys, no manual setup.

Web version: https://claw-link.dev/hermes/strava

Most guides for giving Hermes Agent Strava access start with registering your own OAuth app or pasting API keys into env files, then leave the token refresh and tool wiring to you. ClawLink gives Hermes a more practical Strava setup: pair once in the browser and your always-on Hermes agent can act on Strava for you, reading and doing real work on your behalf with no auth, token refresh, or tool wiring to build yourself.

**Start here — paste this into Hermes to set up ClawLink:**

> Set up ClawLink for Hermes and tell me when it's ready.
> 1. Install the plugin: `hermes plugins install ClawLink-HQ/hermes-plugin --enable`
> 2. Start pairing with `hermes clawlink begin`. It prints an approval link, so show me the link and stop, don't wait.
> 3. I'll approve it in my browser, then reply "approved".
> 4. When I say approved, finish setup: `hermes clawlink finish`
> 5. Then run `hermes clawlink test` and tell me whether ClawLink is ready.

## Setup

It takes three steps to connect Hermes to Strava.

1. **Install ClawLink** — add the plugin to Hermes Agent once.
2. **Connect Strava** — one-click OAuth in the ClawLink dashboard.
3. **Use it from chat** — ask Hermes Agent in plain English.

**Alternative for any agent (no plugin needed):** if the Hermes Agent plugin route isn't available or doesn't work, any AI agent with shell access can use the ClawLink CLI instead:

```bash
npx -y @useclawlink/cli login          # sign in via browser — no API key to paste
npx -y @useclawlink/cli connect strava  # connect Strava (browser OAuth)
npx -y @useclawlink/cli actions strava  # list available actions
npx -y @useclawlink/cli run strava <action> --input '<json>'  # execute (add --confirm for writes)
```

### Install by command

The prompt above walks Hermes through this. By hand, it is four commands and a browser approval:

```bash
hermes plugins install ClawLink-HQ/hermes-plugin --enable
hermes clawlink begin    # prints an approval link — open it and approve
hermes clawlink finish   # after approving in the browser
hermes clawlink test
```

Then connect Strava in the [ClawLink dashboard](https://claw-link.dev/dashboard) — a one-click OAuth approval, no API keys.

Verify the connection by asking Hermes:

> Use strava_list_athlete_activities for the last 7 days and strava_get_athlete_stats. Give me a table of activity, date, type, distance, and moving time, plus the totals.

### Using a different agent?

The Hermes plugin is one client of ClawLink's MCP server. Claude Code, Cursor, Codex, or any agent that can run a shell command pairs with the same ClawLink account through the CLI:

```bash
npx -y @useclawlink/cli login
```

`login` opens the same browser approval and stores a credential locally. Once Strava is connected in the dashboard, that agent calls the same 33 Strava tools over MCP. Full setup for MCP clients and shell agents: [connect apps to any AI agent](https://claw-link.dev/learn/connect-apps-to-any-ai-agent).

## Strava MCP for Hermes

Looking for a Strava MCP server for Hermes Agent? ClawLink connects Strava to Hermes Agent and exposes 33 Strava tools your agent can call over [MCP](https://claw-link.dev/learn/what-is-an-mcp-server), with [hosted auth](https://claw-link.dev/learn/oauth-for-ai-agents) and nothing to run or maintain yourself. Using OpenClaw instead? The [OpenClaw Strava integration](https://claw-link.dev/openclaw/strava) works the same way.

Strava's own MCP Connector is now the first answer to most agent queries about Strava: subscriber-only, read-only, and launched June 2026. That is a real option and it is the reason this page's pitch changed. This page's route is hosted OAuth through Strava's own app flow, so there is no Strava subscription required, no developer app of your own, and no token handling: Strava access tokens expire every 6 hours, and the hosted connection refreshes them for you, which is the most invisible part of this integration. The bigger difference is the surface. The official connector is read-only. The 33 tools here include the writes: uploading activities, creating activities, giving kudos, and managing club activity views, alongside the read side of activities, segments, routes, clubs, and athlete stats. If all you want is training history synced to an agent, Strava's connector is the native answer. If you want an agent that can act on your account, this is the route that can.

## What the Hermes Agent Strava integration can do

33 Strava tools are ready for Hermes Agent once the account is connected. The 30 below are the ones people reach for most; your agent can call all 33.

### 30 of 33 Strava tools for Hermes

| Tool | What it does |
|---|---|
| **Create an activity** `strava_create_an_activity` | Create a manual activity |
| **Explore segments** `strava_explore_segments` | Explore segments in an area |
| **Get activity** `strava_get_activity` | Get activity details by ID |
| **Get activity streams** `strava_get_activity_streams` | Get activity time-series data |
| **Get activity zones** `strava_get_activity_zones` | Get heart rate and power zones |
| **Get athlete stats** `strava_get_athlete_stats` | Get athlete activity stats |
| **Get authenticated athlete** `strava_get_authenticated_athlete` | Get authenticated athlete profile |
| **Get club** `strava_get_club` | Get club details |
| **Get route** `strava_get_route` | Get route details |
| **Get segment** `strava_get_segment` | Get segment details |
| **List activity laps** `strava_list_activity_laps` | List activity laps |
| **List athlete activities** `strava_list_athlete_activities` | List authenticated athlete's activities |
| **List athlete clubs** `strava_list_athlete_clubs` | List athlete's clubs |
| **List athlete routes** `strava_list_athlete_routes` | List athlete's routes |
| **List club activities** `strava_list_club_activities` | List club activities |
| **Upload activity** `strava_upload_activity` | Upload an activity file |
| **Export route gpx** `strava_export_route_gpx` | Exports a Strava route as a GPX (GPS Exchange Format) file |
| **Export route tcx** `strava_export_route_tcx` | Exports a Strava route as a TCX (Training Center XML) file |
| **Get equipment** `strava_get_equipment` | Retrieves detailed information about a specific piece of gear/equipment |
| **Get route streams** `strava_get_route_streams` | Get detailed stream data for a route |
| **Get segment effort** `strava_get_segment_effort` | Retrieves detailed information about a specific segment effort by its unique ID |
| **Get segment effort streams** `strava_get_segment_effort_streams` | Returns stream data for a segment effort completed by the authenticated athlete |
| **Get segment streams** `strava_get_segment_streams` | Get detailed stream data for a segment |
| **Get upload** `strava_get_upload` | Retrieves the status of an upload by its ID |
| **Get zones** `strava_get_zones` | Retrieves the authenticated athlete's heart rate and power zones |
| **List activity comments** `strava_list_activity_comments` | Retrieves comments on a specific Strava activity, sorted oldest first |
| **List activity kudoers** `strava_list_activity_kudoers` | Returns the athletes who kudoed an activity identified by an identifier |
| **List club administrators** `strava_list_club_administrators` | Returns a list of the administrators of a given Strava club |
| **List club members** `strava_list_club_members` | Returns a list of the athletes who are members of a given club |
| **List segment efforts** `strava_list_segment_efforts` | List the authenticated athlete's efforts on a given segment |

## Example prompts

**Weekly digest**

> Use strava_list_athlete_activities for the last 7 days and strava_get_athlete_stats. Give me a table of activity, date, type, distance, and moving time, plus the totals.

**Upload from a file**

> Upload \<file path> with strava_upload_activity and monitor strava_get_upload until it is ready. Confirm the activity name and visibility before uploading.

**Segment hunting**

> List my recent activities with strava_list_athlete_activities, then pull the segment efforts for the top 3 with strava_get_segment_effort and compare my times against the segment leaders.

**Club check**

> Run strava_list_athlete_clubs and strava_list_club_activities for \<club id> this week, and tell me which members have been most active.

## How the Strava tools behave

Details that decide whether a Strava prompt is a quick answer or a scope error and a rate-limit wall.

- **Private activities need `activity:read_all`, and a partial consent can leave them invisible.** The narrow `activity:read` scope covers public activities only; if the agent cannot see private ones, the grant was approved without the wider scope and the fix is reconnecting with the full scope set, not debugging the call.
- **Uploads are two-step.** `strava_upload_activity` submits the file and returns an upload id; `strava_get_upload` reports readiness. An agent that uploads and immediately reads the activity is racing the upload.
- **Streams and laps are per-activity extras, not summaries.** `strava_get_activity_streams`, `strava_list_activity_laps`, and the zone tools each cost a call per activity, so the prompt should name the few activities that matter instead of asking for everything at once.
- **Routes export in two formats.** `strava_export_route_gpx` and `strava_export_route_tcx` both exist; GPX is the interoperable shape, TCX is the training-software shape, and the wrong one fails in the downstream tool, not in Strava.
- **Athlete stats are the summary shape.** `strava_get_athlete_stats` answers all-time and recent totals in one call; reconstructing them from activity lists is the rate-limit shape.
- **Writes are real writes.** `strava_upload_activity`, `strava_create_an_activity`, and the kudos tools change your Strava account and are visible to others, which is exactly why the write surface is the argument against the read-only official connector.

## ClawLink vs. building it yourself

The alternative to ClawLink is usually manual OAuth app setup plus your own token handling, permission troubleshooting, and tool plumbing for Hermes Agent. That is fine if you want to build and maintain the integration yourself. Most teams just want Strava working from chat.

| | Manual | ClawLink |
|---|---|---|
| **Connection flow** | Register a Strava app, configure redirect URLs, manage consent details, and reconnect users when auth settings drift. | Users connect Strava through the hosted browser flow and ClawLink keeps the token lifecycle out of your app code. |
| **Ongoing maintenance** | You own refresh logic, permission debugging, environment config, and every provider-specific edge case for Strava. | ClawLink handles the repetitive integration plumbing so your team can focus on the workflow instead of the infrastructure. |
| **Agent usability** | You still need to expose the right Strava actions to the runtime in a format your agent can reliably use. | 33 tools for Strava are already exposed through ClawLink, so the agent can read and act from chat immediately. |

## ClawLink vs. Composio

Composio also exposes Strava to AI agents. It is developer infrastructure: Python and TypeScript SDKs, an MCP server, and a catalog past 1,000 apps, aimed at teams shipping agent products. ClawLink is built for Hermes Agent users instead. You install the plugin once, connect Strava in the browser, and the 33 tools above work from chat. There is no SDK, no config file, and no API key handling. Choosing between them? Read the full [Composio alternatives](https://claw-link.dev/hub/composio-alternatives) comparison.

### Hermes paired but still can't use Strava
Pairing is a two-step handshake: run `hermes clawlink begin`, approve the link in your browser, then run `hermes clawlink finish`. If you ran finish before approving, or the approval link expired, run `hermes clawlink begin` again to get a fresh link. Confirm the plugin was installed with `--enable`, then verify with `hermes clawlink test`.

### Connection succeeds but no tools appear
Reconnect Strava from the dashboard, then start a fresh chat if the runtime still has the old tool catalog loaded.

### "Tool schema not loaded yet" error when calling Strava tools
Strava tool schemas load on demand the first time a tool runs and are cached after that, so this error usually clears on its own: wait a few seconds and retry the same request. If every Strava call keeps failing with it in a fresh chat, reconnect from the dashboard, and contact support if it still persists — that pattern points to a configuration problem on our side, not something you can fix by reconnecting again.

### Strava returns 403 or "permission denied" on one action while others work
Two usual causes. The connected account may not have access to the specific workspace, inbox, store, or project in the request — check that first. If access looks right, the agent may have sent a placeholder value (like "YOUR_ID" or an example id from documentation) instead of a real one: ask it to run a list or search tool first, then retry the action with a real id from those results. Most failures at this stage are one of these two, not ClawLink bugs.

### Strava returns 403 or "permission denied" although the account shows as connected
Strava's taught causes for a 403 are scope and app state: the OAuth grant lacks the scope the call needs, or the app is at the default limit of one connected athlete for an unapproved developer account. The scope distinction is the one that bites on this integration: `activity:read` covers public activities and `activity:read_all` also covers private ones, so a call on a private activity fails with a permissions error when only the narrow scope was granted. That can happen silently because a partial approval on Strava's consent screen leaves the connection looking healthy. The fix is to reconnect from the dashboard and approve the full scope set. The page's own cause completes the list: a placeholder id such as YOUR_ACTIVITY_ID reaching the API literally. Ask the agent which activity and which scope it was using before anything else.

Ask the agent to diagnose it:

```text
Call strava_get_authenticated_athlete and tell me the athlete id, then try strava_list_athlete_activities and report how many activities are visible. Quote the exact error from the failed call. Do not retry it yet.
```

### Strava starts returning 429 or the agent stalls on an activity sweep
Strava's current documented limits, per developers.strava.com, are 200 requests per 15 minutes and 2,000 per day overall, with the read endpoints capped tighter at 100 per 15 minutes and 1,000 per day, and a 429 with a JSON error when exceeded. An agent that walks an athlete's whole activity history one page at a time, then streams for each activity, is the shape that meets the window. The response is to change the shape of the work: list once, keep the ids, and read streams or laps only for the activities you actually need, in batches across turns if needed. The limits reset on natural 15-minute windows and at midnight UTC; no reconnect changes them.

Ask the agent to diagnose it:

```text
Tell me how many Strava calls you have made in the last 15 minutes and what you were enumerating. Quote the exact error text. Do not call Strava again until I reply.
```

### Strava tools are missing, or one tool name is not found
Two failures share this symptom. If no Strava tools appear at all, the connection or pairing is incomplete: confirm the plugin was installed with --enable, that `hermes clawlink begin` and `hermes clawlink finish` both ran, and that Strava shows as connected in the dashboard. If most tools work and one name fails, the name is wrong rather than missing, and the error lists the closest real ones. There is also a first-call timing case: schemas load on demand, so the opening Strava call in a fresh session can arrive before the catalog and needs one retry. The frame search results use for this symptom, a connector not loaded in a client's config, belongs to local MCP setups and does not apply here.

Ask the agent to diagnose it:

```text
List the Strava tools you actually have access to. If there are none, say so plainly and tell me whether Strava shows as connected. Do not guess tool names.
```

### OAuth finished in the browser but the account is still missing
Try reconnecting Strava and complete the consent flow in the same browser session. Partial OAuth approvals or switching accounts mid-flow can leave the connection incomplete.

### Is there a Hermes Agent Strava integration?
Yes. ClawLink is the fastest way to connect Hermes to Strava: link your Strava account once in the browser and Hermes Agent can call the Strava API through 33 ready-made tools — no custom code or token handling.

### How do I connect Strava to Hermes with ClawLink?
Install the plugin with `hermes plugins install ClawLink-HQ/hermes-plugin --enable`, then pair once: run `hermes clawlink begin`, approve the link in your browser, and run `hermes clawlink finish`. Connect Strava in the dashboard and Hermes can use it from the next message — no config files or API keys to manage.

### How long does it take to connect Strava to Hermes Agent?
About two minutes. Sign in, click Connect next to Strava in the dashboard, authenticate, and Hermes Agent can use it from the next chat message.

### Why use ClawLink instead of wiring Strava up myself?
The alternative to ClawLink is usually manual OAuth app setup plus your own token handling, permission troubleshooting, and tool plumbing for Hermes Agent. That is fine if you want to build and maintain the integration yourself. Most teams just want Strava working from chat.

### How is this different from Strava's official MCP Connector?
Strava's connector is their own hosted MCP server, subscriber-only and read-only, rolled out from June 2026, and it syncs training history into MCP clients. This page's route connects through hosted OAuth with no subscription requirement and exposes 33 tools, including the writes the connector deliberately does not have: `strava_upload_activity`, `strava_create_an_activity`, and the kudos and club tools. Both are hosted, both keep the 6-hour token expiry out of your hands. The choice is scope: read-only sync from Strava's own product, or an agent that can also act on the account through ClawLink.

### How do the token refreshes work, since Strava tokens expire every 6 hours?
Strava access tokens are short-lived, roughly 6 hours, and the manual routes document refresh-token rotation as a standing chore. The hosted OAuth connection here owns the refresh flow: you approve access once in the browser, and the token lifecycle is handled server-side, invisible to Hermes and to you. This is the main thing the manual setup pages do not tell you about, and it is exactly the kind of maintenance a hosted flow exists to remove.

### What can the agent do in Strava?
The activity surface: list and read activities, upload new ones from a file, create activities, read streams, laps, zones, and comments, give and list kudos. The athlete and social surface: athlete stats, clubs and their members and activities, routes and GPX/TCX exports, segments, segment efforts, and equipment. The writes are the differentiator: uploading an activity from a file and creating activities are the tools the official read-only connector cannot offer.

### Why does the agent see only some of my activities?
The usual cause is scope, not the connection. The OAuth grant asks for the activity scopes, and the distinction that matters is `activity:read` versus `activity:read_all`: the first covers activities you made public, the second also covers private ones. If private activities are invisible to the agent, the connection was granted without `activity:read_all`. The fix is to review the connected app's permissions in Strava settings and reconnect, approving the full scope set on the consent screen.

### Hermes paired but still can't use Strava
Pairing is a two-step handshake: run `hermes clawlink begin`, approve the link in your browser, then run `hermes clawlink finish`. If you ran finish before approving, or the approval link expired, run `hermes clawlink begin` again to get a fresh link. Confirm the plugin was installed with `--enable`, then verify with `hermes clawlink test`.

## Related

- [Hermes Exist integration](https://claw-link.dev/hermes/exist) — Track and analyze personal health, fitness, and lifestyle data
