Strava MCP server
Provides read-only access to a Strava athlete's profile and activities, including tools to retrieve the authenticated athlete's profile, list recent activities with paging and date filters, and fetch detailed activity data by Strava ID.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Strava MCP servershow me my last 5 runs"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Strava MCP server
A local, read-only Model Context Protocol server for an athlete's Strava profile and activities. It uses standard input/output, so it works with MCP hosts that can launch a local command.
What it can do
get_my_profile— retrieve the authenticated athlete's profilelist_my_activities— retrieve recent activities, with paging and date filtersget_activity— retrieve a detailed activity by its Strava ID
Related MCP server: Strava MCP Server
Set up
In Strava API Settings, create an application. Copy the client ID and client secret.
In the app settings, set Authorization Callback Domain to
localhost.Copy
.env.exampleto.envand fill inSTRAVA_CLIENT_IDandSTRAVA_CLIENT_SECRET.Run
npm run authorize. Open the printed sign-in link and authorizeread,activity:read. The helper verifies activity access and saves the issued tokens to.envautomatically.Install and check the project:
npm install npm run buildConfigure your MCP host to run:
{ "command": "npx", "args": ["tsx", "C:/absolute/path/to/strava-mcp/src/index.ts"] }
The server reads credentials from the project's .env file. Do not duplicate
tokens in the MCP host configuration, because copied values become stale when
Strava rotates a refresh token.
Use the server's inspect script to test it interactively before connecting it to a host.
Security
Never place
.envor a refresh token in source control.The server only registers read-only tools. Add activity-creating or activity-editing tools only after deciding how you want human confirmation to work.
OAuth access may be narrower than requested if the athlete declined a scope; tool calls then receive a Strava error.
Token refresh
Strava issues a refresh token plus a short-lived access token. The authorization helper saves the initial token set to .env, and the server writes newly rotated tokens back to .env before continuing. This ensures that restarts use the most recent refresh token.
Available Tools
3 toolsget_activityGet a Strava activityB
Return the detailed record for one of the authenticated athlete's activities.
| Name | Required | Description | Default |
|---|---|---|---|
| activity_id | Yes | Strava activity ID. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations at all (no readOnlyHint, destructiveHint), the description carries full burden of behavioral disclosure. It doesn't state whether this is a read-only operation, whether it requires specific permissions, or what happens if the activity doesn't belong to the authenticated athlete (404, access errors). No behavioral features are disclosed beyond the basic return action.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single concise sentence with zero waste. Every word contributes to purpose. Front-loaded with the verb 'Return' and immediately clear about scope.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter fetch tool with no output schema, the description is reasonably complete — it explains what it returns. However, with no annotations declaring this as a non-mutating read operation, and no explicit mention that the activity must belong to the authenticated athlete or what error occurs otherwise, there's a modest completeness gap. Still, given tool complexity is low, it approaches adequacy.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% — the single parameter activity_id already has a description ('Strava activity ID') including type constraints. The tool description adds no parameter details beyond referring to 'one of the authenticated athlete's activities,' which confirms the ID belongs to that athlete. Baseline 3 is appropriate when schema does the documentation work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it returns the detailed record for one activity, with specific verb (Return) and resource (detailed record for an activity). It distinguishes from siblings: 'one of the authenticated athlete's activities' clarifies it's singular vs list_my_activities. However, it doesn't explicitly differentiate from get_my_profile, though the difference is fairly obvious.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies it's for fetching a single activity by ID ('one of the... activities'), which implies you need the activity_id. But there's no explicit when-to-use guidance, no alternative named, and nothing about needing to first obtain activity IDs via list_my_activities.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_my_profileGet my Strava profileA
Return the authenticated athlete's Strava profile and settings.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden of behavioral disclosure. It's a read operation (zero parameters, 'return...profile'), and this is reasonably clear from 'Return' and zero required parameters. However, it doesn't detail aspects like whether profile includes full settings, pagination, or any edge cases in the returned data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, zero waste. It includes the essential verb, resource, and scope (authenticated athlete). Perfectly concise for the complexity involved.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple (zero params, no output schema, no annotations), but there's still room for more context about what 'profile and settings' includes—such as whether it covers privacy settings, units, or other configuration. No output schema exists, so describing return content would add value. Still, for a zero-param read of one's own profile, it's reasonably adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
This tool has 0 parameters, so the baseline for parameter semantics is 4 per the rubric. The description appropriately explains what will be returned (profile and settings), which is the complete need for parameter semantics on a zero-param call.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Return the authenticated athlete's Strava profile and settings' clearly states the verb (return) and resource (athlete profile and settings). It's specific about what data is returned, though it doesn't explicitly distinguish from siblings like get_activity. However, the resource 'profile and settings' is distinct enough from activity-level tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies this is for retrieving the authenticated user's own profile. Sibling tools like get_activity and list_my_activities are clearly activity-focused, so an agent could reasonably infer when to use this tool. However, there's no explicit when-to-use vs alternatives guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_my_activitiesList my Strava activitiesB
List the authenticated athlete's activities in reverse chronological order.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number. | |
| after | No | Only activities after this Unix timestamp. | |
| before | No | Only activities before this Unix timestamp. | |
| per_page | No | Activities to return (1–200). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses this is a listing operation scoped to the authenticated athlete and returns them in reverse chronological order, which is useful behavioral context. However, it doesn't disclose pagination behavior, number of results returned without pagination, or whether activities include full detail or are summaries.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence, zero wasted words, front-loads the core purpose. It's appropriately concise but could arguably add a footnote about pagination without excessive bloat.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a list tool with no output schema and no annotations, the description is functional but minimal. It covers the core purpose and ordering but lacks guidance on pagination defaults, result caps, or how it relates to the get_activity sibling. Parameter count (4) is moderate and all are documented, but behavioral completeness is thin.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 4 parameters (page, after, before, per_page). The description adds no new parameter semantics beyond what's in the schema. Baseline 3 is appropriate since schema fully handles parameter documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb (List), resource (authenticated athlete's activities), and scope (reverse chronological order). It distinguishes from siblings (get_activity retrieves a single activity, get_my_profile retrieves profile) reasonably well, though it doesn't explicitly name them as alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies this returns a list of the authenticated user's own activities, and page/per_page params signal pagination usage. However, it doesn't explicitly state when to use this vs. get_activity (which presumably returns a single activity by ID), and gives no guidance on pagination strategy or rate limits.
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.
3 tool updates
v0.1.0- First observed
get_activity - First observed
get_my_profile - First observed
list_my_activities
TDQS
Scored across 3 tools
The three tools are clearly distinct: one returns the athlete profile, one lists activities, and one returns a single activity's detail. Minor potential confusion between list_my_activities and get_activity, but their purposes are obvious and descriptions clarify the distinction.
All tools use a consistent verb_noun pattern (get_my_profile, list_my_activities, get_activity) with snake_case throughout. Minor inconsistency: 'my' is included in two names but not in get_activity, which slightly breaks the symmetry.
Three tools is on the lower end of the acceptable range and feels thin for a server covering an activity-tracking platform like Strava. It's borderline — sufficient to demonstrate the server works, but not a rich surface.
The surface only offers read operations: profile retrieval, activity listing, and activity detail. Notable gaps include no ability to create/upload activities, update activity records (e.g., change title or privacy), delete activities, manage segments, access clubs, or handle friends/athletes. It's a purely read-only view with no lifecycle operations.
Maintenance
Related MCP Connectors
Strava MCP tools for AI: athletes, activities, segments, clubs, routes. Powered by HAPI MCP server.
Remote MCP server for training, nutrition, wellness, and performance data with OAuth 2.0.
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
Model Context Protocol server for Studex tools, notifications, and profile integrations
Related MCP Servers
- AlicenseBqualityFmaintenanceA Model Context Protocol server that provides language models with access to Strava API data, allowing them to query and analyze athlete activities from Strava.424MIT
- AlicenseNot gradedqualityDmaintenanceA Model Context Protocol server that enables language models to interact with Strava data, including activities, athlete statistics, routes, achievements, and social features.6MIT
- AlicenseBqualityDmaintenanceA Model Context Protocol server that enables users to access Strava fitness data, including user activities, activity details, segments, and leaderboards through a structured API interface.34MIT
- AlicenseNot gradedqualityDmaintenanceMCP server that exposes Strava API v3 data (activities, segments, routes, clubs, gear, streams) as tools for any MCP client. Read-only by default, with an optional --write flag to enable mutating operations.10 npm1MIT