A serverless Monzo → Claude connector on Cloudflare Workers

Ya existen algunos servidores MCP de Monzo (partymola, BfdCampos, uno de npm), y son buenos, pero todos son servidores stdio locales que ejecutas en tu propia máquina. Este es el primero remoto/serverless que he encontrado: vive en un Cloudflare Worker, así que te autenticas una vez y te sigue a todas las superficies de Claude, sin nada que mantener en ejecución.

Documentación

Conector Monzo → Claude

Claude ⇄ Cloudflare Worker ⇄ Monzo

Un servidor MCP remoto, que se ejecuta en un Worker de Cloudflare, que da a Claude acceso de solo lectura a tu cuenta de Monzo mediante OAuth.

Una vez conectado en claude.ai, puedes preguntar cosas como "¿cuál es mi saldo de Monzo?", "lista mis transacciones recientes" o "¿cuánto hay en mis bolsas de ahorro?" en cualquier chat — web, escritorio o teléfono. Autentica una vez; te sigue a todas partes. Sin portátil, sin servidor local, nada que mantener en ejecución.

No afiliado a Monzo. Esta es una herramienta de uso personal construida sobre la API de desarrollador pública de Monzo. Úsala bajo tu propio riesgo y lee el Modelo de seguridad antes de desplegarla.

Lo que expone

HerramientaDescripción
get_accountsCuentas abiertas (personal, conjunta, Flex, recompensas) con ids/códigos de clasificación
get_balanceSaldo, total incl. bolsas, y gastado hoy — una cuenta o todas
list_transactionsTransacciones recientes (últimos 90 días), filtrables por fecha
get_transactionDetalle completo de una transacción individual
list_potsBolsas de ahorro y sus saldos

Solo lectura por diseño: no hay pagos, transferencias ni movimientos de bolsas — las herramientas simplemente no existen, así que ninguna cantidad de inyección de prompts puede mover dinero.

Arquitectura

Claude (claude.ai)  ──OAuth──>  This Worker  ──OAuth──>  Monzo API
                                     │
                     workers-oauth-provider (KV)  +  McpAgent (Durable Object)
  • @cloudflare/workers-oauth-provider es el servidor OAuth al que Claude se autentica — maneja el registro dinámico de clientes, /authorize, /token y el almacenamiento de concesiones en KV.
  • src/monzo-handler.ts hace de puente con el OAuth de Monzo (autorizar → correo de enlace mágico → aprobación en la app → callback).
  • src/mcp.ts es el McpAgent — un Durable Object por usuario conectado, que guarda los tokens de Monzo de ese usuario y los refresca automáticamente mediante el token de refresco.
  • src/monzo.ts es el cliente fino de la API de Monzo.

Modelo de seguridad

Vale la pena entenderlo antes de desplegar — el diseño aísla a los usuarios por construcción:

  • Sin credencial bancaria permanente en el Worker. Los únicos secretos a nivel de Worker son el client_id/client_secret de OAuth de Monzo, que pueden intercambiar códigos de autorización pero no pueden leer ningún dato de cuenta por sí solos.
  • Los tokens viven por concesión, no por Worker. Cuando un usuario completa el baile OAuth, sus tokens de Monzo se almacenan cifrados dentro de su concesión (completeAuthorization({ props: ...tokens })). Cada solicitud MCP se resuelve mediante el token de portador del llamante hasta su concesión, su Durable Object, su cuenta de Monzo. No existe solicitud que llegue a los datos de otro usuario.
  • Las solicitudes no autenticadas reciben 401. El endpoint /mcp solo responde a tokens de portador que el propio Worker emitió.
  • Monzo añade sus propias barreras. Los clientes OAuth del portal de desarrolladores solo autorizan al propietario del cliente (más colaboradores añadidos explícitamente), y cada inicio de sesión requiere aprobación en la app de Monzo en el teléfono del titular de la cuenta (SCA).
  • Los alcances son solo de lectura y los endpoints de pago/transferencia nunca se llaman.

Los riesgos residuales son los habituales para cualquier conector: protege los secretos desplegados y trata tu sesión de claude.ai como la credencial que es.

Configuración

  1. Registra un cliente OAuth de Monzo en https://developers.monzo.comConfidencialidad: Confidencial (requerido para tokens de refresco). URL de redirección: https://<your-worker>.workers.dev/callback.

  2. Completa los secretos en .dev.vars (ignorado por git) para desarrollo local:

    MONZO_CLIENT_ID=oauth2client_...
    MONZO_CLIENT_SECRET=mnzconf...
    COOKIE_ENCRYPTION_KEY=<openssl rand -hex 32>
    
  3. Crea el espacio de nombres KV y pega el id devuelto en wrangler.jsonc (reemplazando <YOUR_OAUTH_KV_NAMESPACE_ID>):

    npx wrangler kv namespace create OAUTH_KV
    
  4. Despliega y envía los secretos:

    npx wrangler deploy
    npx wrangler secret put MONZO_CLIENT_ID
    npx wrangler secret put MONZO_CLIENT_SECRET
    npx wrangler secret put COOKIE_ENCRYPTION_KEY
    
  5. Añade el conector en claude.ai → Configuración → Conectores → Añadir conector personalizado → https://<your-worker>.workers.dev/mcp → autoriza. Serás redirigido a través del inicio de sesión de Monzo (correo de enlace mágico + aprobar en la app de Monzo), y entonces Claude muestra las cinco herramientas.

También funciona en Claude Code:

claude mcp add --transport http monzo https://<your-worker>.workers.dev/mcp

Notas y limitaciones

  • Monzo solo expone las transacciones de los últimos 90 días a menos que reautentiques inmediatamente después de aprobar el acceso; este conector acepta esa ventana móvil.
  • Los clientes de desarrollador de Monzo son de un solo usuario a menos que Monzo apruebe tu app para producción — suficiente para el caso de uso personal para el que está construido.
  • Los secretos viven en .dev.vars (local) y en los secretos de Wrangler (prod) — nunca en git. El .gitignore lo garantiza.

Licencia

MIT — haz lo que quieras, sin garantía. Los nombres y logotipos de Monzo, Claude y Cloudflare pertenecen a sus respectivos dueños.