Skip to main content
Glama
mcp-server-strava

mcp-server-strava

by rbctmz

Интеграция Strava API с Model Context Protocol (MCP) SDK

CI Codecov Python License: MIT Ruff

Интеграция для анализа тренировок и получения рекомендаций на основе данных Strava с использованием Model Context Protocol SDK.

🚀 Возможности

  • Анализ тренировок из Strava

  • Рекомендации по тренировкам

  • Автоматическое обновление токенов

  • Rate limiting для API запросов

Related MCP server: Strava MCP Server

📋 Требования

⚙️ Установка

# Клонируем репозиторий
git clone https://github.com/rbctmz/mcp-server-strava.git
cd mcp-server-strava

# Установка через uv (рекомендуется)
curl -LsSf https://astral.sh/uv/install.sh | sh
uv pip install .

# Установка в режиме разработки
uv pip install -e ".[dev]"

Установка MCP SDK

uv add "mcp[cli]"

🔧 Настройка

Настройка Strava API

  1. Перейдите на страницу настроек API

  2. Создайте приложение:

    • Application Name: MCP Strava Integration

    • Category: Training Analysis

    • Website: http://localhost

    • Authorization Callback Domain: localhost

Настройка окружения

  1. Создайте файл с переменными окружения:

    cp .env-template .env
  2. Получите токены доступа:

    python scripts/auth.py
  3. Проверьте настройку:

    mcp dev src/server.py
    curl -X GET "http://localhost:8000/activities"

📚 API и примеры

Ресурсы и инструменты

Тип

Название

Описание

Ресурс

strava://activities

Список активностей

Ресурс

strava://activities/{id}

Детали активности

Ресурс

strava://athlete/zones

Тренировочные зоны

Ресурс

strava://athlete/clubs

Клубы атлета

Ресурс

strava://gear/{gear_id}

Информация о снаряжении

Инструмент

analyze_activity(activity_id)

Анализ тренировки

Инструмент

analyze_training_load(activities)

Анализ нагрузки

Инструмент

get_activity_recommendations()

Рекомендации

Примеры использования

from mcp import ClientSession

# Получение активностей
async with ClientSession() as session:
    activities = await session.read_resource("strava://activities")
    activity = await session.read_resource("strava://activities/12345678")

# Анализ тренировки
result = analyze_activity(activity_id="12345678")
"""
{
    "type": "Run",
    "distance": 5000,
    "moving_time": 1800,
    "analysis": {
        "pace": 5.5,  # мин/км
        "effort": "Средняя"
    }
}
"""

# Анализ нагрузки
summary = analyze_training_load(activities)
"""
{
    "activities_count": 10,
    "total_distance": 50.5,  # км
    "total_time": 5.2,      # часы
    "heart_rate_zones": {
        "easy": 4,    # ЧСС < 120
        "medium": 4,  # ЧСС 120-150
        "hard": 2     # ЧСС > 150
    }
}
"""

# Получение тренировочных зон
async with ClientSession() as session:
    zones = await session.read_resource("strava://athlete/zones")
    """
    {
        "heart_rate": {
            "custom_zones": true,
            "zones": [
                {"min": 0, "max": 120, "name": "Z1 - Recovery"},
                {"min": 120, "max": 150, "name": "Z2 - Endurance"},
                {"min": 150, "max": 170, "name": "Z3 - Tempo"},
                {"min": 170, "max": 185, "name": "Z4 - Threshold"},
                {"min": 185, "max": -1, "name": "Z5 - Anaerobic"}
            ]
        },
        "power": {
            "zones": [
                {"min": 0, "max": 180},
                {"min": 181, "max": 250},
                {"min": 251, "max": 300},
                {"min": 301, "max": 350},
                {"min": 351, "max": -1}
            ]
        }
    }
    """

🛠 Разработка

CI/CD и безопасность

  • Coverage

  • Tests

  • Ruff

Проверки в GitHub Actions

Тип

Инструмент

Описание

Линтинг

ruff

Форматирование и анализ кода

Тесты

pytest

Unit и интеграционные тесты

Покрытие

pytest-cov

Отчет о покрытии кода

Безопасность и секреты

  1. Защита токенов:

    • .env в .gitignore

    • GitHub Secrets для CI/CD

    • Rate limiting: 100 запросов/15 мин

  2. Настройка секретов:

    # В GitHub: Settings → Secrets → Actions
    STRAVA_CLIENT_ID=<client_id>
    STRAVA_CLIENT_SECRET=<client_secret>
    STRAVA_REFRESH_TOKEN=<refresh_token>

Contributing

  1. Форкните репозиторий

  2. Установите зависимости: uv pip install -e ".[dev]"

  3. Создайте ветку: git checkout -b feature/name

  4. Проверьте изменения:

    ruff format .
    ruff check .
    pytest --cov=src
  5. Создайте Pull Request

📫 Поддержка

📄 Лицензия

MIT

Available Tools

4 tools
analyze_activityC

Анализ активности из Strava

Args:
    activity_id: ID активности (строка или число)
Returns:
    dict: Результаты анализа активности

Inputs: activity_id (required).

analyze_training_loadD

Анализ тренировочной нагрузки

Inputs: activities (required).

get_activity_by_idC

Get activity details from Strava

Args:
    activity_id (Union[str, int]): Activity ID to fetch
    
Returns:
    Dict: Activity details including type, distance, time and other metrics

Inputs: activity_id (required).

get_activity_recommendationsB

Получить рекомендации по тренировкам на основе анализа последних активностей

Inputs: no named parameters.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    C2.2/5.0

    Scored across 4 tools

    Disambiguation2/5

    There is significant overlap between analyze_activity and get_activity_by_id, as both appear to retrieve and process activity data based on activity_id, making them easily confused. analyze_training_load and get_activity_recommendations are more distinct but still related to activity analysis, creating some ambiguity in the set.

    Naming Consistency3/5

    The naming is mixed with both English and Russian terms (e.g., analyze_activity vs. analyze_training_load in English, but get_activity_recommendations in Russian description), and the verb patterns vary (analyze_ vs. get_). While readable, this inconsistency reduces predictability and coherence.

    Tool Count3/5

    With 4 tools, the count is borderline thin for a Strava server, as it might lack broader functionality like user management, activity creation, or social features. However, it covers core analysis aspects, so it's not severely mismatched but feels slightly under-scoped.

    Completeness2/5

    The tool set is focused on activity analysis and recommendations, but there are significant gaps: no CRUD operations for activities (e.g., create, update, delete), no user profile or authentication tools, and no social or leaderboard features typical of Strava's domain. This will likely cause agent failures for common workflows.

    Maintenance

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers