Paxaver

Adaptador MCP para la plataforma comunitaria escolar Paxaver: pedidos de almuerzo para estudiantes con verificación de alergias y preferencias dietéticas, billeteras, calendarios escolares, voluntariado, membresías y pagos. Más de 25 herramientas sobre Streamable HTTP con OAuth 2.1 + PKCE.

Documentación

Servidor MCP de Paxaver

Adaptador orientado a IA sobre la plataforma comunitaria escolar Paxaver. Implementa el Protocolo de Contexto de Modelos (MCP) en Cloudflare Workers con validación de JWT RS256, autorización basada en capacidades y transporte HTTP Streamable.

npm version License: Apache-2.0 MCP Badge Paxaver MCP connector – tool definition quality and endpoint health on Glama


Qué es esto

El servidor MCP de Paxaver permite que los asistentes de IA (ChatGPT, Claude, Perplexity y cualquier cliente compatible con MCP) actúen en nombre de un usuario de Paxaver: consultar un menú de almuerzo, pedir almuerzo, inscribirse en eventos de recaudación de fondos, ser voluntario y — para administradores escolares — gestionar restaurantes, elementos de menú, eventos y pedidos diarios.

Es un adaptador ligero. No contiene lógica de negocio y nunca toca la base de datos, Stripe o el correo electrónico directamente. Cada acción se delega a la API privada del backend de Paxaver a través de un service binding de Cloudflare (misma región, sin salto de red pública). Las únicas responsabilidades del servidor MCP son:

  • Manejo del protocolo MCP (JSON-RPC 2.0, HTTP Streamable)
  • Validación de JWT RS256 mediante JWKS del worker de autenticación centralizado de Paxaver
  • Política de capacidades por herramienta y control de roles
  • Mapeo de errores saneado y seguro para el usuario

La autenticación la gestiona el worker de autenticación de Paxaver (auth.paxaver.com), que actúa como servidor de autorización OAuth 2.0 / OIDC. El servidor MCP valida los JWT RS256 resultantes y los reenvía al backend. El servidor MCP en sí mismo no es un servidor de autorización.


Arquitectura

┌───────────────┐     MCP (Streamable HTTP)      ┌──────────────────────┐
│   AI Client   │ ─────────────────────────────▶ │   Paxaver MCP Worker │
│ ChatGPT/Claude│ ◀───────────────────────────── │  (this repo)         │
│  /Perplexity  │     RS256 JWT + JSON-RPC 2.0   │  Hono + jose         │
└───────────────┘                                └──────────┬───────────┘
                                                            │
                                          Cloudflare service binding
                                          (PAXAVER_API, same region)
                                                            │
                                                            ▼
                                                 ┌──────────────────────┐
                                                 │  Paxaver API Worker  │
                                                 │  (private backend)   │
                                                 │  D1 · Stripe · SES   │
                                                 └──────────────────────┘

El worker MCP nunca enlaza D1, Stripe o SES. El service binding transporta un JWT de corta duración (TTL de 120 s, audiencia paxaver-internal) que el backend confía como una llamada interna mientras sigue atribuyendo la acción al usuario autenticado de Paxaver. Consulta docs/architecture.md para ver el panorama completo.


Inicio rápido

Instalación

npm install @paxaver/mcp

Desarrollo local

# 1. Install dependencies (Node >= 22)
npm install

# 2. Run the worker locally (Miniflare)
npm run dev

# 3. Typecheck, lint, and test
npm run typecheck
npm run lint
npm test

El servidor de desarrollo local se inicia en http://localhost:8787. Los endpoints de descubrimiento se encuentran bajo /.well-known/; el endpoint MCP es POST /mcp.

