mcp-server-strava

# Ревью кода: Интеграция Strava API с MCP SDK Этот документ содержит обзор ключевых аспектов реализации MCP‑сервера для Strava API, выявленные сильные стороны, области для улучшения и рекомендации. ## 1. Общая архитектура - Проект разделён на два блока: 1. Основной MCP‑сервер в `src/` для работы со Strava API. 2. Встроенная MCP Python SDK (`python-sdk/`) для создания и управления ресурсами, инструментами, клиентами. - Используется FastMCP (ASGI‑сервер) для экспонирования ресурсов и инструментов в соответствии со спецификацией MCP. - OAuth‑скрипт (`scripts/auth.py`) обрабатывает авторизацию Strava и сохранение токенов в `.env`. - Кэширование запросов реализовано классом `StravaCache` с простым TTL. ## 2. Сильные стороны - Чёткое разделение слоёв: - Авторизация (`StravaAuth`), - Кэширование (`StravaCache`), - Ресурсы и инструменты MCP (`src/server.py`). - Наличие полной тестовой базы на большинстве ключевых функций. - Интеграция с dotenv и удобным OAuth‑флоу через браузер. - Документация в README описывает как установку, настройку и примеры API. ## 3. Области для улучшения ### 3.1. Обработка ошибок и исключений (реализовано) - Введён общий декоратор `resource_error_handler` для всех MCP‑ресурсов. - Исключения `StravaApiError` пробрасываются без изменений. - Сетевая ошибка (`RequestException`) обрабатывается через `handle_strava_error`. - Все прочие ошибки логируются и преобразуются в `StravaApiError`. - Ручной вызов `raise` после `handle_strava_error` в `get_recent_activities` теперь выполняется автоматически в декораторе. ### 3.2. Улучшения StravaAuth (реализовано) - Буфер при проверке `expires_at` добавлен (`token_expiry_buffer = 60` секунд). - Метод `make_request` теперь поддерживает до 3 повторных попыток с экспоненциальным бэкоффом. - Везде используется единообразный HTTP‑клиент `requests.request` (в `refresh_access_token`, `make_authenticated_request`). ### 3.3. Логирование и безопасность (реализовано) - Убрано логирование токенов (access_token, refresh_token) в ресурсах и Auth. - При обновлении токена логируется только Client ID без токенов. - Секреты по-прежнему загружаются из `.env` (для продакшена рекомендуется безопасное хранилище, например Vault или AWS Secrets Manager). ### 3.4. Тестовое покрытие (реализовано) - Добавлены тесты для OAuth-скрипта (`scripts/auth.py`), `RateLimiter`, сценариев истечения TTL в кэше и пагинации в `get_recent_activities_with_pagination`. ## 4. Рекомендации 1. Перейти на детерминированное формирование ключей кэша (JSON‑сериализация). 2. ✔️ Реализован декоратор `resource_error_handler` для унификации обработки ошибок MCP‑ресурсов. 3. ✔️ Убрано логирование токенов (access_token, refresh_token). 4. Расширить тесты на негативные сценарии и вспомогательные модули. 5. ✔️ Буфер при проверке `expires_at` и централизованная логика рефреша реализованы. 6. _Реализовать детерминированное формирование ключей для кэша (JSON‑сериализация параметров)._ 7. _Сделать `StravaCache` и `RateLimiter` потокобезопасными (используя мьютексы или асинхронные примитивы)._ 8. _Перейти на использование `requests.Session` в `StravaAuth` для переиспользования HTTP‑соединений и настройки общей сессии (таймауты, заголовки)._ 9. _Добавить retry и backoff в метод `refresh_access_token`, чтобы устойчиво обрабатывать временные сбои сети или API._ 10. _Консолидировать логику формирования заголовков авторизации в одном методе, чтобы избежать дублирования._ 11. _Рассмотреть строгую статическую типизацию (`mypy`) и настройку линтеров (`flake8`, `black`, `isort`) в CI._ 12. _Покрыть тестами сценарии в `make_authenticated_request`: обработку 401 (refresh + retry) и отказ после повторов._ 13. _Добавить документацию (например, OpenAPI) для всех MCP‑ресурсов и примеры запросов._ -- _Документ обновлен вручную после выполнения рекомендаций._
ID: 35t2pc2ntw