bankmcp README

The project's README from github.com/noskillish/bankmcp. As one markdown file: README.md.

BankMCP™

Your AI now reads your bank. Ask it anything about your accounts. Read-only, self-hosted, one user. Standard MCP; tested with Claude and Ollama.

BankMCP™ is not a bank. It is a small open-source server you host yourself (npm package bankmcp). It connects to your banks through Enable Banking, which wraps 2,700+ European banks in one PSD2 API, and exposes them to any MCP client as a connector. Read-only, no payments, no third party holding your data.

"Has the invoice from Acme been paid?" · "What did we spend on groceries in August?" · "Which subscriptions am I paying for, and what do they cost per year?" · "Tell me when my balance drops below 5,000."

How it works

Your assistant ──OAuth──▶ your BankMCP™ server ──JWT──▶ Enable Banking ──PSD2──▶ your bank

Setup

Two ways to run it. Both need a free Enable Banking account and about ten minutes.

On your own machine

The server and its state live on your computer, and no AI vendor or app maker sees your data. The bank connection is not on your computer: it goes through Enable Banking, as described above.

Requires Node 24 or newer. Add BankMCP™ to your client:

Claude Code:

claude mcp add bankmcp -- npx -y bankmcp

Claude Desktop: download bankmcp.mcpb and open it; Claude Desktop installs it as an extension. Or add it by hand in claude_desktop_config.json:

{ "mcpServers": { "bankmcp": { "command": "npx", "args": ["-y", "bankmcp"] } } }

Cursor and others: the same command, npx -y bankmcp, as a stdio server.

Then ask your assistant anything about your bank. It will answer with a localhost address. Open it: the setup page lists the values to register an application at Enable Banking, then takes the application id and the key file. Your browser will warn once about the certificate on localhost, which the server made for itself because Enable Banking requires https for the bank redirect. Continue past it. Say "connect my bank" and log in at your bank.

To avoid the warning altogether, use a certificate your browser already trusts: mkcert makes one with mkcert localhost 127.0.0.1; point TLS_CERT_PATH and TLS_KEY_PATH at the two files and the server uses them instead of generating its own. BankMCP™ itself does not touch your system's trust store.

State lives in ~/.bankmcp. Delete the folder to forget everything.

On a server

1. Deploy

Any container host works. The server needs a persistent volume at /data and a public https address; it asks you for everything else in the browser.

Railway: New Project, Deploy from GitHub repo, pick this repo. Add a volume mounted at /data and generate a domain (Settings, Networking, port 8080). The Dockerfile and railway.json are picked up automatically, and the server learns its own address from Railway.

Docker Compose on your own box: docker compose up -d, then put a TLS terminator in front (Caddy needs two lines: YOUR-HOST { reverse_proxy localhost:8080 }) and set BASE_URL to the public address. Fly.io works like Railway: volume at /data, the app name gives the address.

Open the address. A fresh server shows a setup page.

2. Register an Enable Banking application

The setup page lists the exact values Enable Banking's form asks for: the redirect URL, a description for the consent screen, and the privacy and terms URLs, all pointing at your server. At https://enablebanking.com/cp/applications create an application with them:

3. Finish setup

Back on the setup page: paste the application id, choose the .pem file, pick a password of twelve characters or more. Everything is stored on the volume, and the page turns into a status page showing the connector URL for your assistant.

Prefer configuration by environment? Set these and the setup page does not appears:

Variable Value
EB_APP_ID the application id
EB_PRIVATE_KEY the .pem contents, base64: base64 -i app.pem | tr -d '\n'
ADMIN_PASSWORD_HASH output of npm run hash-password (or set ADMIN_PASSWORD)
BASE_URL https://YOUR-HOST (Railway and Fly set this for you)
DEFAULT_COUNTRY your country code, e.g. DK
APP_NAME optional, the name shown on the sign-in and status pages (default BankMCP™)

Optional: NOTIFY_WEBHOOK_URL for watch notifications and sign-in alerts (a Slack incoming webhook works). Full list in .env.example. npm run check verifies a configuration from a terminal.

4. Add the connector in your assistant

In claude.ai (or the desktop app): Settings → Connectors → Add custom connector. Name it BankMCP™, paste https://YOUR-HOST/mcp, save, then click Connect. Your server shows a password page; enter the admin password. That is the only login you will do.

In Claude Code:

claude mcp add --transport http bank https://YOUR-HOST/mcp

then run /mcp inside Claude Code to sign in.

