monzo — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited monzo (Plugin) 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 Monzo banking integration for Claude Code. Query balances, view transactions, check pots, and analyze spending — all through natural conversation.
| Tool | Description |
|---|---|
monzo_is_authenticated | Verify authentication status (live ping) |
monzo_complete_auth | Complete OAuth when loopback fails (WSL/Docker fallback) |
monzo_list_accounts | List all accounts (current, joint, flex) |
monzo_get_balance | Current balance and today's spending |
monzo_list_transactions | Transaction history with merchant details |
monzo_get_transaction | Full detail on a single transaction |
monzo_list_pots | All active (non-deleted) pots with balances and goals |
monzo_spending_summary | Aggregated spending by category and top 10 merchants |
http://localhost:3118/callbackWhy do I need my own OAuth client? Monzo restricts API access to personal use — there's no public app model. You create your own client at developers.monzo.com and only your credentials touch this server.
Go to developers.monzo.com and create a Confidential client.
http://localhost:3118/callback#### Option A: Claude Code Plugin (recommended)
Gives you the MCP server plus domain knowledge skills, auth hooks, and auto-updates.
In a Claude Code session, run:
/plugin marketplace add tcoretech/monzo-mcp
/plugin install monzo@tcoretech-monzo-mcp
/reload-plugins
/plugin enable monzoThen "Configure Options" to set MONZO_CLIENT_ID and MONZO_CLIENT_SECRET (stored in the system keychain).
#### Option B: Claude Code MCP (server only)
uvx (no install needed):
claude mcp add monzo \
-e MONZO_CLIENT_ID=your_client_id \
-e MONZO_CLIENT_SECRET=your_client_secret \
-- uvx --from monzo-mcp monzo-mcppip install:
pip install monzo-mcp
claude mcp add monzo \
-e MONZO_CLIENT_ID=your_client_id \
-e MONZO_CLIENT_SECRET=your_client_secret \
-- monzo-mcpFrom source:
git clone https://github.com/tcoretech/monzo-mcp.git
cd monzo-mcp
pip install -e .
claude mcp add monzo \
-e MONZO_CLIENT_ID=your_client_id \
-e MONZO_CLIENT_SECRET=your_client_secret \
-- python3 mcp-server/server.py#### Option C: Any MCP Client (JSON config)
For Claude Desktop, Cursor, or any other MCP-compatible client, add this to your configuration:
{
"mcpServers": {
"monzo": {
"command": "uvx",
"args": ["--from", "monzo-mcp", "monzo-mcp"],
"env": {
"MONZO_CLIENT_ID": "YOUR_CLIENT_ID",
"MONZO_CLIENT_SECRET": "YOUR_CLIENT_SECRET"
}
}
}
}This server implements a Seamless Loopback Flow. You don't need to run a separate setup command.
Note: Tokens are stored in the system keychain when available, with a plaintext fallback at ~/.monzo-mcp/tokens.json (0600 permissions). Existing plaintext tokens are automatically migrated to the keychain. Access tokens are refreshed automatically.| Storage | Location | When used |
|---|---|---|
| System keychain | monzo-mcp service | Default (macOS Keychain, GNOME Keyring, Windows Credential Locker) |
| Plaintext fallback | ~/.monzo-mcp/tokens.json | When keychain is unavailable |
To force re-authentication, clear the keychain entry or delete the fallback file.
Once connected, ask Claude things like:
monzo-mcp/
├── .claude-plugin/ # Plugin metadata
│ ├── plugin.json
│ ├── marketplace.json
│ └── hooks/
│ ├── hooks.json # Session-start auth check hook
│ └── check-monzo-auth.sh
├── mcp-server/ # MCP server (Python)
│ ├── server.py # FastMCP entry point (stdio)
│ ├── tools.py # 8 tool definitions (7 banking + 1 auth helper)
│ ├── monzo_client.py # Async API client with retry
│ ├── auth.py # OAuth token management, loopback listener, auto-refresh
│ └── .env.example
├── skills/monzo/
│ └── SKILL.md # Domain knowledge for Claude
├── pyproject.toml # Python packaging (pip/uvx)
├── LICENSE
└── README.mdCredential flow:
User provides Server handles internally
┌──────────────────┐ ┌──────────────────────────┐
│ MONZO_CLIENT_ID │──env──▶ │ OAuth browser flow │
│ MONZO_CLIENT_SECRET│ │ Token exchange │
└──────────────────┘ │ Token refresh │
│ Account auto-detection │
│ ~/.monzo-mcp/tokens.json │
└──────────────────────────┘Security:
userConfig prompts at enable time, stores securely in system keychain~/.monzo-mcp/config.json, interactive setup via SessionStart hookdecline_reason in list_transactions outputmonzo_complete_auth tool for WSL/Docker callback fallbackMIT
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.