Public leaderboard

Public assessment

r-huijts/strava-mcp (@r-huijts/strava-mcp-server)

r-huijts-strava-mcp-server · v1.2.1 · scanned

What changed in the harness

Selection accuracy 100→100, token cost up 8%, unconfirmed writes 0%→0%.

Category breakdown

Where the score comes from.

Earned points across the four signals Gradable measures. Safety and Legibility are scored out of 30; Economics and Discoverability are scored out of 20.

01Safety

0.0 / 30

0.0 out of 30
02Legibility

21.3 / 30

21.3 out of 30
03Economics

17.7 / 20

17.7 out of 20
04Discoverability

11.9 / 20

11.9 out of 20

Highest-impact fix

Estimated gain +30 points

Add explicit identity and permission preflight tools

Expose machine-readable principal/tenant confirmation and a non-mutating permission check so agents can verify both before destructive actions.

Description evidence

Defects and rewrites.

19 defects found across the exposed tool descriptions. Suggested rewrites make purpose, inputs, boundaries, and returns easier for an agent to understand.

Tool Defect types Suggested rewrite
get-athlete-profile
no_return_description
Fetches the profile information for the authenticated athlete, including their unique numeric ID needed for other tools like get-athlete-stats. Returns an object containing the athlete's profile fields such as id, firstname, lastname, city, country, and account-level details.
get-athlete-stats
no_return_description
Fetches the activity statistics for a specific athlete's recent, year-to-date, and all-time periods, using the athleteId obtained from the get-athlete-profile tool. Returns an object with separate recent, ytd, and all_time stat groups including activity counts and distances.
get-activity-details
no_return_description
Fetches detailed information about a specific activity using its ID. Returns an object containing the activity's full detail fields such as name, type, start date, distance, moving time, and equipment.
get-recent-activities
no_return_description
Fetches the most recent activities for the authenticated athlete, optionally limiting the count via perPage. Returns an array of activity objects ordered from newest to oldest.
list-athlete-clubs
name_restates_behavior no_return_description
Retrieves the clubs the authenticated athlete belongs to, useful for surfacing the athlete's teams or memberships in summaries. Returns an array of club objects containing club IDs, names, and member counts.
list-starred-segments
name_restates_behavior no_return_description
Retrieves the segments the authenticated athlete has starred, useful for surfacing saved or favorite segments for quick reference. Returns an array of segment objects with segment IDs, names, and metadata.
get-segment
no_return_description
Fetches detailed information about a specific segment using its ID. Returns an object containing the segment's fields such as name, distance, elevation gain, average grade, and activity type.
explore-segments
no_return_description
Searches for popular segments within a given geographical area defined by bounds, optionally filtered by activity type and climb category. Returns an array of popular segment objects with IDs, names, and distance.
star-segment
name_restates_behavior no_return_description
Sets the starred state for a specific segment for the authenticated athlete, used when the user wants to save or remove a segment from their starred list. Returns an object confirming the segment ID and its updated starred status.
get-segment-effort
no_return_description
Fetches detailed information about a specific segment effort using its ID. Returns an object containing the effort's fields such as athlete, activity, elapsed time, moving time, and segment details.
list-segment-efforts
name_restates_behavior no_return_description
Lists the authenticated athlete's efforts on a specific segment, optionally filtered by a date range, useful for reviewing records or historical performance on a segment. Returns an array of effort objects with times, speeds, and dates.
list-athlete-routes
no_return_description
Lists the routes created by the authenticated athlete with pagination controls (page and perPage). Returns an array of route objects containing route IDs, names, distances, and creation dates.
get-route
no_return_description
Fetches detailed information about a specific route using its ID. Returns an object containing the route's fields such as name, distance, elevation gain, and activity type.
export-route-gpx
name_restates_behavior no_return_description
Downloads a specific Strava route in GPX format and saves it to the pre-configured local export directory, useful when the user needs a GPX file for offline use or import into other apps. Returns a confirmation including the file path and export status.
export-route-tcx
name_restates_behavior no_return_description
Downloads a specific Strava route in TCX format and saves it to the pre-configured local export directory, useful when the user needs a TCX file for offline use or import into other apps. Returns a confirmation including the file path and export status.
get-all-activities
no_return_description
Fetches the complete activity history with optional filtering by date range and activity type, paginating through the Strava API to retrieve all matching activities within the configured limits. Returns an array of activity objects.
connect-strava
no_return_description
Connects the user's Strava account to enable activity tracking, opening a browser window for secure authentication. Use this when the user asks to connect, link, or authenticate their Strava account. Returns the connection status.
disconnect-strava
no_return_description
Disconnects the user's Strava account and removes stored credentials, terminating access to user data. Use this when the user wants to logout, disconnect, or remove their Strava connection. Returns a confirmation that the account was disconnected.
check-strava-connection
no_return_description
Checks whether Strava is connected and reports the current connection status. Use this when the user asks about their connection status. Returns the connection status and related account details.

Selection evidence

Confusable tool pairs.

9 pairs where similar names or overlapping descriptions may send an agent toward the wrong tool.

Tool A Tool B Confidence Why they collide
export-route-gpx export-route-tcx high Descriptions are identical except the format word; a request like 'export route 77 to a local file' or 'download my route' never names GPX vs TCX, so the agent can select either arbitrarily.
get-segment get-segment-effort medium Both 'fetch detailed information about a specific ... using its ID'; a task like 'get the details for segment effort 5123' or 'show info about segment 5123' can resolve to the wrong tool because 'segment' anchors both names and the ID parameter types differ.
get-activity-details get-activity-laps medium Both take an activity ID and promise 'detailed' data; 'get me the detailed info for activity 54321 including my laps/splits' could land on get-activity-details instead of the lap-specific tool.
get-activity-details get-activity-streams medium Both advertise 'detailed' data for a specific activity; 'pull the detailed data from activity 999 for analysis' is genuinely ambiguous between the summary details and the time-series streams.
get-activity-streams get-activity-laps medium Both retrieve detailed per-activity data via an `id`; 'give me all the detailed metrics for activity 555' could pick streams when lap breakdown was intended, or laps when stream series was intended.
get-athlete-profile get-athlete-stats medium 'Show me my athlete stats' could hit get-athlete-profile (which fetches the athlete's info) instead of get-athlete-stats, and the stats docs require the profile ID first, inviting the wrong initial call.
get-recent-activities get-all-activities medium 'Get all my recent activities' or 'list all my activities' is ambiguous: both fetch activity lists with no mandatory ID, and get-all-activities also does date filtering, so the agent may select the wrong scope.
get-segment-effort list-segment-efforts medium 'Get the segment efforts for segment 101' (wants list-segment-efforts by segmentId) vs 'get segment effort 123' (wants get-segment-effort by effortId) are easily crossed because the names differ mainly by number and the parameter semantics are inverted.
get-athlete-stats get-recent-activities low 'Show me my recent stats' overlaps both: get-athlete-stats returns recent/YTD/all-time aggregate stats while get-recent-activities returns the recent activity list, so a vague recent-focused request can pick wrong.

Compare the field

One score is useful.
The evidence makes it actionable.

Back to the leaderboard