openbanking-mcp
openbanking-mcp — leer sus cuentas y avisar ANTES
El repositorio se llama
openbanking-mcp, el comando se llamabankread. 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, ybankread doctorsuena mejor queopenbanking-mcp doctor. Las rutas de configuración (~/.config/bankread, llaverobankread-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.pyya 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 endocs/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
catinfeliz, un madeja hacia un NAS. Para Enable Banking, esto incluye la clave privada RSA:bankread secrets --setfrontla lee, la guarda y recuerda que hay que borrar el.pemdescargado;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.
doctorlo 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 demoUna 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 # à demeureEl 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édiatEl 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 linkabre 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
| 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. |
| los saltos, con su antigüedad |
| los vencimientos detectados y su próxima vez por |
| el cruce: saldo menos los vencimientos que vienen, día a día |
| las últimas operaciones |
| todo de una vez, para un script |
| lo que se obtiene, sobre una cuenta FICTICIA — sin banco, sin plaza |
| 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" mcpO 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:
| lo que significa |
| leído al instante, o hace bastante poco como para seguir siendo verdadero |
| servido desde la caché, con su edad en claro — para leer, no para creer |
| 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? | |
| sí — tokens, cuotas, HTTP, recorrido de consentimiento |
| él elige cuál cargar, y escribe el contrato en |
| sí, parcialmente — el recorrido de vinculación |
| 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
doctoranuncia un consentimiento válido dos meses después de su muerte.
Pruebas
python3 test_bankread.py51 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.
Maintenance
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
- FlicenseNot gradedqualityDmaintenanceAn 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
- AlicenseNot gradedqualityBmaintenanceMCP 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
- FlicenseNot gradedqualityBmaintenanceMCP server for personal finance management. Enables natural language expense logging, budgeting, recurring charge detection, and statement import with deterministic local calculations.
- FlicenseNot gradedqualityBmaintenanceMCP 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
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.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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