Skip to main content
Glama
Beennnn

openbanking-mcp

by Beennnn

openbanking-mcp — leer sus cuentas y avisar ANTES

tests licencia MIT python 3.11+ cero dependencias

El repositorio se llama openbanking-mcp, el comando se llama bankread. No es un despiste: el nombre del repositorio dice lo que es — un servidor MCP sobre Open Banking — porque así es como se encuentra. El nombre del comando dice lo que se hace con él, y bankread doctor suena mejor que openbanking-mcp doctor. Las rutas de configuración (~/.config/bankread, llavero bankread-enablebanking) siguen al comando, no al repositorio.

Lectura de las cuentas bancarias mediante DSP2 (autorización AIS), más un resumen diario hacia Todoist. Python 3.11+, cero dependencias externas: urllib para el HTTP, JSON-RPC escrito a mano para el servidor MCP. Se ejecuta en el Mac, no en una nube.

⚠ El proveedor de datos hay que elegirlo — leer antes de empezar

Este repositorio nació con un cliente GoCardless Bank Account Data (ex-Nordigen), que era la vía gratuita evidente. Comprobado el 2026-08-20: este servicio está cerrado a nuevas suscripciones y en proceso de retirada. bankreadlib/gocardless.py ya solo sirve a quien ya tenía una cuenta.

El sustituto gratuito para un uso personal es Enable Banking, cuyo nivel Restricted Production da datos reales de producción sobre las únicas cuentas que uno mismo conecta — que es exactamente el uso que se le da aquí, y sin licencia que pagar. El cliente Enable Banking ya está escrito (bankreadlib/enablebanking.py): alta en autoservicio por correo electrónico, autenticación mediante JWT firmado con RS256 — sin dependencias, con la biblioteca estándar basta (bankreadlib/rs256.py). El recorrido por las soluciones practicables para BoursoBank y los tres hallazgos que cambiaron el código están en docs/fournisseurs.md.

Queda una cosa que nadie puede hacer por ti: crear la cuenta de Enable Banking, declarar en ella tus cuentas bancarias y firmar el consentimiento. El identificador de la aplicación y la clave privada son elementales personales — no hay nada que compartir, y es por ahí por donde hay que empezar.

Todo el resto del repositorio es independiente del proveedor.

El problema que resuelve, y el que no resuelve

BoursoBank ya envía «su saldo es bajo». La Caisse d'Épargne ya envía «entrada de dinero». Amazon envía «en reparto», Leboncoin «el vendedor ha confirmado». La información ya llega — solo que llega demasiado tarde y al lugar equivocado.

  • demasiado tarde: una alerta de umbral se dispara DESPUÉS del cargo. El día 15 por la mañana, los impuestos han pasado, la cuenta está baja, y la alerta lo constata;

  • en mal lugar: entre doscientos correos, la mayoría de los cuales no se envían.

Este proyecto no busca, por tanto, una información que falte. Hace la única cosa que naddie más hace: la resta. El saldo de hoy menos lo que va a caer antes de que hasta final de mes. Ni el banco ni los impuestos pueden hacerla — ninguno de los dos ve al otro.

Lo que no resuelve: nada aquí sustituye al hecho de mirar las cuentas. Un recargo nuevo, nunca visto es invisible para un detector de recurrencias.

Related MCP server: bank.mcp

Solo lectura, y no por cortesía

El vínculo pasa por la autorización DSP2 / AIS del proveedor (Enable Banking, nivel gratuito Restricted Production). Lol, la ISS es la colocación de la información sobre las cuentas. La iniciación de pagos es una autorización aparte (PIS), que ese token tiene no tiene nada para que el banco obtenga. El peor escenario de una filtración es la lectura de un historial, nunca de un movimiento de dinero. Esa es la única razón por la que este proyecto tiene derecho de existir.

