Skip to main content
Glama

mcp-strava

CI License: MIT Python 3.12 | 3.13 | 3.14

A read-only Model Context Protocol server that lets an AI assistant such as Claude read your own Strava data: activities, laps, splits, zones, second-by-second streams, segments, routes, gear and totals. Compatible with Strava.

It runs on your machine, talks to Strava with your own API application, and cannot change anything in your Strava account.

You:     How did Sunday's long run compare with the one the week before?
Claude:  Sunday's 14.2 km took 1:16:40, a 5:24/km average, 11 seconds per km faster than the
         13.8 km the previous Sunday. Your pace held steady until 11 km, then slipped by about
         15 seconds per km on the last climb.

(An illustrative exchange; the numbers are made up.)

Contents

Related MCP server: Strava MCP Server

Features

  • Read-only by design. It asks Strava only for read scopes, and apart from the OAuth token exchange every request it makes is a GET, so no prompt can edit, delete or post anything.

  • 14 tools covering the athlete profile, totals, activities and their detail, laps, zones, streams, segments, routes, gear and clubs.

  • Sized for a model's context window. Activity lists come back as compact summaries with distance in metres, kilometres and miles; map polylines are removed; per-second streams are evenly downsampled (500 points by default) so every stream still lines up point for point.

  • Signs in once. mcp-strava auth runs the browser OAuth flow and stores the tokens. After that the server refreshes its own access token and saves the rotated refresh token Strava hands back.

  • Errors the model can act on. Strava's own error message, missing-permission hints and rate-limit usage reach the assistant instead of a bare "tool failed".

  • No secrets in client config. Claude Code and Claude Desktop only need the command to run.

Tools

Tool

Returns

get_athlete

Your profile: name, location, weight, FTP, units, bikes, shoes and clubs

get_athlete_stats

Recent (4 weeks), year-to-date and all-time ride, run and swim totals

get_athlete_zones

Your heart-rate and power zones

list_activities

Compact activity summaries, filtered by after / before date and paged

get_activity

Full detail for one activity: splits, laps, calories, device, power; optional best efforts

get_activity_laps

The laps of one activity

get_activity_zones

Time spent in each heart-rate, power or pace zone during one activity

get_activity_streams

Per-second time, distance, position, altitude, speed, heart rate, cadence, power and more

list_starred_segments

Segments you have starred

get_segment

One segment, including your personal record on it

list_segment_efforts

Your efforts on one segment, optionally within a date range

list_routes

Routes you created

get_gear

One bike or pair of shoes, with total distance

list_clubs

Clubs you belong to

Every tool is annotated readOnlyHint: true. Units are Strava's: metres, seconds and metres per second.

Requirements

  • macOS or Linux. Windows is untested.

  • uv, which also provides Python 3.12 or newer if you do not have it.

  • A Strava account and an MCP client such as Claude Code or Claude Desktop.

Quick start

1. Create your own Strava API application

Open https://www.strava.com/settings/api and create an application:

Field

Value

Application Name

