strava
Query Strava fitness data including activities, stats, and athlete info.
Skill by eddmann
Install
Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.
npx agentmarket install skill/eddmann-strava
Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Use cases: data
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions
What this skill can do and what it asks for, from its SKILL.md. Checked Oct 25, 2026.
- Tools
- No tools found
- Secrets
- None asked for
- Install scripts
- None found
Network hosts it talks to 1
codeload.github.com· found in install command
Files it touches
~/.claude/skills/strava
What's inside
- Skill name
strava- Description
- Query Strava fitness data including activities, stats, and athlete info. Use when the user asks about their Strava data, running or cycling activities, workout history, fitness stats, "how far did I run", "my cycling stats", "Strava activities", or wants to analyze exercise data from Strava.
- License
- MIT
- Instructions
- 224 lines in SKILL.md · view on GitHub
Files (1)
- SKILL.md
SKILL.md (first lines)
# Strava Skill
Query Strava fitness data by writing UV inline Python scripts using stravalib.
## Setup
### Credentials
Requires `STRAVA_CLIENT_ID` and `STRAVA_CLIENT_SECRET` in `workspace/.env`.
If not set, walk the user through creating a Strava API application:
1. Go to https://www.strava.com/settings/api
2. Create an application (any name, set **Authorization Callback Domain** to `localhost`)
3. Copy the Client ID and Client Secret
Then append to `.env`:
```bash
echo 'STRAVA_CLIENT_ID=their_client_id' >> .env
echo 'STRAVA_CLIENT_SECRET=their_client_secret' >> .env
```
### Authentication
Strava uses OAuth2. Generate an auth link, send it to the user, then ask them to paste back the redirect URL.
**Step 1: Generate auth URL**
```bash
set -a; source .env 2>/dev/null; set +a; uv run - <<'EOF'
# /// script
# requires-python = ">=3.11"
# dependencies = ["stravalib>=2.4"]
# ///
import os
from stravalib import Client
client = Client()
url = client.authorization_url(
client_id=int(os.environ["STRAVA_CLIENT_ID"]),
redirect_uri="http://localhost/callback",
scope=["read", "activity:read", "activity:read_all", "profile:read_all"]
)
print(f"URL: {url}")
EOF
```
Send the URL to the user as a clickable link. Tell them:
1. Click the link and authorize the app
2. The browser will redirect to a page that won't load (localhost) — **that's expected**
3. Copy the **full URL** from the browser address bar and paste it back here
**Step 2: Exchange code for tokens** (after user pastes the redirect URL)
Extract the `code` parameter from the URL the user pastes (it's in `?code=...&`), then:
```bash
set -a; source .env 2>/dev/null; set +a; uv run - "THE_CODE_HERE" <<'EOF'
# /// script
# requires-python = ">=3.11"
# dependencies = ["stravalib>=2.4"]
# ///
import json, os, sys
from pathlib import Path
from stravalib import Client
client = Client()
tokens = client.exchange_code_for_token(
client_id=int(os.environ["STRAVA_CLIENT_ID"]),
client_secret=os.environ["STRAVA_CLIENT_SECRET"],
code=sys.argv[1]
)
Path("strava-tokens.json").write_text(json.dumps({
"access_token": tokens["access_token"],
"refresh_token": tokens["refresh_token"],
"expires_at": tokens["expires_at"],
"athlete_id": tokens.get("athlete", {}).get("id")
}, indent=2))
Path("strava-tokens.json").chmod(0o600)
print(f"SUCCESS: Tokens saved")
EOF
```
## Query Template
```bash
set -a; source .env 2>/dev/null; set +a; uv run - <<'EOF'
# /// script
# requires-python = ">=3.11"
# dependencies = ["stravalib>=2.4"]
# ///
import json, os, logging
from datetime import datetime, timedelta
from pathlib import Path
from stravalib import Client
logging.getLogger().setLevel(logging.ERROR)
TOKEN_FILE = Path("strava-tokens.json")
if not TOKEN_FILE.exists():
print("ERROR: Not authenticated — run Strava setup first")
exit(1)
tokens = json.loads(TOKEN_FILE.read_text())
client = Client()
# Auto-refresh expired tokens
if datetime.now().timestamp() >= tokens["expires_at"] - 60:
new = client.refresh_access_token(
client_id=int(os.environ["STRAVA_CLIENT_ID"]),
client_secret=os.environ["STRAVA_CLIENT_SECRET"],
refresh_token=tokens["refresh_token"]
)
tokens["access_token"] = new["access_token"]
tokens["refresh_token"] = new["refresh_token"]From eddmann/jeeves, MIT.
More from eddmann/jeeves
- 0.448score
zettelkasten
eddmann
Personal knowledge base using the Zettelkasten method.
SkillDFreshness: D★ 2Claude Code +9 - 0.448score
reminders
eddmann
Manage reminders — one-off and recurring.
SkillDFreshness: D★ 2Claude Code +9 - 0.448score
summarise
eddmann
Extract and summarise content from URLs, YouTube videos, podcasts, and files.
SkillDFreshness: D★ 2Claude Code +9 - 0.448score
lists
eddmann
General-purpose lists — shopping, questions for appointments, packing lists, etc.
SkillDFreshness: D★ 2Claude Code +9 - 0.448score
twitter
eddmann
Fetch X/Twitter timeline and bookmarks.
SkillDFreshness: D★ 2Claude Code +9 - 0.445score
pages
eddmann
Publish dynamic web pages for dashboards, trackers, or any data viewable in a browser.
SkillDFreshness: D★ 2Claude Code +9 - 0.443score
garmin
eddmann
Query Garmin Connect health and fitness data including activities, sleep, heart rate, HRV, stress, and body battery.
SkillDFreshness: D★ 2Claude Code +9 - 0.443score
plex
eddmann
Query Plex Media Server for movies, TV shows, music, and playback history.
SkillDFreshness: D★ 2Claude Code +9 - 0.442score
skill-creator
eddmann
Create or update skills.
SkillDFreshness: D★ 2Claude Code +9 - 0.440score
playwright
eddmann
Render web pages with JavaScript using Playwright for sites that need browser rendering or have issues with simple HTTP fetching.
SkillDFreshness: D★ 2Claude Code +9 - 0.414score
github
eddmann
Interact with GitHub using the `gh` CLI.
SkillDFreshness: D★ 2Claude Code +9
Signals
- Stars
- 2
- Forks
- 1
- Open issues
- 0
- Last commit (this folder)
- Feb 12, 2026 (8 months ago)
From GitHub (fetched Oct 24, 2026).
Details
- License
- MIT
- Repository
- github.com/eddmann/jeeves
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
- Source
- GitHubgithub-graphql
More from eddmann
- 0.556score
review
eddmann
Use when reviewing local code against repository conventions and coding guidelines.
SkillBFreshness: B★ 2Claude Code +9 - 0.556score
db
eddmann
Use when inspecting schemas, querying data or making authorized database changes.
SkillBFreshness: B★ 2Claude Code +9 - 0.553score
public-release
eddmann
Use when auditing a repository before making it public.
SkillBFreshness: B★ 2Claude Code +9 - 0.551score
commit
eddmann
Use when committing task changes using Conventional Commits.
SkillBFreshness: B★ 2Claude Code +9 - 0.551score
generate-readme
eddmann
Use when creating or updating a project's README from its actual capabilities and usage.
SkillBFreshness: B★ 2Claude Code +9 - 0.551score
context7
eddmann
Use when looking up library or framework documentation and version-specific API examples.
SkillBFreshness: B★ 2Claude Code +9
Cite this page
strava skill. Agent Mart. https://agentmart.dev/skills/eddmann-strava (last updated 2026-10-24)