Dos consecuencias prácticas:

  • las identificaciones del proveedor viven en el llavero de macOS, no en un archivo — unarchivo acaba en un tar de copia, un cat infeliz, un madeja hacia un NAS. Para Enable Banking, esto incluye la clave privada RSA: bankread secrets --setfront la lee, la guarda y recuerda que hay que borrar el .pem descargado;

  • el consentimiento ha de volver a firmarlo — tres a seis meses según lo que el banco conceda, y es su respuesta la que queda registrada, no nuestra petición. Nada puede renovarlo en tu place: hay que volbar a la web de tu banco. doctor lo avisa el día D-14 (no el D-1, que un solo fin de semana bastaría para remarar);

  • todo esto se ejecuta en el Mac. No en una sesión de cloud, no en un contenedor.

Puesta en marcha

Ver lo que hace, ahora mismo

./bankread demo

Una cuenta inventada, 400 días de historial fabricado, un saldo imaginario — y, entre tanto, la detección y la proyección reales que trabajan con él. Nada se escribe fuera de la carpeta temporal.

Lo que el demonio muestra, y que es todo el trabajo:

    2026-08-23 ±3j    -890.00  →     394.55   Loyer …          [loyer]
    2026-08-25 ±3j    -412.00  →     -17.45   Dgfip Impot …    [impots]
    2026-08-29 ±3j    2450.00  →    2432.55   Salaire …

  ⚠ passe sous 300 € le 2026-08-25 (-17.45 €), poussé par « Dgfip Impot Revenu »
    (1 motif(s) incertain(s) non comptés — la vraie trajectoire peut être plus basse)

El alquiler sigue debajo del salario; los impuestos lo hacen caer, cinco días antes de que se reciba la nómina. Tu banco te lo dirá un día 25 por la mañana. Yuna última línea es la más importante: la piscina de la vivienda (el el IBI) no ha pasado aún de dos veces en el historial, por lo tanto lo que aparece no se puede verificar no cuenta — y la proyección proyección ahora mismo dice que es optimista en lugar de hacer como que no es nada para no quedar.

Instalarlo, o no

Tres formas, según el grado de compromiso que piden:

git clone https://github.com/Beennnn/openbanking-mcp && cd openbanking-mcp && ./bankread doctor
uvx --from git+https://github.com/Beennnn/openbanking-mcp bankread doctor   # sans rien installer
pipx install git+https://github.com/Beennnn/openbanking-mcp                 # à demeure

El intermedio, y no probe: una herramienta que lee cuentas bancarias se lee antes de leerse. ./bankread funciona desde el clon, sin instalar nada.

A continuación, en el orden

# 0. créer l'application chez le fournisseur : https://enablebanking.com/sign-in/
#    Control Panel → API applications → environnement « Production », clé générée.
#    L'URL de retour à déclarer est http://127.0.0.1:8788/callback (à l'identique).

# 1. les deux identifiants (le second est le CHEMIN du .pem téléchargé)
bankread secrets --set          # ils vont dans le trousseau, pas sur le disque

# 2. trouver sa banque, puis signer le consentement (ouvre le site de la banque)
bankread banks bourso           # relève le NOM EXACT que renvoie l'API
bankread link "BoursoBank"      # puis, séparément :
bankread link "Caisse d'Epargne"

# 3. vérifier
bankread doctor
bankread project --days 45 --floor 300

# 4. le brief de 7 h 30 → tâches Todoist
launchd/install.sh
launchctl kickstart -k "gui/$(id -u)/com.bankread.brief-quotidien"   # essai immédiat

El caso BoursoBank, en concreto