Anything that does not contain the word "Strava" (Strava's brand guidelines forbid it)

Category

Any, e.g. Performance Analysis

Website

Any URL you own

Authorization Callback Domain

localhost

Keep the page open: the next step asks for its Client ID and Client Secret.

2. Install

uv tool install git+https://github.com/lyzetam/mcp-strava
mcp-strava --version

This puts an mcp-strava command on your PATH. Upgrade later with uv tool upgrade mcp-strava.

3. Authorize once

mcp-strava auth

It asks for the Client ID and Client Secret (the secret is not echoed), opens Strava's consent page in your browser, and waits for the redirect on http://localhost:8723/callback. Leave every permission box ticked; the command warns you if one was unticked. The tokens are saved to ~/.config/mcp-strava/tokens.json.

Option

Default

Purpose

--port PORT

8723

Local port for the OAuth redirect

--timeout SECONDS

300

How long to wait for you to approve

--no-browser

off

Print the authorize URL instead of opening a browser

You only run this again if you revoke access in Strava or the server tells you to.

4. Connect your MCP client

The server speaks MCP over stdin and stdout and takes no arguments. Desktop apps often start with a minimal PATH, so give them the absolute path that command -v mcp-strava prints.

Claude Code

claude mcp add --scope user strava -- "$(command -v mcp-strava)"
claude mcp list    # strava: ... - ✔ Connected

Claude Desktop: add the server to claude_desktop_config.json (on macOS in ~/Library/Application Support/Claude/), then restart Claude Desktop:

{
  "mcpServers": {
    "strava": {
      "command": "/Users/you/.local/bin/mcp-strava"
    }
  }
}

Any other MCP client: register a stdio server whose command is the same absolute path.

Then ask something like "How far did I run this month?", "Compare my pace across my last five runs" or "Where did my heart rate drift on Sunday's long ride?"

Configuration

Nothing is required after mcp-strava auth. These environment variables exist for unusual setups:

Variable

Purpose

STRAVA_TOKEN_FILE

Where the token file lives. Default ~/.config/mcp-strava/tokens.json

STRAVA_CLIENT_ID, STRAVA_CLIENT_SECRET

App credentials, used by mcp-strava auth instead of prompting, and by the server when the token file lacks them

STRAVA_REFRESH_TOKEN

A refresh token to start from when the token file has none

The server re-reads the token file on every request, so re-running mcp-strava auth takes effect without restarting your MCP client.

Privacy and security

  • Your data travels between Strava, this process and your MCP client, nowhere else. What the client then sends to its model is governed by that client's data policy.

  • The token file holds your app's client secret and your tokens. It is written atomically with mode 0600, in a directory created as 0700. Treat it like a password.

  • To cut access off completely, revoke the application at https://www.strava.com/settings/apps and delete the token file.

  • Strava's API Agreement only lets a user's data be shown to that user. This server is built for exactly that: one person, their own API application, their own data. Do not host it for other people.

See SECURITY.md for the security model and how to report a vulnerability, and docs/architecture.md for how the pieces fit together.

Rate limits

A new Strava API application gets 200 requests per 15 minutes and 2,000 per day overall, of which 100 per 15 minutes and 1,000 per day may be reads. The 15-minute window resets at :00, :15, :30 and :45; the daily one at midnight UTC. When a limit is hit the assistant receives the current usage from Strava's X-RateLimit-* headers, so it can tell you when to try again. Typical questions use one to five requests; filtering list_activities by date keeps it that way.

Troubleshooting

Symptom

Cause and fix

"Strava is not authorized" or "Strava rejected the refresh token"

Access was revoked or never granted. Run mcp-strava auth.

An error naming activity:read_permission or another _permission

A permission box was unticked during consent. Run mcp-strava auth and leave every box ticked.

Heart rate is missing from activities

Strava only shares health data the athlete allowed under Settings → Data Permissions on strava.com.

"Could not reach Strava"

A network, DNS or proxy problem between your machine and www.strava.com.

mcp-strava auth reports the port is in use

Pick another one: mcp-strava auth --port 8724.

The browser shows "This link is from an earlier login attempt"

You reloaded an old redirect. Approve again from the URL the current mcp-strava auth printed.

Claude Desktop does not list the server

Use the absolute command path, restart Claude Desktop, and check ~/Library/Logs/Claude/mcp-server-strava.log.

Private activities are missing

They need the activity:read_all permission; run mcp-strava auth and keep that box ticked.

Development

git clone https://github.com/lyzetam/mcp-strava.git && cd mcp-strava
uv sync
uv run pytest --cov=mcp_strava     # tests and coverage
uv run ruff check . && uv run ruff format --check . && uv run mypy

Tests never touch the network: the Strava API is faked at the HTTP boundary and every tool is called through a real MCP client session. CONTRIBUTING.md explains the workflow and how to add a tool, and CHANGELOG.md lists what changed in each release.

License and trademarks

Released under the MIT License.

Strava is a trademark of Strava, Inc. This project is independent and is not affiliated with, endorsed by or sponsored by Strava. Use of the Strava API is subject to the Strava API Agreement and brand guidelines.

Available Tools

14 tools
get_activityA
Read-only

Full detail for one activity: description, calories, device, gear, laps, per-km splits (splits_metric), heart rate, power, photos and achievement counts. Map polylines are removed.

NameRequiredDescriptionDefault
activity_idYes
include_effortsNoAlso return every segment effort, best efforts (fastest 400m, 1k, 5k, ...) and per-mile splits. Much larger.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so safety is covered. The description adds useful behavioral detail by listing what is included and noting that map polylines are removed, which is a meaningful data omission. It does not discuss auth or rate limits, but that is a lower burden given the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the main purpose and then a compact field list. The removal note is useful and every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Because an output schema exists and annotations cover safety, the description need not explain return values in full. It provides enough scope and field coverage for an agent to understand the tool, though it omits prose guidance on include_efforts and sibling routing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 50%: include_efforts is richly documented in the schema, while activity_id has no description but is obvious from 'one activity'. The main description itself does not mention include_efforts or add parameter-level meaning, so it neither compensates for the gap nor harms understanding.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a clear verb+resource: 'Full detail for one activity', and it enumerates concrete returned fields such as calories, gear, laps, splits, heart rate, and power. It distinguishes itself from list-style tools by emphasizing a single activity, though it does not explicitly differentiate from specialized siblings like get_activity_laps or get_activity_zones.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'Full detail for one activity' implies when to use it, but there is no explicit guidance on when to choose it over siblings such as get_activity_laps, get_activity_zones, or get_activity_streams. The usage context is implied rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_activity_lapsA
Read-only

Laps of one activity, with distance, time, speed, heart rate, cadence and power per lap. Useful for interval sessions and races split by lap.

NameRequiredDescriptionDefault
activity_idYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish that this is a read-only, open-world retrieval operation. The description adds useful content about what each lap includes, but does not disclose pagination, ordering, rate limits, or other behavioral traits beyond the output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences with no filler. The resource and returned metrics are front-loaded, followed by a concise usage context.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter read tool with an output schema, the description covers purpose, returned per-lap data, and typical use. The main gap is the undocumented required parameter, but the overall definition is nearly complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description should explain the required activity_id parameter. Instead it only says 'one activity' without clarifying that a numeric activity ID is required or what it identifies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the resource as laps of a single activity and lists the per-lap metrics returned, distinguishing it from activity summary or stream tools. It does not explicitly name sibling tools, but the resource scope is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives a clear use case: interval sessions and races split by lap. It does not state when not to use it or name alternatives such as get_activity_streams, so it falls short of full routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_activity_streamsA
Read-only

Second-by-second data recorded during one activity (heart rate, power, cadence, altitude, speed in m/s, position), evenly downsampled so every stream lines up point for point. Use it for pacing, heart-rate drift, or interval analysis. Each stream reports its original_size.

NameRequiredDescriptionDefault
keysNoStreams to fetch, any of: time, distance, latlng, altitude, velocity_smooth, heartrate, cadence, watts, temp, moving, grade_smooth. Defaults to time, distance, altitude, heartrate, cadence, watts and velocity_smooth.
max_pointsNoPoints kept per stream after even downsampling, 2 to 10000.
activity_idYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered. The description adds genuinely non-obvious behavior: streams are evenly downsampled so they align point-for-point, and each stream reports its original_size, which tells the agent to expect truncated data and how to detect it. It omits nothing critical, though rate/limits and default key set are left to the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences: what the data is, what to use it for, and the original_size caveat, all front-loaded with no filler. Slightly could be trimmed since the stream list overlaps the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need not be explained, and the description covers the sampling contract and the original_size field that an agent needs to interpret truncated results. The only gap is the absence of routing guidance relative to nearby activity tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 67% and the keys parameter already enumerates all valid streams, so the description's mention of HR/power/cadence/etc. largely restates the schema. It does add meaning for max_points by framing the downsampling contract ('point for point'), but activity_id remains undocumented in both places. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific resource and content: second-by-second streams (HR, power, cadence, altitude, speed, position) for one activity, plus the downsampling guarantee. That is far more informative than the bare name and implicitly separates it from summary tools like get_activity and get_activity_laps. It stops short of naming a sibling or stating the boundary explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Use it for pacing, heart-rate drift, or interval analysis' gives concrete analytical contexts, so usage is more than implied. However, there is no guidance on when NOT to use it or which sibling to prefer (e.g., get_activity_laps for lap-level splits, get_activity for summary metrics), leaving tool selection to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_activity_zonesA
Read-only

Time spent in each heart-rate and power zone during one activity. Strava may require a subscription for this data.

NameRequiredDescriptionDefault
activity_idYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint, so safety is covered. The description adds genuinely useful non-schema context — that Strava may gate this data behind a subscription — but says nothing about what is returned or how a gated/failed request surfaces to the caller.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, both front-loaded and free of padding: the first defines the payload, the second flags the access caveat. Nothing to trim.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return structure need not be explained, and annotations carry read-only semantics. Still missing is how to obtain a valid activity_id and what happens on subscription-gated access, which matters for a per-entity lookup on a third-party API.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% and the description adds no explanation of activity_id, so the agent relies entirely on the self-explanatory parameter name being a Strava activity identifier. With a single obvious integer key, that is adequate but no more.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific resource and scope: per-activity time-in-zone for heart rate and power. The phrase 'during one activity' implicitly separates it from the sibling get_athlete_zones, which covers athlete-level zone configuration, though that sibling is never named.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the data type returned, but there is no explicit 'use when' framing and no mention of the alternative get_athlete_zones or get_activity_streams for raw zone data. The agent must infer the choice from the tool name alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_athleteA
Read-only

Profile of the connected athlete: name, location, sex, weight, FTP, measurement preference, and their bikes, shoes and clubs.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds only the 'connected athlete' framing, implying an authenticated single-user context, but says nothing about error behavior when no athlete is connected or about response shape/pagination.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no preamble or filler. The field enumeration is the only content and it is delivered immediately.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter read with an output schema present, the description does what is needed: it identifies the resource and gives a preview of the payload. The remaining gap is that it never clarifies the boundary against the overlapping gear/club/stats siblings.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the baseline is 4. There is nothing for the description to clarify about inputs, and it correctly spends no words on them.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific resource (the connected athlete's profile) and enumerates its contents — name, location, sex, weight, FTP, measurement preference, bikes, shoes, clubs. That is clear and concrete, but it does not differentiate itself from siblings like get_athlete_stats, get_athlete_zones, get_gear or list_clubs, whose data appears to overlap with the bikes/shoes/clubs mentioned here.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use or when-not-to-use guidance. With three get_athlete* siblings plus get_gear and list_clubs in the set, an agent gets no signal about why it should pick this tool for gear or club information rather than the dedicated tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_athlete_statsA
Read-only

Ride, run and swim totals for the connected athlete: recent (last 4 weeks), year-to-date and all-time count, distance, moving time, elapsed time and elevation gain, plus biggest ride and climb. Strava only counts activities whose visibility is Everyone.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds meaningful behavioral context: the exact time windows, metric set, and the important caveat that Strava only counts activities visible to Everyone.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the result set and follows with the visibility caveat. It is slightly dense but every clause adds useful information about what is returned.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no parameters and an output schema present, the description does not need to explain return structure. It still supplies the key semantic caveat about activity visibility, making it complete for correct invocation and interpretation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is no parameter semantics to explain. Baseline is 4 for a parameterless tool, and the description correctly does not invent parameter details.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific resource (connected athlete statistics) and enumerates the returned activity types, time windows, and metrics. It is clearly distinguishable from siblings like get_athlete, list_activities, and get_activity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the resource and metrics, but the description does not explicitly say when to use this instead of get_athlete or list_activities. No alternatives or exclusions are named.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_athlete_zonesA
Read-only

The connected athlete's heart-rate zones (bpm) and power zones (watts).

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds useful data-unit context (bpm, watts) but does not disclose authentication needs, rate limits, or other behavioral traits beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single concise sentence with no wasted words, front-loading the resource being returned. It is appropriately sized for a zero-parameter retrieval tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present and no parameters, the description need not explain return values in detail. It states what the tool returns and for whom, though it could say a bit more about when to choose it over sibling zone tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so there are no parameter semantics to explain; baseline 4 applies. The description correctly adds nothing unnecessary about parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific resource — the connected athlete's heart-rate and power zones — with units, and implicitly distinguishes it from sibling get_activity_zones by scoping to the athlete rather than an activity. It lacks an explicit verb, but the resource is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool versus alternatives such as get_activity_zones or get_athlete_stats. The connected-athlete scoping hints at usage, but no explicit context or exclusions are provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_gearA
Read-only

One bike or pair of shoes: brand, model, nickname and total distance in meters. Gear ids (b... for bikes, g... for shoes) appear as gear_id on activities and in get_athlete.

NameRequiredDescriptionDefault
gear_idYesA gear id from an activity's gear_id or get_athlete, e.g. b1234567 or g7654321.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds the returned field set, but with an output schema present that is redundant, and it says nothing about behavior for invalid or missing gear ids. With annotations carrying the load, a 3 is appropriate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences with no filler, leading with the return contents and following with id provenance. The fragment-style opening ('One bike or pair of shoes:') is slightly clipped but not wasteful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter read tool with an output schema and read-only annotations, the description covers what it returns and where the id comes from. Only error behavior for bad ids is missing, which is a minor gap at this complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds semantics beyond the schema by decoding the id prefix convention: 'b... for bikes, g... for shoes'. That mapping is only hinted at by the schema's examples, so it is genuine added meaning for the single parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names the exact resource (a single bike or pair of shoes) and enumerates the returned attributes (brand, model, nickname, total distance in meters), so an agent can tell this is a single-gear lookup rather than a list. It lacks an explicit verb ('get'/'retrieve'), but the resource and scope are unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It tells the agent where the required input comes from — 'gear_id on activities and in get_athlete' — which is direct prerequisite guidance and implicitly routes to the sibling tools that produce the id. It doesn't state when NOT to use it or contrast with other retrieval tools, keeping it below a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_segmentA
Read-only

Detail for one segment: distance, average and max grade, elevation, climb category, location, effort and athlete counts, and the connected athlete's PR (athlete_segment_stats).

NameRequiredDescriptionDefault
segment_idYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the read-only, external-data nature is covered. The description adds that athlete PR data is pulled in (an implicit auth/athlete-context dependency), which is useful, but it says nothing about rate limits, missing segments, or errors.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence that moves from purpose to payload contents with no filler. The long comma-separated field list is dense but each item earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description need not detail return values, and it still summarizes them. For a one-parameter read tool this is close to sufficient; only behavior on unknown segments is unaddressed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the single parameter segment_id has no description, but its name and integer type make its meaning self-evident and the description does not need to compensate much. No format, range, or lookup hints are provided.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (get detail) and resource (one segment), then enumerates the fields returned, so an agent knows exactly what it retrieves. It does not explicitly differentiate itself from siblings such as list_segment_efforts, and the meaning of 'PR (athlete_segment_stats)' is unclear without domain knowledge.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The singular 'one segment' implies use when a specific segment_id is known, versus list_segment_efforts for effort listings, but no alternative is named and no prerequisites are given. Usage is inferable rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_activitiesA
Read-only

The connected athlete's activities as compact summaries: sport, start time, distance (m, km, mi), moving and elapsed time, elevation gain, speed, heart rate, power, cadence, suffer score, kudos. Strava returns newest first, but oldest first when after is set. more_available is true when the page came back full, so ask for the next page. Use get_activity for one activity's full detail.

NameRequiredDescriptionDefault
pageNoPage number, starting at 1.
afterNoOnly activities that start after this ISO date or datetime, e.g. 2026-10-01. Without a time zone it is read in this computer's local time.
beforeNoOnly activities that start before this ISO date or datetime.
per_pageNoItems per page, at most 200.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint, so safety is covered; the description goes well beyond that with non-obvious behavior. It discloses the ordering quirk ('newest first, but oldest first when `after` is set') and the pagination signal (`more_available` is true when the page came back full), both of which an agent would otherwise misread. Those are exactly the kind of behavioral traits annotations cannot express.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four short sentences, zero filler. Scope and field list come first, then the two behavioral quirks, then the alternative-tool routing at the end. Every sentence carries information an agent needs.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only paged listing with an output schema present, the description need not explain return structure, yet it still summarizes the field set helpfully. Combined with ordering, pagination, and alternative-tool guidance, nothing an agent needs to call this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so both the pagination params and the ISO date bounds are already documented, giving a baseline of 3. The description adds real meaning on top by tying `after` to a change in result ordering and by explaining how the page-full signal interacts with paging. It doesn't add format details for `before`/`per_page` beyond the schema, so it lands at 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource ('The connected athlete's activities as compact summaries') and then enumerates the actual fields returned (sport, distance, moving time, heart rate, power, etc.). It clearly separates itself from get_activity, which returns full detail for a single activity, so an agent can pick the right tool without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly names the sibling alternative and the condition that selects it: 'Use get_activity for one activity's full detail.' It also tells the agent how to continue paginating ('more_available is true when the page came back full, so ask for the next page'). It stops short of full when/when-not coverage (e.g., no guidance on list_starred_segments or segment efforts), so a 4 rather than a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_clubsB
Read-only

Clubs the connected athlete belongs to, with sport type, location and member count.

NameRequiredDescriptionDefault
pageNoPage number, starting at 1.
per_pageNoItems per page, at most 200.

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds the returned fields (sport type, location, member count), but does not explain pagination behavior or any authorization requirements beyond what the schema and annotations provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence with no filler. It efficiently conveys the core resource and its returned fields.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, parameters are fully documented, and annotations cover safety characteristics. For a simple read-only list operation, the description is nearly complete; only minor operational context like pagination behavior is absent but already covered by the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both pagination parameters are fully documented in the schema. The description adds no parameter-level semantics, which is acceptable given the schema baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the resource (clubs the connected athlete belongs to) and the data returned (sport type, location, member count). It does not explicitly use a verb like 'list', but the meaning is unambiguous and it is distinguishable from the athlete/activity/segment siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool versus alternatives, nor any mention of prerequisites or exclusions. The usage context is only implied by the resource phrase 'clubs the connected athlete belongs to'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_routesA
Read-only

Routes the connected athlete created, with distance, elevation gain, type and estimated time.

NameRequiredDescriptionDefault
pageNoPage number, starting at 1.
per_pageNoItems per page, at most 200.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the agent knows this is a safe external read. The description adds the returned fields (distance, elevation gain, type, estimated time), but says nothing about pagination behavior, ordering, or empty results — pagination is only discoverable from the schema defaults.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single compact sentence that front-loads the scope ('routes the connected athlete created') before enumerating returned attributes. No filler, nothing that could be trimmed without losing information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so the description need not explain return values, and parameters are fully covered by the schema. What remains missing is sibling differentiation and any note about pagination limits or ordering — minor but not zero gaps for a list tool in a crowded namespace.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and both parameters (page, per_page) are fully documented in the schema, so the baseline 3 applies. The description adds nothing about pagination semantics or the 200-item cap, but it doesn't need to since the schema carries that information.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names the resource (routes) and scopes it to the connected athlete, plus lists the returned attributes, so the agent knows what it retrieves. It never explicitly states the verb 'list' and does not differentiate this from siblings like list_starred_segments or list_activities, which also enumerate route-adjacent resources.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'the connected athlete created' implies a scope — the athlete's own routes, as opposed to starred segments or club data — which gives implicit guidance on when to pick this tool. There is no explicit when-to-use, no exclusions, and no reference to an alternative tool for related route data.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_segment_effortsA
Read-only

The connected athlete's efforts on one segment, with elapsed time, heart rate, power and the activity each came from, so you can track progress on a climb or sprint. Strava may require a subscription for this data.

NameRequiredDescriptionDefault
per_pageNoItems per page, at most 200.
segment_idYes
end_date_localNoOnly efforts on or before this ISO 8601 datetime.
start_date_localNoOnly efforts on or after this ISO 8601 datetime.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare readOnlyHint and openWorldHint, so safety is covered. The description adds the non-obvious access caveat that 'Strava may require a subscription for this data', which is real behavioral context that an agent needs in order to interpret empty or error responses. It does not cover pagination behavior, though per_page is at least schema-documented.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the scope and the returned fields, then the access caveat. The 'track progress on a climb or sprint' clause is mildly motivational but does convey intent, so there is no glaring waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Because an output schema exists, the description does not need to enumerate return values, and its mention of elapsed time, heart rate and power is a helpful preview rather than filler. Combined with the subscription caveat and the athlete-scoped framing, an agent has enough to call the tool correctly, though guidance on handling empty results or pagination is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 75%: the schema documents per_page, start_date_local and end_date_local, but not segment_id. The description only indirectly implies the required segment_id ('on one segment') and adds no format or filtering detail beyond what the schema provides. The baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific resource (a single segment's efforts) with an explicit scope: it returns only the connected athlete's efforts, plus the data fields (elapsed time, heart rate, power, source activity). This distinguishes it from get_segment, which returns segment metadata rather than efforts. The verb is only implicit in the name, and no sibling is named, which keeps it just below a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'so you can track progress on a climb or sprint' implies the intent (performance tracking over repeated efforts) but never says when to call this tool versus alternatives such as get_segment or list_activities. There are no explicit exclusions, such as guidance on retrieving another athlete's efforts or on what to do when the subscription requirement blocks the response.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_starred_segmentsA
Read-only

Segments the connected athlete has starred, with distance, grade, elevation, location and their PR.

NameRequiredDescriptionDefault
pageNoPage number, starting at 1.
per_pageNoItems per page, at most 200.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds the returned field set, but since an output schema exists that information is largely redundant, and nothing is said about pagination limits or auth scoping beyond 'connected athlete'.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single tight sentence with the resource and its return fields front-loaded and zero filler. Nothing could be removed without losing information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple paginated read with full annotation and output-schema coverage, the description supplies what an agent needs: what is listed and what comes back. Only minor gaps remain around paging behavior and differentiation from sibling segment tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% with only two params (page, per_page), both documented in the schema including the 200-item cap. The description adds no parameter detail at all, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific resource ('segments the connected athlete has starred') plus the key fields returned (distance, grade, elevation, location, PR), which reads clearly as a list operation. It does not explicitly name how it differs from siblings like get_segment or list_segment_efforts, so it falls just short of top marks.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied only: the description scopes results to 'starred' segments for 'the connected athlete', which hints at when the tool applies. There is no explicit when-to-use/when-not guidance and no mention of alternatives such as get_segment for a single segment or list_segment_efforts for efforts.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 14 tool updatesv0.1.0
    • First observedget_activity
    • First observedget_activity_laps
    • First observedget_activity_streams
    • First observedget_activity_zones
    • First observedget_athlete
    • First observedget_athlete_stats
    • First observedget_athlete_zones
    • First observedget_gear
    • First observedget_segment
    • First observedlist_activities
    • First observedlist_clubs
    • First observedlist_routes
    • First observedlist_segment_efforts
    • First observedlist_starred_segments

TDQS

A3.9/5.0

Scored across 14 tools

Disambiguation5/5

Each tool targets a clearly distinct resource and action: athlete summary vs stats vs zones, activity list vs detail vs laps vs zones vs streams, and segment starred list vs detail vs efforts. The descriptions reinforce the boundaries, so an agent can reliably choose the right tool.

Naming Consistency5/5

All tools use consistent snake_case with predictable get_/list_ verb prefixes followed by the resource name. Nested concepts such as get_activity_zones and list_segment_efforts remain readable and follow the same convention.

Tool Count5/5

The 14 tools are well-scoped for a Strava read/analytics server. Each tool covers a meaningful slice of the domain without excessive surface area.

Completeness4/5

The surface covers the main read workflows: athlete profile, stats, zones, activities, streams, segments, routes, gear, and clubs. Minor gaps remain, such as no get_route or get_club detail after list_routes/list_clubs, and no activity upload or write operations, but agents can still handle most exploration tasks.

Maintenance

ActivityMaintained
ResponsivenessNo recent community issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    D
    maintenance
    Integrates with the Strava API to allow AI assistants to access fitness data including athlete profiles, activity history, and segment statistics. It enables users to query detailed performance metrics and explore geographic segment data through natural language commands.
    8
    95 npm
    MIT