2.4 KiB
Design Decisions - Strava MCP Server
This document records key architectural and design decisions made during the development of the Strava MCP Server. It serves as a guide for AI agents and developers to maintain consistency.
1. Date and Time Handling
Decision: Standardize on ISO 8601 (UTC) for all internal data exchange, tool inputs, and tool outputs. Date: 2026-05-12 Context: LLMs often struggle with ambiguous date formats (e.g., DD.MM.YYYY vs. MM/DD/YYYY). International users require a unified format. Implementation:
- All tools accept ISO 8601 strings (
YYYY-MM-DDTHH:MM:SSZ) for date parameters. - Tool outputs include a
_dateor similar field with the raw ISO 8601 string. - A shared utility
src/strava_mcp_server/utils.pyhandles parsing and formatting. - Human Readability: While raw data is ISO 8601, markdown summaries presented to the user should use
DD.MM.YYYY HH:MMfor comfort, but the raw data for agent analysis must be standardized.
2. Authentication & Token Management
Decision: Automate token rotation and prioritize environment-based configuration. Context: Strava tokens expire every 6 hours. Manual refresh is tedious for automated use. Implementation:
- The server checks token expiration before every request.
- Tokens are automatically refreshed and updated in the environment/memory.
- Initial authentication is handled via a separate
authscript or integrated OAuth flow.
3. Data Representation & MCP Annotations
Decision: Use dual-content outputs with audience-specific annotations and native MIME typing. Context: To provide a clean user experience while giving the LLM detailed data, we split tool results into two parts and use protocol-level typing. Implementation:
- User Facing: Markdown summaries annotated with
audience=["user"]usingTextContent. - Assistant Facing: Raw JSON data provided as an
EmbeddedResourcewithmimeType="application/json"and annotated withaudience=["assistant"]. - This ensures the LLM explicitly knows the data format while allowing clients to optimize the user-facing UI.
4. Internationalization
Decision: Use metric units (meters, km, m/s) internally and provide clear conversion instructions to the LLM. Implementation:
- Strava API returns metric units.
- The LLM is instructed in
main.pyto convert these to human-friendly formats (km, km/h) based on user preference.