Rewards Flights Public MCP

Implementar un servidor MCP remoto y sin autenticación en Cloudflare Workers para buscar vuelos de recompensa.

Documentación

Rewards Flight MCP Server

Un servidor experimental del Protocolo de Contexto de Modelo que expone herramientas de búsqueda de vuelos de premio de solo lectura respaldadas por la API de socios de Seats.aero. Se ejecuta en Cloudflare Workers y utiliza el transporte HTTP Streamable en /mcp.

Estado del proyecto

Este repositorio es un prototipo endurecido en seguridad, no una plataforma multiinquilino terminada. Tiene un límite de token portador compartido, una lista de permitidos de origen y limitación de velocidad de Cloudflare Worker. Un despliegue de producción debería reemplazar el token compartido con MCP OAuth/Cloudflare Access, emitir ámbitos por usuario, añadir eventos de auditoría y alertas, y completar un modelo de amenazas y una prueba de carga.

Modelo de seguridad

  • Cada solicitud /mcp requiere Authorization: Bearer <token>.
  • Las credenciales se comparan mediante resúmenes SHA-256 y la API de comparación segura en tiempo de Cloudflare.
  • Las solicitudes del navegador se aceptan solo desde MCP_ALLOWED_ORIGINS; los clientes MCP nativos pueden omitir Origin.
  • Las solicitudes autenticadas y no autenticadas tienen limitación de velocidad sin almacenar credenciales sin procesar en la clave de limitación de velocidad.
  • La clave de Seats.aero y el token portador de MCP son secretos de Wrangler. Ninguna credencial debe estar en el código fuente, .dev.vars, registros, confirmaciones, problemas o solicitudes de extracción.
  • Las rutas antiguas HTTP+SSE no se exponen intencionalmente.

Reporte una vulnerabilidad de forma privada utilizando el flujo Seguridad → Reportar una vulnerabilidad de GitHub. No abra un problema público que contenga secretos.

Configuración local

npm ci
cp .dev.vars.example .dev.vars
npm run dev

Cree .dev.vars localmente con valores nuevos, no de producción:

SEATS_AERO_API_KEY=replace-with-a-rotated-key
MCP_AUTH_TOKEN=replace-with-a-long-random-token
MCP_ALLOWED_ORIGINS=https://your-client.example

.dev.vars es ignorado por Git. Nunca reutilice la credencial eliminada del historial anterior del repositorio.

Despliegue en Cloudflare

Autentique Wrangler, configure secretos recién rotados y luego despliegue:

npx wrangler login
npx wrangler secret put SEATS_AERO_API_KEY
npx wrangler secret put MCP_AUTH_TOKEN
npx wrangler secret put MCP_ALLOWED_ORIGINS
npm run deploy

El Worker mantiene el nombre de servicio heredado de Cloudflare en wrangler.jsonc para que el despliegue actualice el endpoint existente en lugar de dejar un servicio sin autenticación. Conecte los clientes a https://<worker>.<account>.workers.dev/mcp y proporcione el token portador a través del mecanismo seguro de credenciales del cliente.

Controles de calidad

npm run type-check
npm run lint
npm test

GitHub Actions ejecuta estos controles en pushes y solicitudes de extracción.