关于 BankMCP™
BankMCP™ 是面向个人的开源自托管银行账户 MCP 服务,通过 Enable Banking 连接欧洲银行,并向 MCP 客户端提供只读账户数据。它不存储余额或交易,也不支持付款。
主要功能
- 01读取账户余额与交易
- 02按商户或发票搜索交易
- 03生成月度收支摘要
- 04设置余额与付款监控
- 05提供银行连接提示词
适用场景
- 01查询账户余额和可用余额
- 02核对发票是否到账
- 03按月查看支出与收入
- 04在余额触及阈值时接收通知
MCP 相关
BankMCP™ 将账户信息和只读工具提供给 MCP 客户端。客户端可通过本地 stdio 或远程 HTTP 连接,并使用提示词发起银行连接。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
BankMCP™
让 AI 读取你的银行账户。 询问它任何有关你账户的事情。只读、可自托管、供一位用户使用。采用标准 MCP;已通过 Claude 和 Ollama 测试。
BankMCP™ 不是银行,而是一个由你自行托管的小型开源服务
(npm 包 bankmcp)。它通过 Enable Banking 连接到你的银行。Enable Banking 通过一个 PSD2 API 接入了 2,700 多家欧洲银行,并将它们作为连接器提供给任何 MCP 客户端。只读、不支持支付,也没有第三方保管你的数据。
“Acme 的发票付了吗?”·“我们 8 月在食品杂货上花了多少钱?”·“我在付费订阅哪些服务?每年要花多少钱?”·“余额低于 5,000 时提醒我。”
工作原理
Your assistant ──OAuth──▶ your BankMCP™ server ──JWT──▶ Enable Banking ──PSD2──▶ your bank
- 你的助手(Claude、ChatGPT、Cursor 或任何 MCP 客户端)将你的服务用作连接器。你只需使用密码登录一次;之后由令牌处理一切。
- 你的服务保存 Enable Banking 应用密钥、银行授权和你的账户 ID。它不存储余额或交易记录,也不发送遥测数据。
- Enable Banking 是连接你的服务与银行的持牌服务提供商。你查询的每笔余额和交易都会经过它的服务器,再到达你的服务;它不会存储这些数据,也看不到你的银行凭据,因为你是在银行自己的网站上登录的。PSD2 的运作方式需要经过这一环节,而这也是整个链路中唯一不在你设备上的部分。
设置
有两种运行方式。两种方式都需要一个免费的 Enable Banking 账户,设置约需十分钟。
- 在自己的设备上运行,适用于 Claude Desktop、Claude Code、Cursor 和其他桌面 MCP 客户端。无需部署,也无需密码。
- 在小型服务上运行,适用于你想在 claude.ai 或手机上使用的情况。
在自己的设备上运行
服务及其状态数据都保存在你的计算机上,AI 供应商或应用开发者都看不到你的数据。银行连接不在你的计算机上,而是通过 Enable Banking 建立,如上所述。
需要 Node 24 或更高版本。将 BankMCP™ 添加到你的客户端:
Claude Code:
claude mcp add bankmcp -- npx -y bankmcp
Claude Desktop:下载
bankmcp.mcpb
并打开;Claude Desktop 会将其安装为扩展。也可以在 claude_desktop_config.json 中手动添加:
{ "mcpServers": { "bankmcp": { "command": "npx", "args": ["-y", "bankmcp"] } } }
Cursor 和其他客户端:使用相同的命令 npx -y bankmcp,作为 stdio 服务运行。
然后向你的助手询问任何有关银行账户的事情。它会提供一个 localhost 地址。打开该地址:设置页面会列出在 Enable Banking 注册应用所需的信息,随后让你填写应用 ID 并上传密钥文件。浏览器会针对 localhost 的证书警告一次;由于 Enable Banking 要求银行重定向使用 https,因此服务为自己生成了该证书。继续访问即可。然后说“连接我的银行”,并登录你的银行账户。
如需完全避免警告,可使用浏览器已信任的证书:mkcert 可通过 mkcert localhost 127.0.0.1 生成证书;将 TLS_CERT_PATH 和 TLS_KEY_PATH 指向这两个文件,服务便会使用它们,而不是自行生成证书。BankMCP™ 本身不会修改系统的信任存储。
状态数据保存在 ~/.bankmcp 中。删除该文件夹即可清除所有数据。
在服务上运行
1. 部署
任何容器托管平台都可以。服务需要在 /data 挂载持久化卷,
并拥有公开的 https 地址;其他配置都可以在浏览器中完成。
每次发布都会发布一个预构建镜像:
ghcr.io/noskillish/bankmcp(由 GitHub Actions
根据带标签的源代码构建,支持 linux/amd64 和 linux/arm64)。
Railway:
会部署已发布的镜像,并配置挂载到
/data 的卷和域名,无需填写任何内容。
也可以手动操作:新建项目,选择从 GitHub 仓库部署,选中此仓库,
添加挂载到 /data 的卷并生成域名(Settings、
Networking、端口 8080)。服务会从 Railway 获取自己的地址。
Fly.io: 在检出代码后运行三个命令,使用 fly.toml:
fly launch --copy-config --no-deploy # pick an app name and region
fly volumes create data --size 1
fly deploy
Render:
使用 render.yaml。Render 的持久磁盘需要付费实例。
在自己的设备上运行 Docker:
docker run -d --name bankmcp --restart unless-stopped \
-p 8080:8080 -v bankmcp-data:/data ghcr.io/noskillish/bankmcp:latest
或者使用 compose.yaml 运行 docker compose up -d。然后在前面配置 TLS
终止代理(Caddy 只需两行:
YOUR-HOST { reverse_proxy localhost:8080 }),并将 BASE_URL 设置为
公开地址。默认情况下,服务会绑定所有网络接口。如果代理在同一台设备上运行,
请将 BIND_HOST=127.0.0.1,这样本地网络中的其他设备就无法访问登录和设置页面。
打开该地址。全新服务会显示设置页面。
2. 注册 Enable Banking 应用
设置页面可以代你完成此操作。输入 Enable Banking 账户的邮箱(或你想用来创建账户的邮箱), 然后点击 给我发送登录链接。Enable Banking 会向你发送一次性链接;在 下一页粘贴该链接。服务会使用该链接登录一次,创建包含正确重定向地址和 策略地址的应用,生成密钥对并保存应用 ID 和密钥。登录信息不会保留。在本地服务上, 点击链接即可完成相同操作,无需粘贴。
也可以手动操作:设置页面会列出 Enable Banking 表单所需的确切值,并附带复制按钮。在
https://enablebanking.com/cp/applications 创建应用,选中 generate private key,
然后保存。系统会下载一个 .pem 文件;这就是密钥。在设置页面粘贴应用 ID,
并选择 .pem 文件。保存任何内容之前,系统都会先向 Enable Banking 验证 ID 和密钥。
无论哪种方式:真实账户请选择 Production,测试数据请选择 Sandbox。 用于自有账户的生产应用需要在 Control Panel 中通过 Activate by linking accounts 激活一次;请参阅下文的 上线。
3. 完成设置
设置一个不少于 12 个字符的密码。随后会显示 Ready 页面,说明已检查的内容: 应用、重定向 URL 是否已注册以及是否已激活,还有可供复制的连接器地址。
希望通过环境配置?设置以下变量后,设置页面就不会出现:
4. 在助手中添加连接器
在 claude.ai(或桌面应用)中:设置 → 连接器 → 添加自定义
连接器。将其命名为 BankMCP™,粘贴 https://YOUR-HOST/mcp,保存,然后点击
连接。服务会显示密码页面;输入管理员密码。这是唯一一次需要登录。
在 Claude Code 中:
claude mcp add --transport http bank https://YOUR-HOST/mcp
然后在 Claude Code 中运行 /mcp 进行登录。
其他 MCP 客户端(ChatGPT、Mistral Le Chat、Cursor、VS Code)的操作方式相同:
将 URL 添加为远程 MCP 服务,并使用密码登录。已通过 Claude、Claude Code 和
Ollama 测试;其他客户端也遵循同一标准。如果客户端的域名不在 ALLOWED_REDIRECT_HOSTS
中,需要将其添加进去。
5. 连接你的银行
在助手中说 “连接我的银行”(或使用 connect-bank 提示词)。它
会查找你的银行并提供链接,你在银行登录并授权后,账户就会显示出来。授权
最长有效期为 180 天;授权即将到期时会通知你,并可在同一段对话中续期。
在它建议时为账户添加标签(“日常开支”“共同开支”“房贷”)。每个工具都接受标签,而非 ID。
使用你自己的账户上线
Enable Banking 的生产环境通常需要签订合同,但它提供了一种受限模式, 明确允许个人非商业用途访问自己的账户。注册 Production 应用后:
- 在(Inactive)应用上点击 Activate by linking accounts。
- 在银行登录并授权。对你需要使用的每家银行重复此操作。
- 应用会变为 active,API 仅返回你通过这种方式关联的账户。
在使用前,请阅读 Enable Banking 服务条款中的使用限制一节: 受限模式仅适用于你自己的账户,不可用于向他人提供服务。本项目不会更改这些条款。
你将获得
工具(均为只读):
| 工具 | 功能 |
|---|---|
list_banks、start_consent、consent_status、disconnect_bank | 连接和管理银行 |
list_accounts、set_account_label | 查看账户及已入账余额;为账户设置自定义名称 |
get_balances | 查看单个账户的已入账余额和可用余额 |
get_transactions | 查看带正负号的金额、一个交易对手方和一条描述;支持分页 |
search_transactions | 在所有账户中查找商户或发票编号;匹配完整词语 |
monthly_summary | 按月汇总收入和支出,不计入自有账户之间的转账 |
create_watch、list_watches、delete_watch、check_watches | 创建带 Webhook 通知的后台规则 |
attest_account | 默认关闭;以签名形式确认某个 IBAN 是否属于你,供你向其证明账户归属的第三方使用——详见 ATTESTATION.md |
提示词:connect-bank、monthly-summary、build-budget、
savings-scan、subscription-audit、unusual-transactions。
监控规则在服务端运行。规则包括:余额低于或高于某个金额、单笔借记超过某个金额、
匹配指定名称的转入或转出款项,以及“如果截至某日期仍未收到这笔款项,请告诉我”。
每个账户每天最多检查四次,这是无人值守访问的 PSD2 限制。
通知会以 Slack 消息或 JSON POST 的形式发送到 NOTIFY_WEBHOOK_URL。
Enable Banking 自身的 Webhook 仅适用于支付发起,因此账户数据通过轮询获取。 在 PSD2 规定下,没有其他办法。
Claude Code 插件
此代码库也属于 Claude Code 插件市场。bank 插件提供三项技能:/bank:setup 会引导你在
自己的设备上安装 BankMCP™,/bank:deploy 会引导你托管它,而 bank 则说明如何处理
这些数据:账户映射、分类规则、月度审查格式,以及何时创建监控规则。
将其指向你的服务端,然后安装:
export OPENBANK_URL=https://YOUR-HOST/mcp # put this in your shell profile
/plugin marketplace add noskillish/bankmcp
/plugin install bank@bank
然后运行 /mcp,选择 bank,点击 Authenticate,并输入密码。无需组织管理员参与;
插件按用户安装。
技能文件位于 plugin/skills/bank/SKILL.md。 将其复制到你自己的技能中,填写账户映射和商户规则。服务端保持通用; 规则由你自己掌控。
本地模型(实验性)
服务器不关心发起请求的是哪个模型。npm run chat 会通过标准输入/输出,将 Ollama 模型接入同一组工具,因此不会有 AI 供应商看到任何交易:
ollama pull qwen3:8b
npm run chat -- "what's my balance?"
在一台配备 24 GB 内存的 MacBook Air 上测得:每个账户的余额正确,但总额错误,每次回答耗时十分钟。8B 模型目前还不能放心地用于处理资金;在配备独立 GPU 的机器上运行 30B 级模型,才真正有用。任何支持工具调用的 MCP 客户端(LM Studio、Goose、Jan)也可以直接连接到 node src/stdio.ts。无论采用哪种方式,Enable Banking 始终介于你和银行之间;这一环节受监管,无法绕开。
安全说明
- 此服务器是完整的 OAuth 2.1 授权服务器,只有一个用户。发现、动态客户端注册和 PKCE 由 MCP SDK 提供;令牌以哈希形式存储;输错密码五次会锁定该地址 15 分钟,而所有地址累计输错二十次会锁定所有人的登录功能 15 分钟。已连接的助手在锁定期间仍可继续工作。
- 状态保存在
DATA_DIR中的一个 JSON 文件里:包括授权、账户 ID、监控项(以及已触发通知的交易 ID)和 OAuth 令牌。余额和交易记录不会写入磁盘。你的助手会像任何聊天应用一样保留对话,而监控通知会将匹配的交易发送到你的 webhook。如果不想重新授权,请备份该文件;删除该文件即可清除所有数据。 - 只有重定向回已知 MCP 客户端域名(Claude、ChatGPT、Mistral、Cursor、VS Code)或 localhost 的客户端才能注册(
ALLOWED_REDIRECT_HOSTS),这可以防止钓鱼链接将你的登录信息转发到其他网站。要使用不在列表中的客户端?请添加其域名。登录页面也会显示你将被重定向回的主机名。 - 通知只会发送到一个目标:由运营者在主机上设置的
NOTIFY_WEBHOOK_URL,且必须使用 https。监控项无法指定自己的 webhook,因此被诱导这样做的客户端或助手无法将交易数据发送到其他地址,或服务器网络内部的地址。 - 对于想查看代码的人,检查逻辑如下:每个
/mcp请求都会先在src/app.ts中通过requireBearerAuth检查,然后才会运行任何工具;令牌由src/auth.ts中的SingleUserProvider签发和验证,且会在completeLogin中通过密码检查。由于只有一个用户,有效令牌就是全部授权,工具不再进行额外的用户级检查。在本地模式(npx bankmcp)下没有 OAuth:你机器上的客户端通过标准输入/输出与服务器通信,而任何能在这台机器上运行进程的人都可以使用它。 - 交易描述和交易对方名称由他人填写,例如向你付款的人。服务器会告知助手应将这些内容视为数据,而非指令。但助手仍可能被这些内容误导。
- 任何知道管理员密码的人都能读取你的账户。请使用足够长的密码。每次成功登录都会记录日志;如果设置了
NOTIFY_WEBHOOK_URL,还会向你发送消息。未经你本人操作的登录就是警报。 - 忘记密码了?在主机上设置
ADMIN_PASSWORD(或ADMIN_PASSWORD_HASH)并重启;环境变量的值会覆盖初始设置时存储的值。 - 更改
ADMIN_PASSWORD_HASH(或ADMIN_PASSWORD)并重启,会将所有客户端登出。这就是紧急停用开关。进一步的措施是在银行撤销授权,或删除状态文件。 - 此处没有支付工具。支付需要持牌 PISP,并采用截然不同的安全模型,因此不在本项目范围内。
命令
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
npm run banks # refresh docs/banks/banks.json from Enable Banking's bank list
npm run site # build the subpages of the landing page into docs/
需要 Node 24 或更高版本(直接运行 TypeScript,无需构建步骤)。
目录结构
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), banks.ts and site.ts (landing subpages), local-chat.ts (Ollama bridge)
plugin/ Claude Code plugin: setup and deploy skills, bank skill
docs/ landing page (GitHub Pages, bankmcp.dk); docs/banks holds the bank list and its pages
它是什么,以及不是什么
BankMCP™ 是软件,不是服务。没有托管的 BankMCP™,无需注册账户,也没有任何人会代替你管理服务器、密钥或银行授权。每位使用者都会部署自己的副本,并独自运营该副本:自行注册 Enable Banking 应用,自行接受 Enable Banking 的条款,并自行负责托管、密码和安全。
作者仅发布代码,不提供其他任何内容。他们不为他人运行任何实例,不接收任何数据,也不隶属于 Enable Banking、Anthropic 或任何银行。BankMCP™ 不是银行,不持有资金,也不提供财务建议。
证明功能(ATTESTATION_ENABLED,默认关闭)不会改变上述任何一点。它不会增加支付发起功能,也不会扩大授权范围:底层的银行调用与 get_balances 已执行的余额读取相同;提出查询的第三方只能得知一个他们已知的 IBAN 对应的「是」或「否」。是否根据你的 Enable Banking 条款将这些信息分享给特定服务,由你作为运营者自行决定,正如这里的其他一切一样。
使用风险自负。 如果你部署它,该部署及其安全由你负责。本软件按原样提供,不附带任何形式的保证;对于软件的使用方式或由此造成的任何损失,作者概不承担责任。下文附有 MIT 许可证。
许可证
MIT
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。