Nota: El desarrollo local sin el service binding PAXAVER_API recurre a HTTPS autenticado contra API_BASE_URL (por defecto http://localhost:8787). Para pruebas de integración completas, ejecuta el worker del backend de Paxaver localmente y apunta API_BASE_URL hacia él.


Despliegue

Dos entornos, cada uno un Worker separado con su propio dominio personalizado:

EntornoNombre del WorkerDominio
stagingpaxaver-mcp-stagingmcp.paxaver.dev
productionpaxaver-mcpmcp.paxaver.com

El worker de producción atiende tanto a usuarios de CA como de EE. UU. a través de un único endpoint (mcp.paxaver.com). La región del usuario se resuelve a partir del claim tenant_id del JWT, y el worker enruta al backend regional correcto mediante service bindings (PAXAVER_API_CA, PAXAVER_API_US). La moneda la determina la escuela del usuario, no el endpoint MCP.

npm run deploy:staging   # wrangler deploy --env staging
npm run deploy:prod      # wrangler deploy --env production

El worker no requiere secretos. Consulta docs/deployment.md.


Herramientas

El servidor expone 26 herramientas agrupadas en seis categorías. La visibilidad en tools/list se filtra según los roles del llamador; cada llamada se vuelve a autorizar antes del envío, y el backend vuelve a comprobar el acceso a nivel de datos (defensa en profundidad).

CategoríaHerramientas
Usuario / cuentaget_user_info
Billeteraget_wallet_balance, get_wallet_status
Pedidos y menúorder_lunch, get_orders, get_daily_menu, get_daily_orders, get_monthly_orders, create_draft_order, finalize_order, cancel_order
Eventosget_upcoming_events, create_event, update_event, cancel_event, register_event, sign_up_to_volunteer
Admin / restaurantelist_school_restaurants, create_restaurant, list_menu_items, create_menu_item, update_menu_item, set_menu_item_price, delete_menu_item, set_daily_menu

Las herramientas financieras y destructivas están etiquetadas y requieren confirmación del usuario. Referencia completa: docs/tools.md. Política de autorización: docs/authorization.md.

Privacidad

No se recopila ni se devuelve información de contacto personal (correo electrónico, teléfono, dirección) a través de las herramientas MCP. La herramienta get_user_info devuelve únicamente el nombre del usuario, la escuela, los estudiantes y los roles. Los datos de los estudiantes se limitan a IDs, nombres y slugs de escuela. Las alergias, notas, cumpleaños y otros datos personales no se exponen en las respuestas de lectura. El servidor MCP no registra datos de usuario.


Documentación

DocumentoTema
docs/architecture.mdArquitectura del sistema, límite del service binding, aislamiento regional
docs/authentication.mdValidación de JWT, JWKS, delegación del worker de autenticación, formato de token
docs/authorization.mdTabla de política de capacidades, control de roles, defensa en profundidad
docs/tools.mdReferencia completa de herramientas con esquemas de entrada y clasificaciones
docs/deployment.mdConfiguración de Wrangler, entornos, secretos, dominios personalizados
docs/security.mdModelo de seguridad, CORS, CSRF, saneamiento de errores, cabeceras
docs/compatibility.mdVersión del protocolo MCP, transportes, clientes de IA compatibles
docs/migration.mdMigración desde el mcp-server/ heredado en el monorepo privado
CHANGELOG.mdHistorial de versiones
SECURITY.mdPolítica de notificación de vulnerabilidades
CONTRIBUTING.mdConfiguración de desarrollo y proceso de contribución

Pila tecnológica

  • Runtime: Cloudflare Workers (compatibility_date: 2026-08-01, nodejs_compat)
  • Framework: Hono v4
  • JWT: jose v6 (RS256 mediante JWKS)
  • Protocolo: MCP 2025-06-18, HTTP Streamable
  • Autenticación: Validación de JWT RS256 mediante el worker de autenticación centralizado (auth.paxaver.com)
  • Compilación/despliegue: Wrangler v4
  • Pruebas: Vitest v2 (pool de Workers + pool de Node)

Licencia

Apache-2.0. Copyright (c) 2026 Smartoire. Consulta LICENSE.