Run Coach
An MCP server that pulls your Strava data and gives you a run recommendation from Claude, rendered as a dashboard.
README
Run Coach
An MCP server that pulls your Strava data and gives you a run recommendation from Claude, rendered as a dashboard.

What it does
- Fetches recent activities and all-time stats from the Strava API
- Shows them in a Prefab UI dashboard (rides, runs, distance, suffering index)
- Has a button that sends your last N days of runs to Claude and gets back a plain-English recommendation for today's run
Stack
- FastMCP — the MCP server itself, with
FastMCPAppfor the UI-facing tools - Prefab — the dashboard UI, written in Python instead of JSX
- Anthropic API — generates the run recommendation
httpx— talks to Stravauv— dependency management and running the thing
Setup
1. Install dependencies
uv add fastmcp anthropic httpx
2. Strava API access
You need a Strava API app (create one at strava.com/settings/api) and a one-time OAuth flow to get a refresh token. Scope needs to include activity:read_all — the default read scope isn't enough.
Run the setup script (not part of the server itself) to get your first refresh_token, then it lives in strava_tokens.json.
3. Environment variables
Create a .env:
ANTHROPIC_API_KEY=sk-ant-...
STRAVA_CLIENT_ID=...
STRAVA_CLIENT_SECRET=...
STRAVA_TOKEN_PATH=./strava_tokens.json
4. Run it
uv run --env-file .env --with fastmcp fastmcp dev apps mcpserver.py --reload
Project structure
mcpserver.py # the server: tools, UI, everything
strava_auth.py # token refresh logic
strava_tokens.json # your access/refresh token (gitignored)
.env # secrets (gitignored)
How the recommendation flow works
- Dashboard loads → fetches Strava data server-side, renders stats
- Click "Get Recommendation" → calls
get_run_recommendation, a private tool the UI can hit but the model can't call directly in chat - That tool re-fetches recent runs, trims to the fields that matter (distance, pace, HR, suffer score), sends them to Claude with a coaching system prompt
- Response comes back, gets dropped into the page via state
Considerations
- Strava rate limits are tight (100 req/15min, 1000/day)
max_tokensneeds headroom if thinking is ever turned on — thinking and output share the budget
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.
E2B
Using MCP to run code via e2b.