Skip to main content
Glama
Arbodgad

strava-openapi-mcp

by Arbodgad

strava-openapi-mcp

Servidor MCP local en Python que actúa como proxy genérico entre un cliente MCP—especialmente OpenCode—y la API REST de Strava. Las herramientas no se implementan endpoint por endpoint: se generan al inicio a partir de la especificación oficial Swagger 2.0 de Strava.

El repositorio contiene una copia de la especificación y sus documentos de esquema referenciados. Por lo tanto, el inicio no requiere acceso a Internet para construir la lista de herramientas. El comando update-spec actualiza la copia del usuario tras la validación.

Arquitectura

openapi.py carga y valida Swagger, resuelve referencias locales y normaliza las operaciones. tools.py transforma cada operación en una herramienta MCP con un JSON Schema generado. client.py construye URLs, parámetros, cuerpos JSON y formularios multipart sin conocer los endpoints de Strava individualmente. auth.py gestiona el flujo OAuth local y la renovación de tokens. server.py expone todo a través de MCP stdio, mientras que cli.py proporciona comandos de mantenimiento.

La especificación actualmente publicada por Strava es Swagger 2.0, con info.version 3.0.0. El paquete se trata intencionadamente como datos reemplazables: si aparece un nuevo endpoint en la especificación, se descubre automáticamente.

Related MCP server: MCP OpenAPI Connector

Requisitos previos e instalación local

Se recomiendan Python 3.12+ y uv.

git clone https://github.com/Arbodgad/strava-openapi-mcp.git
cd strava-openapi-mcp
uv sync
uv run strava-mcp list-tools

Inicie el servidor MCP con:

uv run strava-mcp

El servidor permanece activo en el transporte MCP stdin/stdout. Los registros de la aplicación se envían a stderr. No se debe escribir ningún registro de diagnóstico en stdout durante el transporte stdio.

Crear una aplicación de Strava

  1. Abra https://www.strava.com/settings/api.

  2. Cree una aplicación y anote su Client ID y Client Secret.

  3. Strava acepta localhost y 127.0.0.1 como dominios de callback. El callback predeterminado es http://127.0.0.1:8765/callback.

Las credenciales se pueden proporcionar a través del entorno:

export STRAVA_CLIENT_ID="..."
export STRAVA_CLIENT_SECRET="..."

O en ~/.config/strava-mcp/credentials.json con permisos 0600:

{
  "client_id": "...",
  "client_secret": "..."
}

Las variables de entorno tienen prioridad. El secreto nunca se muestra ni se escribe en los registros.

OAuth

Ejecute una vez:

strava-mcp auth

El navegador abre la página de autorización de Strava. El callback local intercambia el código de autorización por access_token, refresh_token, expires_at y los ámbitos concedidos. Los tokens se almacenan en ~/.config/strava-mcp/tokens.json con permisos 0600. El servidor renueva automáticamente los tokens de acceso caducados y persiste un token de renovación rotatorio cuando Strava devuelve uno.

Por defecto, se solicitan todos los ámbitos declarados por la especificación. Para solicitar un subconjunto:

export STRAVA_OAUTH_SCOPES="activity:read,activity:write"

Las descripciones oficiales se analizan para inferir ámbitos explícitos. Los endpoints de lectura que aceptan activity:read o activity:read_all se representan como alternativas. Un ámbito condicional—como activity:read_all para una actividad privada—se muestra al LLM, y el error original de Strava permanece visible.

Configuración

Variables admitidas:

Variable

Valor predeterminado

STRAVA_CLIENT_ID

ninguno, o credentials.json

STRAVA_CLIENT_SECRET

ninguno, o credentials.json

STRAVA_API_BASE_URL

https://www.strava.com/api/v3

STRAVA_OPENAPI_URL

https://developers.strava.com/swagger/swagger.json

STRAVA_OPENAPI_PATH

~/.config/strava-mcp/openapi.json

STRAVA_ALLOW_WRITE

true

STRAVA_ALLOW_DELETE

false

STRAVA_LOG_LEVEL

INFO

STRAVA_OAUTH_SCOPES

todos los ámbitos declarados de Strava