Other MCP clients (ChatGPT, Mistral Le Chat, Cursor, VS Code) work the same way: add the URL as a remote MCP server, sign in with the password. Tested with Claude, Claude Code and Ollama; the others follow the same standard. A client whose domain is not in ALLOWED_REDIRECT_HOSTS needs adding there.

5. Connect your bank

In your assistant, say "connect my bank" (or use the connect-bank prompt). It looks up your bank, gives you a link, you log in at the bank and approve, and the accounts appear. Consents last up to 180 days; you are told when one is about to expire and the same conversation renews it.

Give accounts labels ("Everyday", "Joint expenses", "Mortgage") when it suggests them. Every tool accepts labels instead of ids.

Going live with your own accounts

Enable Banking's production environment normally requires a contract, but it has a restricted mode for accessing your own accounts, explicitly allowed for individual non-commercial use. After registering a Production application:

  1. On the (Inactive) application click Activate by linking accounts.
  2. Log in at your bank and approve. Repeat for each bank you want.
  3. The application becomes active and the API returns only the accounts you linked this way.

Read the Restriction of Use section of Enable Banking's Terms of Service before you rely on it: restricted mode is for your own accounts, not for offering a service to others. This project does not change those terms.

What you get

Tools (all read-only):

Tool What it does
list_banks, start_consent, consent_status, disconnect_bank connect and manage banks
list_accounts, set_account_label accounts with booked balances; your own names for them
get_balances booked and available balance for one account
get_transactions signed amounts, one counterparty, one description; paginated
create_watch, list_watches, delete_watch, check_watches background rules with webhook notifications

Prompts: connect-bank, monthly-summary, build-budget, savings-scan, subscription-audit, unusual-transactions.

Watches run on the server. Rules: balance below or above an amount, a single debit over an amount, an incoming or outgoing payment matching a name, and "tell me if this payment has not arrived by this date". Accounts are checked at most four times a day, the PSD2 limit for unattended access. Notifications go to NOTIFY_WEBHOOK_URL as a Slack message or a JSON POST.

Enable Banking's own webhooks cover payment initiation only, so account data is polled. There is no way around that under PSD2.

Claude Code plugin

The repository is also a Claude Code plugin marketplace. The bank plugin brings three skills: /bank:setup walks you through installing BankMCP™ on your machine, /bank:deploy through hosting it, and bank encodes how to work with the data: an account map, categorisation rules, the monthly review format and when to create watches.

Point it at your server, then install:

export OPENBANK_URL=https://YOUR-HOST/mcp   # put this in your shell profile
/plugin marketplace add noskillish/bankmcp
/plugin install bank@bank

Then /mcp, select bank, Authenticate, and enter your password. No organisation admin is involved; plugins are per user.

The skill lives at plugin/skills/bank/SKILL.md. Copy it into your own skills to fill in the account map and your merchant rules. The server stays generic; your rules stay yours.

Local models (experimental)

The server does not care which model asks. npm run chat bridges an Ollama model to the same tools over stdio, so no AI vendor sees a transaction:

ollama pull qwen3:8b
npm run chat -- "what's my balance?"

Measured on a MacBook Air with 24 GB: correct per-account balances, a wrong total, ten minutes per answer. An 8B model is not yet trustworthy with money; a 30B-class model on a machine with a real GPU is where it gets useful. Any MCP client with tool calling (LM Studio, Goose, Jan) can also point at node src/stdio.ts directly. Enable Banking still sits between you and the bank either way; that part is regulated and unavoidable.

Security notes

Commands

npm start              # http server (reads env from the environment)
npm run dev            # same, with reload and .env
npm run check          # verify config and the Enable Banking application
npm run hash-password  # produce ADMIN_PASSWORD_HASH
npm run watch -- --force   # run all watches once, print what fired
npm test               # unit tests (node:test)
npm run typecheck
sh scripts/build-mcpb.sh   # Claude Desktop bundle → dist/bankmcp.mcpb

Requires Node 24 or newer (runs TypeScript directly, no build step).

Layout