Es el banco contra el que se ha escrito este repositorio, así que esto es lo que cabe esperar y no una generalidad. Otro banco se comportará de otro modo — and the one with the bankread banks la que manda, no this archivo:

  • ~90 días de historial, no más. Las dels mensuales — alquiler, luz, domiciliación de impuestos — salen para leer la primera lectura: tarifa de tres. La anualidad de espera a que el registro vaya acumulando (ver rand).

  • La validación pasa por la app BoursoBank (autenticación fuerte DSP2). El camino bankread link abre el sitio, y el teléfono suena. Así que hay que tenerlo a mano, y volver a hacer este paso cada 90 días.

  • No confiar en el agregador Wicount 660. BoursoBank ya agrega el poder de la Caisse d'Épargne y envía alertas sobre él, pero la DSP2 da acceso solo a las cuentas atadas por el banco consultado, no que agrega. El de la caja de ahorros necesita, por tanto, su propio bankread, form con su propio consent de 90 días. (A barredor of this connection: si las cuentas externas no aparecen en el tour, mejor.)

  • Las cuentas conjuntas se eligen en la pantalla de consent del banco. No marcar más que lo que sigue de verdad: todo coin se va al registro de toursi, y el registro de no se olvida.

bankread banks bourso da el nombre exacto — en Enable Banking el banco se identifica por la SULetra de alifuNTE y el país, no por un parámetro técnico — y la duración máxima de consentimiento que concede ese banco. Es ese valor el que tuvo la validez, no este archivo.

El link va seguido del cierre de la cuenta de oro: el históral de completo no se sirve solamente dentro de la hora siguiente a la firma; luego el banco vuelve a 90 días consecutivos. No interrumpir esto paso. a la renovación siguiente, de tres a seis meses.

Los comandos

bankread doctor

lo que funciona, lo que va a fallar, y cuándo. Ninguna llamada — un diagnostico que consume cuota es un diagnóstico que nadie quiere ya.

bankread balances

los saltos, con su antigüedad

bankread upcoming

los vencimientos detectados y su próxima vez por

bankread project

el cruce: saldo menos los vencimientos que vienen, día a día

bankread tx

las últimas operaciones

bankread json

todo de una vez, para un script

bankread demo

lo que se obtiene, sobre una cuenta FICTICIA — sin banco, sin plaza

bankread mcp

servidor MCP sobre Stdio, seis herramientas de lectura — para Claude o cualquier otro cliente

Códigos de salida: 0 todo bien, 1 hay algo que mirar, 2 fallo grave, para que launchd y los scripts de destino se principien.

Hacer que una IA lea las cuentas

claude mcp add bankread -s user -- "$PWD/bankread" mcp

O sin el clon del todo, como se distribuye cualquier servidor MCP:

{
  "mcpServers": {
    "bankread": {
      "command": "uvx",
      "args": ["--from", "git+https://github.com/Beennnn/openbanking-mcp", "bankread", "mcp"]
    }
  }
}

MCP es un protocol abierto y bankreadlib/m.py es JSON-RPC escrito a mano: de despliegue, ningún token, ninguna quedada. El mismo servidor se declara de la misma manera en las demás restantes clotes MCP, y bankread json sirve para eso que no se por donde. Todo el conjunto (incluido cómo continuar sin él por completo) en docs/integration.md.

Dos límites pagados por adelantado, no de redescubrir

Cuatro llamadas por día y cuenta. La mayoría de las entidades limitan a cuatro llamadas por día y por cuenta el proceso en background. Cuatro. No es unlíquido que se acerque, es un límite que se alcanza en una mañana de de= deses. De ahí el caché que no es comfort: sin él llegarás el reco del mañana, a una mañana y una mañana. A y, --refresh, que es un apuesta. ... **

El límite se cae cuando un usuario está realmente frente a una pantalla, como un encabezado PSUWO error ante el banco. bankread solo lo envía si la orden tiene un terminal: el beginning de las 7h30 no lo tiene, así que mantiene el límite. Es la marca de un banco, no un lugar de rendimiento.

Un histórico corto hace una proyección OPTIMISTA, no incompleta. No todas las asiáticas dan trece meses — BoursoBank da unos ~90 días.200 días, bi una que parece una falta (impuesto de bienes, seguro, tasas) no ha llegado a verdos veces, así que no existe para el detector, así que la trayectoria que se anuncia es mejor que la real. Es que es el único lugar en el que mendo, equivocarse cuesta dinero, and upcoming, project y doctor lo dicen con todas las letras.

