关于 Enable Banking
Enable Banking 是面向欧洲银行账户的 MCP 服务,通过 Enable Banking 提供只读的交易记录与余额访问,不支持资金转移。它可管理账户授权、筛选交易并导出 CSV,授权需账户持有人批准。
主要功能
- 01查找支持的银行并管理授权
- 02列出账户和余额
- 03读取及筛选交易记录
- 04将交易记录导出为 CSV
- 05查看授权到期时间
适用场景
- 01汇总多个账户的收入或支出
- 02检查 EUR 账户可用余额
- 03按交易对象、方向或金额筛选流水
- 04为会计人员导出季度交易记录
MCP 相关
作为 MCP 服务,它向客户端提供银行列表、账户授权、账户、余额和交易记录工具。银行访问仅限读取;开始授权会请求账户持有人批准。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
npx -y @foreverworks/mcp-enable-bankingENABLE_BANKING_CONFIGPath of app.json: your Enable Banking application's id, its redirect URL and the name of its private key file, as the README describes it.ENABLE_BANKING_KEY密钥Path of the application's private key (PEM), when app.json does not name it.本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。
工具
10收录的工具列表 · 更新于 3 天前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| label | string | 否 | 存储名称:a-z、0-9、_ 和 -。默认值:同一银行、国家和 psu_type 的已存授权标签(续期时会替换该授权);否则使用银行和国家,例如 example_bank_de。 |
| code_or_url | string | 是 | 完整重定向 URL(...?code=...&state=...),或仅代码值。 |
详细介绍
Enable Banking MCP 服务
通过 Enable Banking(一家获得许可、服务欧洲各地银行的 PSD2 提供商),从 AI 助手中读取、搜索并导出银行对账单和余额。它不会转移资金:除了读取之外,它只会启动、存储和结束授权。start_auth 是它唯一的 money 工具,因为它会向你的银行申请 180 天的只读权限;客户端会在每次调用前征求你的同意。
你需要 一个 Enable Banking 应用(包括其 ID、已注册的重定向 URL 和私钥),并且账户持有人必须每 180 天在其银行应用中批准一次授权。账户持有人不在场时,银行每天允许读取账户约四次;所有使用该授权的程序共享这一额度,因此请一次性读取一段时间的数据,然后在此处缩小范围。
可以询问什么
- “我们有哪些银行授权?每个授权何时到期?”
- “今年我们向 Example Supplier SRL 支付了多少?”
- “列出我们所有账户在 9 月收到的、金额超过 1,000 RON 的付款。”
- “我们 EUR 账户的可用余额是多少?”
- “将上季度的交易导出为 CSV,供会计师使用。”
- “我们在 Example Bank 的授权下周到期。续期。”
安装
使用 Claude Code:
claude mcp add enable-banking -e ENABLE_BANKING_CONFIG="<path to Enable Banking app.json>" -- npx -y @foreverworks/mcp-enable-banking
Claude Desktop(Settings、Developer、Edit Config)和大多数其他客户端会从同一 JSON 命令中读取配置:
{
"mcpServers": {
"enable-banking": {
"command": "npx",
"args": ["-y", "@foreverworks/mcp-enable-banking"],
"env": {
"ENABLE_BANKING_CONFIG": "<path to Enable Banking app.json>"
}
}
}
}
每个客户端都会在 Node 22.19 或更高版本上运行已发布的软件包。VS Code 和 Claude Desktop 安装包会在添加服务时询问各项设置;可选项可以留空。Cursor 则会从环境变量中读取各项设置(例如 ${env:ENABLE_BANKING_CONFIG}),因此请在启动 Cursor 前设置好这些变量。以上命令仅设置必需项;其余设置请参阅配置。
从克隆仓库安装
git clone https://github.com/foreverworks/mcps.git && cd mcps
npm ci && npm run build
claude mcp add enable-banking -e ENABLE_BANKING_CONFIG="<path to Enable Banking app.json>" -- node "$PWD/servers/enable-banking/dist/index.js"
在 JSON 配置中,命令为 node,唯一参数是 servers/enable-banking/dist/index.js 的完整路径。若要通过 HTTP 在多个客户端之间共享同一个运行实例,请参阅 docs/deploying.md。
配置
| 变量 | 必需 | 含义 |
|---|---|---|
ENABLE_BANKING_CONFIG | 是 | app.json(如下)的路径,服务仅读取此文件。 |
ENABLE_BANKING_KEY | 否 | 应用私钥(PEM)的路径。未设置时,app.json 中的 private_key 会指定该文件,路径相对于 app.json 所在文件夹。 |
ENABLE_BANKING_STATE_DIR | 否 | 存放授权(sessions.json)、其备份及锁的位置;默认值见 docs/configuration.md。 |
ENABLE_BANKING_EXPORTS_DIR | 否 | export_transactions 写入 CSV 文件的位置。默认值:状态文件夹中的 exports/。 |
app.json 保存控制面板中应用的详细信息:
{
"application_id": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
"application_name": "Example Books",
"environment": "sandbox",
"redirect_url": "https://example.com/bank-callback",
"private_key": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee.pem"
}
必须填写 application_id 和 redirect_url;除非设置了
ENABLE_BANKING_KEY,否则也必须填写 private_key。redirect_url 必须与已注册的某个地址
完全一致。application_name 和 environment 仅用于标注 health 的响应;
application_id 决定使用沙盒还是生产环境。api_base 可覆盖
https://api.enablebanking.com,用于测试或代理;其他键都会被忽略。
在 systemd 下,凭据目录会将文件重命名为凭据名称,因此请在该目录中设置
ENABLE_BANKING_KEY。所有服务共用的变量见
docs/configuration.md。
获取应用和密钥
- 在 Enable Banking 的控制面板中,从顶部菜单打开 API applications。在“Add a new application”中,保留 Sandbox 环境:其中的测试银行让你无需真实账户即可试用所有工具。
- 为应用命名(账户持有人会看到该名称),并输入
重定向 URL。任何由你控制的页面都可以:
complete_auth只需要浏览器最终跳转到的地址。 - 保留默认的私钥选项,然后点击 Register。浏览器会生成密钥并将其保存为
<application id>.pem;将它移至只有此服务才能读取的位置,并在其旁边创建app.json。
生产环境需要另行注册一个应用,并选择 Production 环境。该应用初始状态为 Inactive;“Activate by linking accounts”会在受限模式下将其激活,在你与 Enable Banking 签订合同之前,它只能读取你自己关联的账户。
首次运行
- 请助手运行 Enable Banking 的
health检查。它会显示应用名称、环境、是否已激活及其重定向 URL, 并统计已存储的授权数量。与application_id不匹配的密钥会导致检查失败。 - 使用该国家的
list_aspsps查找你的银行。start_auth需要其name;psuTypes列出其账户类型(business、personal),maxConsentDays则列出其最长授权期限。 - 请助手使用该银行名称、国家和
psu_type调用start_auth,然后批准授权。返回的链接供账户持有人使用:请预留五分钟,并准备好装有银行应用的手机。 - 打开链接,登录银行,并勾选它提供的每个账户。 请求中不指定账户,即表示请求全部账户。
- 银行会将你带回重定向 URL,并附上
?code=...。请立即将该地址(或代码)交给complete_auth:代码只能使用一次,且几分钟后就会失效。响应会列出账户及授权的到期日期。
如需续期授权(list_stored_sessions 会显示剩余天数),
请使用该银行、国家和类型重复步骤 3 至 5。若不提供 label,新授权会取代旧授权及其标签。
在命令行中,node dist/index.js --health 会打印一行 ENABLEBANKING:,
并在需要人工操作时以状态码 1 退出;若 Enable Banking 服务异常,则以状态码 2 退出,
适合用于每日定时任务。
工具
read 不会更改银行中的任何内容或已存储的同意(导出操作只会写入文件);write 会更改已存储的同意;money 会向银行请求访问你的账户。
| 工具 | 访问权限 | 功能 |
|---|---|---|
health | read | Enable Banking 是否接受此密钥、该密钥对应的应用和环境、文件所在位置,以及已存储的同意数量。 |
list_aspsps | read | Enable Banking 在某个国家/地区可连接的银行(对每个市场均为空):start_auth 要使用的 name、各银行提供的账户类型,以及其最长同意期限。缓存 1 小时。 |
list_stored_sessions | read | 按标签列出每项已存储的同意,包括其银行、账户及其到期时间(以日期和剩余天数表示)。 |
start_auth | money | 为银行提供的所有账户发起一项为期 180 天的同意。返回一个账户持有人必须打开的链接。 |
complete_auth | write | 根据银行的重定向完成一项同意,将其按标签存储,并报告其账户和结束日期。 |
revoke_session | write | 在银行处结束一项已存储的同意,并在此处将其移除,同时保留之前的文件作为备份。 |
list_accounts | read | 向银行查询一项同意当前可访问的账户,并列出每个账户的 uid,供其他工具使用。 |
get_transactions | read | 获取一个账户、一项同意下的所有账户或所有已存储账户的交易明细,包含精确的带符号金额;可按文本、方向和金额缩小范围,且不会再次向银行读取。 |
export_transactions | read | 将相同的交易明细写入 CSV 文件,适用于较长时期、多个账户或会计师。返回文件路径、大小和 SHA-256。 |
get_balances | read | 获取银行为一个账户报告的所有余额(已记账、可用及其他返回的余额),每项均包含精确金额、PSD2 代码及其含义。 |
资金操作
start_auth 不会转移资金,但会授予为期 180 天的只读访问权限,是否授权应由账户持有人决定。它在 tools/list 中标记为 money,因此你的客户端会在每次调用前询问你(Claude Code 在所有权限模式下都会这样做)。设置 MCP_CONFIRM=elicit 后,服务会根据参数生成一行提示并自行询问你:
enable-banking: Bank consent (PSD2, read-only: balances and transactions) with Example Bank (DE), personal accounts, every account the bank offers, valid 180 days: until 2030-07-01 if confirmed today
询问你时会计算结束日期,调用运行时也会再次计算,因此稍后确认会因延迟而推迟结束日期。账户持有人在其银行处批准后,访问权限即开始生效。
故障排查
config:“未设置 ENABLE_BANKING_CONFIG”,或消息中提到了
app.json。将 ENABLE_BANKING_CONFIG 设置为可读取的 app.json,并将
ENABLE_BANKING_KEY(或 private_key)设置为密钥。
auth:“无法使用位于……的私钥”。密钥文件不存在、无法读取,或不是 RS256 私钥。将 ENABLE_BANKING_KEY 或
private_key 指向控制面板保存的 .pem 文件;下次调用时会重新读取,无需重启。
api 返回状态码 401 或 403。 Enable Banking 拒绝了签名令牌:
密钥与 application_id 不匹配(例如,生产环境 ID 配的是沙盒密钥)。
api 的 reason 为 EXPIRED_SESSION、REVOKED_SESSION、CLOSED_SESSION
或 SESSION_DOES_NOT_EXIST,或状态码为 422 或 404,但前一天调用还正常。 用户已在银行应用中撤销授权,或授权已过期;重试也无法恢复。按照首次运行中的第 3 至第 5 步重新授权。
complete_auth 返回的 api 错误,其 reason 为 EXPIRED_AUTHORIZATION_CODE、
WRONG_AUTHORIZATION_CODE 或 outcome_unknown。 授权码只能使用一次,且有效期只有几分钟;若兑换请求未成功,则无法再次兑换。重新运行 start_auth,并在批准后立即调用
complete_auth。
api 的 reason: "ASPSP_RATE_LIMIT_EXCEEDED"。 当天的账户读取次数已用完。等待一天,然后每个时间段读取一次,并用筛选条件缩小范围。
input:“银行拒绝了授权:……”。账户持有人拒绝了授权,或银行发生故障;请重新运行 start_auth。**“那里没有 code 参数”**表示你粘贴的是 start_auth 返回的链接,而不是银行重定向回来的地址。
工作原理
账单
金额始终以十进制字符串保存,绝不转成 JavaScript 数字,因为后者只能保留 15 到 17 位有效数字(9007199254740993.01 会变成 9007199254740992)。Enable Banking 会发送无符号金额和 credit_debit_indicator;get_transactions 会根据该文本添加正负号,支出为负数。如果某行的金额以 JSON 数字形式返回,或不是普通十进制数,该行会带有 amountWarning。
搜索在读取后进行:银行只会返回某个日期范围内的所有行。筛选后的结果会回显筛选条件,并同时显示 fetched(读取的行数)和 count(匹配的行数)。
text会搜索交易对手的名称和 IBAN、付款备注以及分录参考号,不区分大小写、变音符号,也会忽略 IBAN 中的空格:santier可以匹配ȘANTIER EXEMPLU SRL,以及某些银行仍会发送的带 cedilla 的Şantier。direction为credit(收入)或debit(支出)。amount_min和amount_max会限定金额大小,忽略正负号,边界值也包括在内,并按精确十进制数处理;无法精确读取金额的行会被排除,并计入amountUnreadable。date_from和date_to均包含边界日期;留空则不设限。transaction_status默认为booked,可填写名称(pending、cancelled等)或 PSD2 代码;留空则使用银行的默认值。
多个账户会逐个读取,因为银行会限制突发请求;每行都会注明所属账户。被拒绝的账户会连同错误和补救方法列在 accounts 中,与其他账户的行并列。首次读取前会先检查参数,包括账户 uid(每次授权后都会变化的 UUID)的格式,因此拼写错误不会消耗任何资源。系统会一直读取后续页面,最多 200 页。
交易对手是另一方。 对于借记交易,debtor_account 是你自己的 IBAN,因此会根据交易方向选取另一方。汇款备注行会用一个空格连接,因为银行可能在任意位置拆分参考信息。
导出文件包含以下列:account_label、account_iban、booking_date、value_date、direction、amount、currency、counterparty_name、counterparty_iban、remittance、reference、status、bank_code、merchant_category_code、amount_warning。每个单元格都会加引号;对于可能被电子表格当作公式执行的内容(以 =、+ 或 @ 开头),会在前面加上一个撇号,但负数金额除外。每个文件名都包含其范围、日期和创建时间,因此不会覆盖他人正在打开的文件;文件权限为 0640。
授权和 sessions.json
会先保存授权,再执行其他操作,因为 Enable Banking 只会显示一次会话 ID,再次获取则需要账户持有人重新进行身份验证。complete_auth 会交换代码并保存结果,然后获取每个账户的详细信息;如果这一步失败,授权仍然有效,该账户会带有 detailsError。新银行的授权会命名为 <bank>_<country>(example_bank_de),除非你提供了 label。
sessions.json 是其他程序也能读取的格式,定义于 src/domain/sessionsFile.ts:
- 以标签为键的对象(
a-z 0-9 _ -,且在任意位置均可作为标识符); - 每个条目均为
POST /sessions的原始响应:session_id、accounts(含uid、account_id.iban、identification_hash等)、aspsp、psu_type、access.valid_until; - 使用双空格缩进的 JSON,文件权限为 0600;在锁定状态下以原子方式写入,并保留其他标签。先将先前的文件重新序列化并写入
sessions.json.bak;如果它不是 JSON 对象,则将其另存为sessions.json.unreadable-<ms>。
identification_hash 用于在不同授权之间识别账户,将续期授权关联到被其替代的授权记录。如果交换结果缺少此字段,complete_auth 仍会保存授权,并报告 formatWarnings。
结束授权会关闭 Enable Banking 中的会话,从而结束银行的授权,然后移除相应标签;如果银行已结束授权,也会移除该标签。如果银行拒绝结束授权,这里的状态不会改变。
请求
没有可刷新的授权。 每次尝试都会使用私钥即时签署 JWT(RS256,有效期为五分钟,application_id 作为 kid),因此 health 失败意味着密钥或 ID 有误,而非已过期。src/infra/http.ts 会在 5xx 错误或连接中断时最多重试读取四次,将 401 或 422 视为最终结果,并且绝不会重新发送 Enable Banking 可能已处理的 POST。
线缆类型由 openapi-typescript 根据 Enable Banking 的 OpenAPI 描述生成(npm run gen:types -w @foreverworks/mcp-enable-banking;请检查差异)。src/domain/schema.ts 添加了两项经验证的调整:可选字段可以为 null(对账单的最后一页有 continuation_key: null),金额类型为 string | number。
仅缓存银行目录(按国家缓存一小时,存于内存中):所有人看到的内容都相同。npx tsx scripts/smoke.ts 会从真实授权中读取过去三天内的一份对账单;加上 --consent 时还会续期授权,这需要账户持有人参与。
局限
- 仅提供账户信息(AIS):不发起支付,也无此计划。
- 创建和续期授权都需要账户持有人:银行身份验证正是 PSD2 的核心。
- 每项授权都会请求 180 天和所有账户。 如果银行的
maxConsentDays更短,银行会拒绝,而不会自动缩短期限。 - 不保留自己的历史记录(无缓存、提醒或类别),因此每份对账单都是向银行发起的读取请求。需要减少读取次数的程序应维护自己的账本,
sessions.json就是为此设计的。 - 每个服务仅支持一个应用:沙盒和生产环境各自需要一套配置。
其他 Enable Banking 服务
检索日期:2026-10-21。Enable Banking 没有发布任何服务:其 GitHub 组织提供 API 示例、命令行工具和 eIDAS 经纪服务,官网也未提及 MCP。以下四个社区服务通过它读取账户:
- npm 上的
enable-banking-mcp,下载量最高(截至 2026-10-18 的当月下载量为 752):在 macOS 上通过 stdio 运行,将密钥存放在 Keychain 中,仅供个人非商业用途。 - npm 上的
bankmcp(当月下载量为 555):可本地运行,也可托管在其自有登录系统后,并提供会调用 webhook 的监控功能。金额会转换为浮点数。 - GitHub 上的
banking-mcp:运行于 Cloudflare Worker,通过 OAuth 保护,并将余额和交易记录存入自己的数据库,还提供类别和导出功能;通过命令行而非工具关联银行。 - GitHub 上 elcukro 开发的
bank-mcp:除 Enable Banking 外,还支持 Plaid、Tink 和 Teller。金额会转换为浮点数。
本服务旨在实现其他服务都不具备的功能:金额从银行到答案始终保留为精确的十进制字符串;启动授权时会调用 money 工具,确认内容会列出银行、账户和结束日期;授权按标签保存在其他程序可读取的文件中,并备份上一个文件,且按账户保存将续期与历史记录关联起来的哈希。它不具备其他服务提供的功能:提醒(bankmcp)、本地缓存和类别(banking-mcp),以及 Enable Banking 之外的银行(bank-mcp)。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。