STRAVA_CALLBACK_HOST / STRAVA_CALLBACK_PORT

127.0.0.1 / 8765

También se aceptan los alias STRAVA_MCP_ALLOW_WRITE y STRAVA_MCP_ALLOW_DELETE. strava-mcp show-config muestra solo una vista de configuración no secreta.

Los valores recomendados son STRAVA_ALLOW_WRITE=true y STRAVA_ALLOW_DELETE=false. Los métodos POST, PUT y PATCH no están bloqueados por defecto. Los métodos DELETE se generan cuando la especificación los contiene, pero se filtran de la lista de herramientas MCP mientras STRAVA_ALLOW_DELETE=false.

Primer inicio

export STRAVA_CLIENT_ID="..."
export STRAVA_CLIENT_SECRET="..."
strava-mcp auth
strava-mcp list-tools
strava-mcp

La copia de la especificación del usuario tiene prioridad. Si no existe, se utiliza la especificación oficial incluida sin descargar nada al inicio.

Actualizar la especificación

strava-mcp update-spec

El comando descarga STRAVA_OPENAPI_URL, valida el documento Swagger y luego descarga los documentos JSON referenciados. La copia existente se reemplaza solo después de que todo el proceso de descarga y validación tenga éxito. Se muestran la versión informada y el número de esquemas referenciados.

Para forzar una ruta diferente:

STRAVA_OPENAPI_PATH="$HOME/.config/strava-mcp/openapi.json" strava-mcp update-spec

Instalación directa con uvx desde Git

El pyproject.toml declara el ejecutable y todas las dependencias. No se requiere instalación manual de Python ni clonación:

uvx --from git+https://github.com/Arbodgad/strava-openapi-mcp strava-mcp auth
uvx --from git+https://github.com/Arbodgad/strava-openapi-mcp strava-mcp

Para usar inmediatamente un nuevo commit a pesar de la caché de uv:

uvx --refresh --from git+https://github.com/Arbodgad/strava-openapi-mcp strava-mcp

Configuración de OpenCode

Añada el servidor a la configuración de OpenCode:

{
  "mcp": {
    "strava": {
      "type": "local",
      "command": [
        "uvx",
        "--from",
        "git+https://github.com/Arbodgad/strava-openapi-mcp",
        "strava-mcp"
      ],
      "enabled": true
    }
  }
}

Exporte las variables en el entorno que lanza OpenCode, o use credentials.json, en lugar de comprometer secretos en este archivo. Ejecute strava-mcp auth una vez para la misma cuenta local antes de iniciar OpenCode.

Herramientas generadas y ejemplos

Los nombres se derivan de operationId, normalizados a snake case, con un prefijo de método HTTP añadido solo cuando es necesario para evitar ambigüedad. Por ejemplo, con la especificación actual:

Endpoint

Herramienta generada actual

GET /athlete

get_logged_in_athlete

GET /athlete/activities

get_logged_in_athlete_activities

GET /activities/{id}

get_activity_by_id

PUT /activities/{id}

put_update_activity_by_id

GET /activities/{id}/streams

get_activity_streams

GET /athletes/{id}/stats

get_stats

Los parámetros del cuerpo UpdatableActivity se aplanan en la herramienta PUT. El agente puede, por tanto, realizar llamadas conceptualmente equivalentes:

put_update_activity_by_id(id=123456789, name="Long Z2 run")
put_update_activity_by_id(id=123456789, description="Easy aerobic endurance session, good sensations.")

Otros ejemplos de solicitudes en lenguaje natural:

  • “Lista mis últimas actividades de carrera”: use get_logged_in_athlete_activities y luego filtre los resultados devueltos.

  • “Lee los detalles de la actividad 123”: use get_activity_by_id(id=123).

  • “Obtén los streams de distancia y frecuencia cardíaca para 123”: use get_activity_streams(id=123, keys=["distance", "heartrate"], key_by_type=true).

  • “Obtén mis estadísticas”: obtenga el atleta autenticado y luego use get_stats(id=...).