Y sobre todo, es por eso que ledger.py acumula en lugar de poner en caché. El primer borrador (2026-08-20, por la mañana) guardaba una instantánea: cada lectura reemplazaba a la anterior. Con un banco a 90 días, eso hacía que un vencimiento anual no fuera «aún no detectado» sino indetectable de por vida — todo lo que superaba el trimestre desaparecía de la API y de la caché al mismo tiempo. El registro funde cada lectura en un archivo duradero; al cabo de un año de informes, bankread conoce 365 días allí donde el banco solo muestra 90, y el impuesto predial aparece en su segundo paso. bankread doctor muestra la cuenta atrás.

La regla del depósito, aplicada a un saldo

Ninguna línea verde que no haya sido observada.

Toda respuesta de read.py lleva un campo etat:

etat

lo que significa

observe

leído al instante, o hace bastante poco como para seguir siendo verdadero

ancien

servido desde la caché, con su edad en claro — para leer, no para creer

inconnu

no tenemos nada lo bastante fresco como para afirmar nada

Nunca un saldo desnudo. Un solde: null, etat: "inconnu" no es una cuenta a cero, y es la peor lectura posible de una cifra que falta — las descripciones de las herramientas MCP lo repiten al modelo antes de que llame, para que no lo aprenda equivocándose.

Misma disciplina con las predicciones: un vencimiento visto dos veces no es un vencimiento, es una coincidencia. Sale marcado confidence: "faible" y no entra en la proyección. Tres pasos regulares, eso es un hecho.

Y con los ingresos: proyectar solo las salidas da una trayectoria que se hunde siempre, por lo tanto una alarma todos los días, y por lo tanto más alarma en absoluto al cabo de una semana. El salario y las asignaciones se detectan por el mismo camino y se cuentan en el otro sentido. test_le_salaire_qui_arrive_avant_evite_la_fausse_alerte conserva ese caso.

El informe de las 7:30

brief/brief.md es el texto que Claude ejecuta cada mañana, lanzado por launchd mediante brief/run-brief. Lee Gmail y el banco, y su única salida útil es un pequeño número de tareas de Todoist etiquetadas auto-brief.

El silencio es un éxito. Una mañana sin nada que señalar produce cero tareas — no hay resumen diario, no hay «nada que señalar». Solo cinco motivos crean una tarea, y el cuaderno ~/.config/bankread/brief-vu.json impide que un mismo paquete retrasado genere una por día durante dos semanas.

run-brief pasa una lista CERRADA de herramientas a claude --allowedTools. Ninguna herramienta de escritura de Gmail figura en ella: el informe lee el correo, nunca responde. Y nada se deja a una solicitud de autorización, ya que nadie está delante de la pantalla para responder a las 7:30.

El modelo llamado es un piloto reemplazable (brief/agents/), no una llamada fija: BANKREAD_AGENT=aucun brief/run-brief hace funcionar el informe sin ninguna IA, y la proyección cae igualmente en el diario. La lectura de las cuentas nunca ha necesitado un modelo — ver docs/integration.md.

launchd/install.sh solo instala a ese agente. Un script de instalación que hace más de lo que su nombre dice termina reinstalando algo muerto, y uno se pasa la tarde buscando por qué dos ejemplares están en marcha.

Cambiar de proveedor

El acoplamiento es fino, y está verificado por una prueba (test_le_contrat_tient_en_deux_methodes):

¿depende del proveedor?

bankreadlib/enablebanking.py, bankreadlib/gocardless.py

— tokens, cuotas, HTTP, recorrido de consentimiento

bankreadlib/provider.py

él elige cuál cargar, y escribe el contrato en Protocol

bankread (subcomandos banks / link)

sí, parcialmente — el recorrido de vinculación

