[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-96082":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":14,"contributorsCount":15,"subscribersCount":15,"size":15,"stars1d":15,"stars7d":15,"stars30d":16,"stars90d":15,"forks30d":15,"starsTrendScore":15,"compositeScore":17,"rankGlobal":10,"rankLanguage":10,"license":18,"archived":19,"fork":19,"defaultBranch":20,"hasWiki":21,"hasPages":21,"topics":22,"createdAt":10,"pushedAt":10,"updatedAt":33,"readmeContent":34,"aiSummary":35,"trendingCount":15,"starSnapshotCount":15,"syncStatus":36,"lastSyncTime":37,"discoverSource":38},96082,"bankmcp","noskillish\u002Fbankmcp","noskillish","BankMCP™: your AI can now read your bank. Self-hosted, read-only MCP server for your own bank accounts via open banking (Enable Banking). Standard MCP; tested with Claude and Ollama.","https:\u002F\u002Fbankmcp.dk\u002F",null,"TypeScript",186,33,1,0,41,48.69,"MIT License",false,"main",true,[23,24,25,26,27,28,29,30,31,32],"chatgpt","claude","enable-banking","mcp","mcp-server","ollama","open-banking","personal-finance","psd2","self-hosted","2026-09-20 04:01:32","# BankMCP™\n\n**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.\n\nBankMCP™ is not a bank. It is a small open-source server you host yourself\n(npm package `bankmcp`). It connects to your banks\nthrough [Enable Banking](https:\u002F\u002Fenablebanking.com), which wraps 2,700+\nEuropean banks in one PSD2 API, and exposes them to any MCP client as a\nconnector. Read-only, no payments, no third party holding your data.\n\n> \"Has the invoice from Acme been paid?\" · \"What did we spend on groceries in\n> August?\" · \"Which subscriptions am I paying for, and what do they cost per\n> year?\" · \"Tell me when my balance drops below 5,000.\"\n\n## How it works\n\n```\nYour assistant ──OAuth──▶ your BankMCP™ server ──JWT──▶ Enable Banking ──PSD2──▶ your bank\n```\n\n- **Your assistant** (Claude, ChatGPT, Cursor, or any MCP client) talks to\n  your server as a connector. You sign in once with a password; tokens handle\n  the rest.\n- **Your server** holds the Enable Banking application key, the bank consents\n  and your account ids. It does not store balances or transactions and sends no\n  telemetry.\n- **Enable Banking** is the licensed provider between your server and your\n  bank. Every balance and transaction you ask for passes through their\n  servers on the way to yours; they do not store it, and they do not see your\n  bank credentials, since you log in at your bank's own site. This hop is how\n  PSD2 works and is the one part of the chain that is not on your machine.\n\n## Setup\n\nTwo ways to run it. Both need a free Enable Banking account and about ten\nminutes.\n\n- **On your own machine** for Claude Desktop, Claude Code, Cursor and other\n  desktop MCP clients. Nothing to deploy, no password.\n- **On a small server** when you want it in claude.ai or on your phone.\n\n### On your own machine\n\nThe server and its state live on your computer, and no AI vendor or app\nmaker sees your data. The bank connection is not on your computer: it goes\nthrough Enable Banking, as described above.\n\nRequires [Node 24](https:\u002F\u002Fnodejs.org) or newer. Add BankMCP™ to your client:\n\nClaude Code:\n\n```bash\nclaude mcp add bankmcp -- npx -y bankmcp\n```\n\nClaude Desktop: download\n[bankmcp.mcpb](https:\u002F\u002Fgithub.com\u002Fnoskillish\u002Fbankmcp\u002Freleases\u002Flatest\u002Fdownload\u002Fbankmcp.mcpb)\nand open it; Claude Desktop installs it as an extension. Or add it by hand in\n`claude_desktop_config.json`:\n\n```json\n{ \"mcpServers\": { \"bankmcp\": { \"command\": \"npx\", \"args\": [\"-y\", \"bankmcp\"] } } }\n```\n\nCursor and others: the same command, `npx -y bankmcp`, as a stdio server.\n\nThen ask your assistant anything about your bank. It will answer with a\nlocalhost address. Open it: the setup page lists the values to register an\napplication at Enable Banking, then takes the application id and the key file.\nYour browser will warn once about the certificate on localhost, which the\nserver made for itself because Enable Banking requires https for the bank\nredirect. Continue past it. Say \"connect my bank\" and log in at your bank.\n\nTo avoid the warning altogether, use a certificate your browser already\ntrusts: [mkcert](https:\u002F\u002Fgithub.com\u002FFiloSottile\u002Fmkcert) makes one with\n`mkcert localhost 127.0.0.1`; point `TLS_CERT_PATH` and `TLS_KEY_PATH` at the\ntwo files and the server uses them instead of generating its own. BankMCP™\nitself does not touch your system's trust store.\n\nState lives in `~\u002F.bankmcp`. Delete the folder to forget everything.\n\n### On a server\n\n#### 1. Deploy\n\nAny container host works. The server needs a persistent volume at `\u002Fdata`\nand a public https address; it asks you for everything else in the browser.\n\n**Railway:** New Project, Deploy from GitHub repo, pick this repo. Add a\nvolume mounted at `\u002Fdata` and generate a domain (Settings, Networking, port\n8080). The Dockerfile and [railway.json](railway.json) are picked up\nautomatically, and the server learns its own address from Railway.\n\n**Docker Compose on your own box:** `docker compose up -d`, then put a TLS\nterminator in front (Caddy needs two lines:\n`YOUR-HOST { reverse_proxy localhost:8080 }`) and set `BASE_URL` to the\npublic address. Fly.io works like Railway: volume at `\u002Fdata`, the app name\ngives the address.\n\nOpen the address. A fresh server shows a setup page.\n\n#### 2. Register an Enable Banking application\n\nThe setup page lists the exact values Enable Banking's form asks for: the\nredirect URL, a description for the consent screen, and the privacy and\nterms URLs, all pointing at your server. At\n\u003Chttps:\u002F\u002Fenablebanking.com\u002Fcp\u002Fapplications> create an application with them:\n\n- Environment: **Production** for your real accounts, **Sandbox** for test\n  data (see *Going live* below for the production rules).\n- Keep \"generate private key\" selected. A `.pem` file downloads once when you\n  save; that is the key. The application id (a UUID) is shown after saving.\n\n#### 3. Finish setup\n\nBack on the setup page: paste the application id, choose the `.pem` file, pick\na password of twelve characters or more. Everything is stored on the volume,\nand the page turns into a status page showing the connector URL for your\nassistant.\n\nPrefer configuration by environment? Set these and the setup page does not\nappears:\n\n| Variable | Value |\n|---|---|\n| `EB_APP_ID` | the application id |\n| `EB_PRIVATE_KEY` | the `.pem` contents, base64: `base64 -i app.pem \\| tr -d '\\n'` |\n| `ADMIN_PASSWORD_HASH` | output of `npm run hash-password` (or set `ADMIN_PASSWORD`) |\n| `BASE_URL` | `https:\u002F\u002FYOUR-HOST` (Railway and Fly set this for you) |\n| `DEFAULT_COUNTRY` | your country code, e.g. `DK` |\n| `APP_NAME` | optional, the name shown on the sign-in and status pages (default `BankMCP™`) |\n\nOptional: `NOTIFY_WEBHOOK_URL` for watch notifications and sign-in alerts (a\nSlack incoming webhook works). Full list in [.env.example](.env.example).\n`npm run check` verifies a configuration from a terminal.\n\n#### 4. Add the connector in your assistant\n\nIn claude.ai (or the desktop app): **Settings → Connectors → Add custom\nconnector**. Name it `BankMCP™`, paste `https:\u002F\u002FYOUR-HOST\u002Fmcp`, save, then click\n**Connect**. Your server shows a password page; enter the admin password. That\nis the only login you will do.\n\nIn Claude Code:\n\n```bash\nclaude mcp add --transport http bank https:\u002F\u002FYOUR-HOST\u002Fmcp\n```\n\nthen run `\u002Fmcp` inside Claude Code to sign in.\n\nOther MCP clients (ChatGPT, Mistral Le Chat, Cursor, VS Code) work the same\nway: add the URL as a remote MCP server, sign in with the password. Tested\nwith Claude, Claude Code and Ollama; the others follow the same standard.\nA client whose domain is not in `ALLOWED_REDIRECT_HOSTS` needs adding there.\n\n#### 5. Connect your bank\n\nIn your assistant, say **\"connect my bank\"** (or use the `connect-bank` prompt). It\nlooks up your bank, gives you a link, you log in at the bank and approve, and\nthe accounts appear. Consents last up to 180 days; you are told when one\nis about to expire and the same conversation renews it.\n\nGive accounts labels (\"Everyday\", \"Joint expenses\", \"Mortgage\") when it\nsuggests them. Every tool accepts labels instead of ids.\n\n## Going live with your own accounts\n\nEnable Banking's production environment normally requires a contract, but it\nhas a **restricted mode** for accessing *your own* accounts, explicitly allowed\nfor individual non-commercial use. After registering a Production application:\n\n1. On the (Inactive) application click **Activate by linking accounts**.\n2. Log in at your bank and approve. Repeat for each bank you want.\n3. The application becomes active and the API returns only the accounts you\n   linked this way.\n\nRead the *Restriction of Use* section of Enable Banking's\n[Terms of Service](https:\u002F\u002Fenablebanking.com\u002Fterms-of-service\u002F) before you\nrely on it: restricted mode is for your own accounts, not for offering a\nservice to others. This project does not change those terms.\n\n## What you get\n\n**Tools** (all read-only):\n\n| Tool | What it does |\n|---|---|\n| `list_banks`, `start_consent`, `consent_status`, `disconnect_bank` | connect and manage banks |\n| `list_accounts`, `set_account_label` | accounts with booked balances; your own names for them |\n| `get_balances` | booked and available balance for one account |\n| `get_transactions` | signed amounts, one counterparty, one description; paginated |\n| `create_watch`, `list_watches`, `delete_watch`, `check_watches` | background rules with webhook notifications |\n\n**Prompts**: `connect-bank`, `monthly-summary`, `build-budget`,\n`savings-scan`, `subscription-audit`, `unusual-transactions`.\n\n**Watches** run on the server. Rules: balance below or above an amount, a\nsingle debit over an amount, an incoming or outgoing payment matching a name,\nand \"tell me if this payment has not arrived by this date\". Accounts are\nchecked at most four times a day, the PSD2 limit for unattended access.\nNotifications go to `NOTIFY_WEBHOOK_URL` as a Slack message or a JSON POST.\n\nEnable Banking's own webhooks cover payment initiation only, so account data\nis polled. There is no way around that under PSD2.\n\n## Claude Code plugin\n\nThe repository is also a Claude Code plugin marketplace. The `bank` plugin\nbrings three skills: `\u002Fbank:setup` walks you through installing BankMCP™ on\nyour machine, `\u002Fbank:deploy` through hosting it, and `bank` encodes how to work\nwith the data: an account map, categorisation rules, the monthly review format\nand when to create watches.\n\nPoint it at your server, then install:\n\n```bash\nexport OPENBANK_URL=https:\u002F\u002FYOUR-HOST\u002Fmcp   # put this in your shell profile\n```\n\n```\n\u002Fplugin marketplace add noskillish\u002Fbankmcp\n\u002Fplugin install bank@bank\n```\n\nThen `\u002Fmcp`, select `bank`, Authenticate, and enter your password. No\norganisation admin is involved; plugins are per user.\n\nThe skill lives at [plugin\u002Fskills\u002Fbank\u002FSKILL.md](plugin\u002Fskills\u002Fbank\u002FSKILL.md).\nCopy it into your own skills to fill in the account map and your merchant\nrules. The server stays generic; your rules stay yours.\n\n## Local models (experimental)\n\nThe server does not care which model asks. `npm run chat` bridges an\n[Ollama](https:\u002F\u002Follama.com) model to the same tools over stdio, so no AI\nvendor sees a transaction:\n\n```bash\nollama pull qwen3:8b\nnpm run chat -- \"what's my balance?\"\n```\n\nMeasured on a MacBook Air with 24 GB: correct per-account balances, a wrong\ntotal, ten minutes per answer. An 8B model is not yet trustworthy with money;\na 30B-class model on a machine with a real GPU is where it gets useful. Any\nMCP client with tool calling (LM Studio, Goose, Jan) can also point at\n`node src\u002Fstdio.ts` directly. Enable Banking still sits between you and the\nbank either way; that part is regulated and unavoidable.\n\n## Security notes\n\n- The server is a complete OAuth 2.1 authorization server with one user.\n  Discovery, dynamic client registration and PKCE come from the MCP SDK;\n  tokens are stored hashed; five wrong passwords lock an address out for\n  fifteen minutes.\n- State is one JSON file in `DATA_DIR`: consents, account ids, watches (with\n  the ids of transactions that already fired) and OAuth tokens. Balances and\n  transactions are not written to disk. Your assistant keeps the\n  conversation as any chat does, and a watch notification carries the matched\n  transaction to your webhook. Back the file up if you care about not\n  re-consenting; delete it to forget everything.\n- Only clients that redirect back to a known MCP client domain (Claude,\n  ChatGPT, Mistral, Cursor, VS Code) or localhost can register\n  (`ALLOWED_REDIRECT_HOSTS`), which stops a phishing link from routing your sign-in to\n  another site. Using a client not on the list? Add its domain. The sign-in page also names the host you will\n  be sent back to.\n- Anyone with the admin password can read your accounts. Use a long one.\n  Every successful sign-in is logged and, if `NOTIFY_WEBHOOK_URL` is set,\n  sent to you as a message. A sign-in you did not make is your alarm.\n- Changing `ADMIN_PASSWORD_HASH` (or `ADMIN_PASSWORD`) and restarting logs\n  every client out. That is the kill switch. Revoking the consents at your\n  bank, or deleting the state file, is the step beyond it.\n- There are no payment tools. Payments need a licensed PISP and a very\n  different security model, so they are out of scope.\n\n## Commands\n\n```bash\nnpm start              # http server (reads env from the environment)\nnpm run dev            # same, with reload and .env\nnpm run check          # verify config and the Enable Banking application\nnpm run hash-password  # produce ADMIN_PASSWORD_HASH\nnpm run watch -- --force   # run all watches once, print what fired\nnpm test               # unit tests (node:test)\nnpm run typecheck\nsh scripts\u002Fbuild-mcpb.sh   # Claude Desktop bundle → dist\u002Fbankmcp.mcpb\n```\n\nRequires Node 24 or newer (runs TypeScript directly, no build step).\n\n## Layout\n\n```\nsrc\u002Fstdio.ts          entry point for npx bankmcp: stdio server plus the localhost https side\nsrc\u002Fserver.ts         entry point for a hosted deployment: OAuth, \u002Fmcp, callback, status page\nsrc\u002Fapp.ts            the Express app shared by both entry points\nsrc\u002Flocal.ts          localhost https server and self-signed certificate for local mode\nsrc\u002Fmcp.ts            McpServer factory (tools, prompts, instructions)\nsrc\u002Ftools.ts          the MCP tools\nsrc\u002Fprompts.ts        the MCP prompts\nsrc\u002Fwatcher.ts        background rule checks and notifications\nsrc\u002Fauth.ts           single-user OAuth provider\nsrc\u002Fsetup.ts          first-run setup: validates and stores id, key and password\nsrc\u002Fpages.ts          the HTML pages: setup, sign-in, connected, status, privacy, terms\nsrc\u002Fconfig.ts         environment and data-directory configuration\nsrc\u002Fenablebanking.ts  JWT signing and a thin typed API client\nsrc\u002Fstore.ts          the JSON state file\nsrc\u002Fdata.ts           shaping balances and transactions for an assistant\nsrc\u002Fcli.ts            check, hash-password, watch\nbin\u002Fbankmcp.js        the npx entry; dispatches to stdio or cli\nscripts\u002F              build-mcpb.sh (Claude Desktop bundle), local-chat.ts (Ollama bridge)\nplugin\u002F               Claude Code plugin: setup and deploy skills, bank skill\ndocs\u002F                 landing page (GitHub Pages, bankmcp.dk)\n```\n\n## What this is, and is not\n\nBankMCP™ is software, not a service. There is no hosted BankMCP™, no account to sign\nup for, and nobody but you handles your server, your key or your bank\nconsents. Each person who uses it deploys their own copy and is the sole\noperator of that copy: they register their own Enable Banking application,\naccept Enable Banking's terms themselves, and are responsible for their own\nhosting, password and security.\n\nThe authors publish the code and nothing else. They do not run any instance\nfor others, receive no data, and are not affiliated with Enable Banking,\nAnthropic or any bank. BankMCP™ is not a bank, does not hold money, and gives no\nfinancial advice.\n\n**Use at your own risk.** If you deploy it, you own that deployment and its\nsecurity. The software is provided as is, without warranty of any kind, and\nthe authors accept no liability for how it is used or for any loss that\nfollows. MIT licence below.\n\n## License\n\nMIT\n","BankMCP 是一个自托管的只读 MCP 服务器，用于将个人银行账户数据安全接入 AI 助手。它通过 Enable Banking（符合 PSD2 的欧洲开放银行聚合平台）连接超 2700 家银行，以标准 MCP 协议向 Claude、Ollama 等兼容客户端提供账户余额、交易明细、订阅账单等只读金融数据，全程不存储敏感信息、不支持支付操作。适用于个人财务问答场景，如查询月度支出、识别自动续费项目、监控账户余额阈值等，强调本地控制与隐私合规。",2,"2026-09-09 02:30:11","CREATED_QUERY"]