Fints Finanzen — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Fints Finanzen (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Read-only MCP server for German banks via FinTS/HBCI — accounts, balances, and transactions over PIN/TAN.
To our knowledge, this is the only MCP server for the FinTS/HBCI protocol — the standard online-banking interface supported by virtually every German bank. It gives an LLM a safe, read-only window into your bank accounts: no transfer code exists anywhere in this codebase.
MCP tools exposed over stdio (via FastMCP):
| Tool | Description |
|---|---|
accounts() | List all accounts (IBAN, account number, BIC) |
balance(iban_or_account=None) | Current balance of one account (empty → first account) |
transactions(days=30, account=None) | Transactions of the last days days |
summary() | All accounts + balances in a single call |
python-fints only implements account listing, balances, and transaction retrieval. There is no code for transfers or any other write operation.12030000), switchable to any other FinTS-capable bank via FINTS_BANK_CODE / FINTS_ENDPOINT.{"ok": false, "error": "...", "message": "..."}), never as crashes.tan_required error and you simply re-run enroll.py.Requires Python 3.10+.
git clone https://github.com/NG-Bullseye/FinTS-Finanzen.git
cd FinTS-Finanzen
./bootstrap.sh # idempotent: .venv + requirements + .env aus Vorlagecp .env.example .env
.venv/bin/python -c "import crypto; print(crypto.generate_key())"
# put the output into .env as FINTS_MASTER_KEY(enroll.py can also generate and display a key for you.)
set -a; . ./.env; set +a # load FINTS_MASTER_KEY into the environment
.venv/bin/python enroll.pyThe enrollment asks for your online-banking login name (not the account number) and PIN, walks through the bank's pushTAN flow (including decoupled app-based approval), and — only on success — stores the PIN encrypted plus the FinTS client state.
The server runs over stdio. Example MCP configuration (FINTS_MASTER_KEY must be set in the server's environment) — use absolute paths, MCP clients do not launch servers from the repo directory. Prefer exporting FINTS_MASTER_KEY in the client's environment over writing it into this file:
{
"mcpServers": {
"fints-finanzen": {
"command": "/absolute/path/to/FinTS-Finanzen/.venv/bin/python",
"args": ["/absolute/path/to/FinTS-Finanzen/mcp_server.py"],
"env": {
"FINTS_MASTER_KEY": "<base64-32-byte-key>",
"FINTS_BANK_CODE": "12030000",
"FINTS_PRODUCT_ID": ""
}
}
}
}All configuration is via environment variables:
| Variable | Default | Purpose |
|---|---|---|
FINTS_MASTER_KEY | — (required) | Base64-encoded 32-byte AES-256-GCM key used to encrypt/decrypt the stored credentials |
FINTS_BANK_CODE | 12030000 (DKB) | Bank code (BLZ) of your bank |
FINTS_ENDPOINT | https://fints.dkb.de/fints | FinTS endpoint URL of your bank |
FINTS_PRODUCT_ID | public default from config.py | FinTS product ID. Empty uses a public ID reported working with DKB (python-fints#183). For a clean, permanent setup, register your own ID with the Deutsche Kreditwirtschaft (fints.org product registration) |
How your bank credentials are actually handled (verifiable in crypto.py, config.py, fints_client.py):
~/.config/fints-finanzen/credentials.enc. The FinTS client state (system ID, BPD/UPD) is stored alongside as fints_state.bin. Directory mode 0700, file mode 0600. Nothing sensitive is inside the repo directory, and .gitignore keeps .env out of git.FINTS_MASTER_KEY environment variable — it is never written to disk by this project. Without it, the stored credentials are unreadable. Flip side, stated plainly: whoever has both the key (e.g. from your MCP config file or process environment) and credentials.enc can decrypt your PIN. Protect your MCP configuration accordingly.get_sepa_accounts, get_balance, and get_transactions. Even a fully compromised LLM session cannot initiate transfers through this server, because the code for it does not exist.getpass (no echo) in the interactive enrollment; the MCP server itself never asks for or accepts credentials.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.