ledger.py, recurring.py, read.py, mcp.py, brief/, launchd/

no, y ni una sola importación directa más

Para conectar un tercer proveedor, basta con un módulo que exponga esos dos métodos — el Protocol de provider.py los declara, y provider.charger() hace la elección:

balances(account_id)                          -> {"balances": [...]}
transactions(account_id, date_from, date_to)  -> {"transactions": {"booked": [...]}}

El formato esperado es el del Grupo de Berlín: balanceType / balanceAmount para los saldos, bookingDate y transactionAmount firmado para las operaciones. Si el proveedor habla otra cosa, la traducción se paga en su cliente y en ningún otro lugar — ver enablebanking._operation(), que devuelve su signo a unos importes que Enable Banking entrega siempre positivos.

Tres trampas encontradas al escribir el cliente de Enable Banking, para no redescubrirlas:

  • el signo de los importes se lleva al lado del importe (credit_debit_indicator), no dentro. Copiarlo tal cual haría contar cada domiciliación como un ingreso;

  • el historial completo solo dura una hora después de la firma (ver más arriba);

  • la duración del consentimiento otorgado puede ser más corta que la solicitada: es la respuesta del banco lo que se registra, si no doctor anuncia un consentimiento válido dos meses después de su muerte.

Pruebas

python3 test_bankread.py

51 pruebas, solo stdlib, sin red. Verifican sobre todo los casos en los que el código debe callarse: dos ocurrencias no hacen un vencimiento, una caché de treinta horas ya no es un saldo, no se proyecta sobre un saldo nunca observado. Una detección que se equivoca de fecha no se cae — anuncia los impuestos el día 12 en lugar del 15, con la misma seguridad.

Lo que no está versionado

~/.config/bankread/state.json (cuentas vinculadas, tokens, fechas de consentimiento) y ~/.cache/bankread/ — específicos de esta máquina y de este consentimiento. Las credenciales del proveedor no están en ningún lugar del disco: están en el llavero de macOS, servicio bankread-enablebanking (o bankread-gocardless), clave privada RSA incluida.

⚠️ ~/.local/share/bankread/ledger/ es aparte: es el registro, y no se purga. Lo que contiene, el banco ya no puede volver a darlo — más allá de 90 días, lo ha olvidado. Suprimirlo junto con la caché es volver a empezar con tres meses de memoria. Está guardado en los datos y no en la caché precisamente para hacer difícil esa confusión. Contrapartida asumida: es un año de operaciones bancarias en claro en el disco, en 0600.

Install Server
A
license - permissive license
A
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

  • F
    license
    Not graded
    quality
    D
    maintenance
    An MCP server that exposes Enable Banking API tools for interacting with bank accounts through Open Banking. It enables users to authenticate sessions, list accounts, and fetch transaction history or balances via a secure self-hosted server.
    2
  • A
    license
    Not graded
    quality
    B
    maintenance
    MCP server that turns bank transactions into a financial digest including cash-flow forecast, spending breakdown, fee detection, and receipt reconciliation, exposing deterministic engines as JSON-RPC tools.
    Apache 2.0
  • F
    license
    Not graded
    quality
    B
    maintenance
    MCP server for personal finance management. Enables natural language expense logging, budgeting, recurring charge detection, and statement import with deterministic local calculations.
  • F
    license
    Not graded
    quality
    B
    maintenance
    MCP server for personal finance via Open Finance, consolidating accounts and cards and answering spending questions with aggregated numbers. Provides tools for category spending, recurring subscriptions, budgets, card bills, and installment forecasts, with data stored locally in an encrypted SQLite database.
    1

View all related MCP servers

Related MCP Connectors

  • Hosted remote MCP server for YNAB on Cloudflare Workers with OAuth

  • Hosted MCP server for Mini Accountant: invoices, expenses, customers, analytics, tax estimates.

  • MCP server for Withings health data — sleep, activity, heart, and body metrics.

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/Beennnn/openbanking-mcp'

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