Erik Finance MCP
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Erik Finance MCPShow our company's account balances and recent transactions."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Erik Finance MCP
Read-only company finance stack for Erik (Grok Bot CFO for Falkenssons Production AB).
Forked/adapted from Mark's personal stack. Defaults:
ASPSP: Handelsbanken, country SE,
psu_typebusinessLocal API port 8797, MCP HTTP 8798 (Mark uses 8787/8788)
Redirect:
https://127.0.0.1:8797/auth/callbackNever reuse Mark's Enable Banking application id or PEM
Read-only personal finance stack for Mark (Grok Bot personal finance assistant).
Nordea (Sweden, personal AIS)
↓
Enable Banking Open Banking API
↓
this server (Finance API + local SQLite)
↓
MCP tools (stdio or Streamable HTTP)
↓
Cursor / Grok Botv1 is API + MCP + local store. Notion sync is later.
Hard constraints
Read-only AIS only: accounts, balances, transactions.
No payment initiation endpoints, MCP tools, or code paths.
Never log or store BankID credentials or bank passwords. The only secret this repo uses is the Enable Banking application JWT signing key, plus session ids and consent metadata.
Works against Enable Banking sandbox and restricted production (own accounts linked/whitelisted for individual non-commercial use).
Default ASPSP: Nordea, country SE,
psu_typepersonal.
Related MCP server: saldo-mcp
Architecture
Piece | Role |
Finance API ( | Local HTTP: start AIS consent, callback, query store, trigger sync |
Sync CLI ( | Pull balances + transactions since last cursor, upsert, categorize |
SQLite ( | Sessions, account uids, sync cursors, normalized transactions |
MCP stdio ( | Cursor / local hosts |
MCP HTTP ( | Grok Bot |
Category buckets (editable rules in config/category-rules.json):
mat · bil · abonnemang · nöjen · fasta · inkomst · sparande · övrigt
Enable Banking signup
Open Enable Banking Control Panel and sign in with email.
Register an API application: API applications.
Sandbox: keep Sandbox, let the browser generate the application private key. The downloaded
.pemfilename is the application id.Whitelist the redirect URL you will use, e.g.
http://127.0.0.1:8787/auth/callback.Store the
.pemoutside git (seeENABLEBANKING_PRIVATE_KEY_PATH).
Docs:
Restricted production (own Nordea SE accounts)
For real balances (individual non-commercial use):
Register a Production application (status starts as Inactive).
Use Activate by linking accounts and complete Nordea Sweden authorization so your own accounts are whitelisted.
Restricted apps can only fetch data from linked accounts until a commercial contract exists.
Linking does not create an AIS session for this server. You still run
POST /auth→ BankID →POST /sessionshere.
Sandbox and production use the same API host (https://api.enablebanking.com). The environment is the application key you configured.
Environment
Copy .env.example to .env. Never commit .env, *.pem, or the SQLite file.
Variable | Purpose |
| Application id ( |
| Path to the application RSA private key |
| PEM contents if you cannot use a file ( |
| Default |
| Must match a whitelisted redirect URL |
| Default |
| Default |
| Default |
| Default |
| Finance API bind (default loopback |
| Optional bearer for the Finance API |
| MCP HTTP bind (default loopback |
| Bearer for MCP HTTP. Set this before exposing a tunnel. |
JWT shape (RS256), sent on every Enable Banking call:
header
kid= application idiss=enablebanking.comaud=api.enablebanking.comiat/exp(~1 hour)
Run
Requires Node.js 22.5+ (built-in SQLite).
cp .env.example .env
# put the application id + pem path in .env
npm install
npm test
npm run build1. Authorize AIS (Nordea SE personal)
npm run api
# elsewhere:
npm run auth:startOpen the returned url, complete Nordea BankID, and land on /auth/callback. The callback exchanges code for a session and stores session_id + account uids.
Equivalent: GET/POST /auth/start then GET /auth/callback?code=...&state=....
2. Sync
npm run syncPulls balances and transactions since the last booking-date cursor (2-day overlap), upserts, and categorizes.
3. Local demo without bank credentials
npm run seed
npm run apiThen GET /accounts, /transactions, /spending/monthly?month=2026-09.
MCP tools (read-only)
Tool | Arguments | What it reads |
| — | Stored accounts |
| optional | Last synced balances |
|
| Inclusive date range |
| — | Tx since report cursor, then advances it |
| optional | Category totals |
| — | Consent expiry + sync cursors |
There are no payment tools.
Cursor (stdio)
After npm run build, add to ~/.cursor/mcp.json or .cursor/mcp.json:
{
"mcpServers": {
"mark-finance": {
"command": "node",
"args": ["--experimental-sqlite", "/ABS/PATH/mark-finance-mcp/dist/mcp/stdio.js"],
"env": {
"DATABASE_PATH": "/ABS/PATH/mark-finance-mcp/data/finance.db",
"CATEGORY_RULES_PATH": "/ABS/PATH/mark-finance-mcp/config/category-rules.json"
}
}
}
}Dev equivalent: npm run mcp (tsx + stdio). See .cursor/mcp.json.example.
Grok Bot (AddMcpServer)
Grok Bot cannot spawn local stdio. Expose Streamable HTTP:
export MCP_HTTP_TOKEN="$(openssl rand -hex 32)"
npm run mcp:httpTunnel that process (Tailscale, Cloudflare Tunnel, etc.) so the Bot can reach it. In Grok Bot → Add MCP server:
Name:
mark-financeURL:
https://<public-host>/mcp(path must be/mcp)Headers:
Authorization: Bearer <MCP_HTTP_TOKEN>Transport: Streamable HTTP
Do not point Grok Bot at localhost. Confirm the Bot lists the six tools above.
Consent renewal
Enable Banking sessions are valid until access.valid_until (Nordea typically allows up to ~180 days / maximum_consent_validity). When get_sync_status shows few days remaining, run auth-start again, complete BankID, and keep using the new session id. This app stores consent metadata only — not BankID.
Security
Bind Finance API and MCP HTTP to
127.0.0.1unless you intentionally tunnel.Set
MCP_HTTP_TOKEN/API_TOKENbefore any public URL.Store the application PEM with filesystem permissions for your user only.
Logs redact JWTs, tokens, auth codes, and PEM material.
Restricted production is for your linked accounts, not third-party aggregation.
Finance API routes
Method | Path | Notes |
GET |
|
|
GET/POST |
| Starts AIS authorization |
GET/POST |
| Exchanges |
GET |
| Local store |
GET |
| Local store |
GET |
|
|
GET |
| Advances report cursor |
GET |
|
|
GET |
| Consent + cursors |
POST |
| Bank pull (needs credentials) |
GET/PUT |
| Editable category rules |
POST |
| Re-apply rules |
No /payments route exists.
Category rules
Edit config/category-rules.json or PUT /rules. Fields: category, pattern (JS regex), optional field (any | remittance | counterparty | credit), priority (lower wins). Then npm run recategorize.
This server cannot be deployed
Maintenance
Related MCP Connectors
Read bank accounts, balances and transactions from 10,000+ European banks.
Read-only access to your bank, investment, and crypto accounts: balances, transactions, holdings.
Read-only access to Genie accounts, transactions, investments, and financial summaries.
Hong Kong Monetary Authority (HKMA) public open API MCP. Keyless.
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 gradedqualityBmaintenanceA read-only MCP server that securely connects Swedish/Nordic bank accounts to AI assistants, keeping all financial data local and encrypted.19 npmMIT

BankBridgeofficial
FlicenseNot gradedqualityDmaintenanceEnables financial data access from connected bank accounts via MCP tools, allowing natural language queries about balances, transactions, subscriptions, investments, and more, with a focus on privacy and read-only access.-- AlicenseNot gradedqualityBmaintenanceEnables secure, read-only access to personal European bank accounts through Enable Banking and Cloudflare Workers, allowing MCP clients to list accounts, retrieve balances, search transactions, and summarize cash flow.1MIT