src/stdio.ts          entry point for npx bankmcp: stdio server plus the localhost https side
src/server.ts         entry point for a hosted deployment: OAuth, /mcp, callback, status page
src/app.ts            the Express app shared by both entry points
src/local.ts          localhost https server and self-signed certificate for local mode
src/mcp.ts            McpServer factory (tools, prompts, instructions)
src/tools.ts          the MCP tools
src/prompts.ts        the MCP prompts
src/watcher.ts        background rule checks and notifications
src/auth.ts           single-user OAuth provider
src/setup.ts          first-run setup: validates and stores id, key and password
src/pages.ts          the HTML pages: setup, sign-in, connected, status, privacy, terms
src/config.ts         environment and data-directory configuration
src/enablebanking.ts  JWT signing and a thin typed API client
src/store.ts          the JSON state file
src/data.ts           shaping balances and transactions for an assistant
src/cli.ts            check, hash-password, watch
bin/bankmcp.js        the npx entry; dispatches to stdio or cli
scripts/              build-mcpb.sh (Claude Desktop bundle), local-chat.ts (Ollama bridge)
plugin/               Claude Code plugin: setup and deploy skills, bank skill
docs/                 landing page (GitHub Pages, bankmcp.dk)

What this is, and is not

BankMCP™ is software, not a service. There is no hosted BankMCP™, no account to sign up for, and nobody but you handles your server, your key or your bank consents. Each person who uses it deploys their own copy and is the sole operator of that copy: they register their own Enable Banking application, accept Enable Banking's terms themselves, and are responsible for their own hosting, password and security.

The authors publish the code and nothing else. They do not run any instance for others, receive no data, and are not affiliated with Enable Banking, Anthropic or any bank. BankMCP™ is not a bank, does not hold money, and gives no financial advice.

Use at your own risk. If you deploy it, you own that deployment and its security. The software is provided as is, without warranty of any kind, and the authors accept no liability for how it is used or for any loss that follows. MIT licence below.

License

MIT

bankmcp (noskillish/bankmcp)

Searching Database…

这是什么?BankMCP 是一个自托管、只读的 MCP 服务器,让你的 AI 助手(Claude、ChatGPT、Cursor 等)通过 Enable Banking PSD2 API 查询你自己的银行账户,该 API 覆盖 2,700 多家欧洲银行。
这是我自己运行的 MCP 服务器,还是托管服务?它是你自己部署的软件:一个 npm 包(bankmcp),作为标准 MCP 服务器运行,可以在本地通过 npx 运行,也可以部署到你自己的容器主机上。作者不运营任何托管的 BankMCP 实例。
怎么让它运行起来?本地使用时,以 stdio MCP 服务器形式运行 'npx -y bankmcp',并把它添加到 Claude Desktop、Claude Code 或 Cursor。需要远程访问(claude.ai、手机)时,把 Docker 镜像部署到 Railway、Fly.io 或 Docker Compose,配置持久卷和公网 HTTPS 地址,然后在浏览器中完成设置。
连接银行之前需要准备什么?需要一个免费的 Enable Banking 账号来注册应用(会给你一个应用 ID 和 .pem 私钥)、运行服务器的 Node 24 或更新版本,以及你自己的网上银行登录来批准授权。
它能付款或转移资金吗?不能,它是严格的只读。没有任何支付工具,因为那需要持牌 PISP 和不同的安全模型;账户数据最多每天轮询四次而不是推送,因为 Enable Banking 的 webhook 只覆盖支付发起。
Enable Banking 或 BankMCP 作者能看到我的交易吗?你自己的服务器保存银行授权和密钥,不把余额或交易写入磁盘,也不发送遥测数据;Enable Banking 作为持牌 PSD2 中介只透传你的数据而不存储,项目作者不运行任何实例,也完全收不到任何数据。
我实际上能问银行助手些什么?比如某张发票付了没有、上个月在食品杂货上花了多少、订阅了哪些服务及其年费,或者余额低于某个阈值时发出提醒。服务器提供 getbalances、gettransactions 和 createwatch 等工具来支持这些。
Claude Code 插件有什么特别之处?有,它添加了三个技能(/bank:setup、/bank:deploy 和 bank),一步步指导你安装 BankMCP、部署托管,并按照账户映射和分类规则做月度复盘。
通过 Ollama 使用本地模型效果如何?仅处于实验阶段。在一台 24GB 内存的 MacBook Air 上,8B 模型能算对各账户的余额但总数出错,每次回答约需十分钟。作者建议在真正的 GPU 硬件上用 30B 级别的模型,再把它用于和钱相关的事情。
如果想撤销访问权限怎么办?更改管理员密码会让所有已连接的客户端立即登出;你还可以更进一步,在银行官网上撤销银行授权,或者直接删除状态文件让一切归零。
Creator
noskillish
Size
0.7 MB
Stars
288
Age
1mo
Commits · 90 Days