La paginación está completamente controlada por los parámetros de la especificación (page, per_page, before, after, page_size, after_cursor, etc.). El servidor nunca inicia automáticamente una secuencia larga de solicitudes de página.

Escrituras y operaciones peligrosas

Las descripciones MCP incluyen This operation modifies Strava data para POST/PUT/PATCH y WARNING para DELETE. Si STRAVA_ALLOW_WRITE=false, las herramientas de escritura devuelven un error explícito. Si STRAVA_ALLOW_DELETE=false, las herramientas DELETE están ausentes de list_tools y las llamadas directas se rechazan.

Los errores HTTP conservan el estado, el endpoint, el mensaje de Strava y las cabeceras de límite de velocidad disponibles, por ejemplo:

HTTP 401 Unauthorized
Endpoint: PUT /activities/{id}
Message: Invalid or expired token

Una respuesta 204 se convierte en el objeto mínimo { "status": "success", "http_status": 204 }. Las respuestas JSON conservan los nombres de campo de Strava.

Comandos CLI

strava-mcp                       # MCP stdio server
strava-mcp auth                  # Browser OAuth + localhost callback
strava-mcp update-spec           # Validated update of the local copy
strava-mcp show-config           # Non-secret configuration
strava-mcp list-tools            # Method, endpoint, tool, and summary
strava-mcp list-tools --schemas  # Also display each inputSchema JSON

list-tools --schemas es útil para diagnosticar un cliente MCP que rechaza un esquema. Las palabras clave JSON Schema como required se muestran en el nivel de esquema relevante; una propiedad de Strava llamada required permanece bajo properties.

Pruebas y desarrollo

uv run pytest
uv run ruff check .

Las pruebas usan transportes HTTP simulados y no contactan con Strava. Las pruebas de integración contra Strava no se ejecutan automáticamente a propósito.

Solución de problemas

  • No Strava authorization found: ejecute strava-mcp auth con las credenciales correctas.

  • OAuth scope missing: ejecute strava-mcp auth de nuevo con el ámbito solicitado en STRAVA_OAUTH_SCOPES.

  • Spec update aborted: la copia local anterior permanece intacta; compruebe la red o elimine un STRAVA_OPENAPI_PATH personalizado.

  • No hay herramientas DELETE: este es el comportamiento predeterminado; establezca STRAVA_ALLOW_DELETE=true y reinicie.

  • Error MCP relacionado con stdout: no añada llamadas print al código del servidor; los registros deben usar logging configurado para stderr.

  • Puerto OAuth ya en uso: establezca STRAVA_CALLBACK_PORT a un puerto disponible y, si es necesario, registre el dominio localhost en la aplicación de Strava.

Seguridad

El secreto de cliente, el token de acceso y el token de renovación nunca se incluyen en registros, descripciones MCP o mensajes de error. Los archivos locales de credenciales y tokens son ignorados por Git y se escriben con permisos 0600. Nunca comprometa .env, credentials.json o tokens.json.

Install Server
A
license - permissive license
B
quality
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • -
    license
    Not graded
    quality
    Not graded
    maintenance
    Dynamically generates MCP tools from Swagger/OpenAPI specifications by extracting swagger.json files at runtime. Enables natural language interaction with any REST API that has Swagger documentation.
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables Claude Desktop and other MCP clients to interact with any OAuth2-authenticated OpenAPI-based API through automatic tool generation from OpenAPI specifications, with built-in token management and authentication handling.
    8
    3
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Parses Swagger 2.0 and OpenAPI 3.x specifications, exposing API endpoints, schemas, and authentication through MCP tools with local caching to reduce token usage.
    11
    16
    1
    MIT
  • F
    license
    Not graded
    quality
    B
    maintenance
    Transforms OpenAPI specs into governed MCP applications with a local-first studio, OAuth, simulation, and Docker deployment.

View all related MCP servers

Related MCP Connectors

  • MCP server for AI access to Swagger by SmartBear.

  • Generate a typed SDK, CLI, and MCP server from any OpenAPI or GraphQL spec, and keep them current.

  • NOAA and ECMWF weather forecast MCP for discovery, validation, and GribStream OAuth queries.

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Arbodgad/strava-openapi-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server