Read-only Monzo banking MCP server providing tools to check balances, list transactions, view pots, and analyze spending patterns via the Monzo API.
Monzo MCP has well-structured tool definitions with consistent naming (verb_noun pattern: monzo_*) and comprehensive descriptions (150-300 chars each). All 8 tools have input schemas with type definitions and parameter descriptions. However, output schemas are not documented, LLMs cannot predict response structure. Error handling is present but generic (returns status/message dicts without recovery guidance). Missing tool annotations (readOnlyHint/destructiveHint). Parameter descriptions lack format constraints (e.g., ISO 8601 timestamp format stated in text but not in schema). No pagination support despite list_transactions potentially returning large result sets.
Complete authentication by providing the OAuth callback URL. Use this tool when the automatic loopback listener could not catch the callback (common in WSL or Docker). After logging in to Monzo in the browser, copy the FULL URL from the browser address bar (it starts with http://localhost:3118/callback?code=...) and pass it here.
Get the current balance for a Monzo account. Args: account_id: The account to check. Leave empty to use the default account from configuration. Returns balance, total_balance, spend_today (all in minor units, e.g. pence for GBP), and currency code. If the response indicates SCA is required, you MUST stop execution, inform the user to approve the notification in their Monzo mobile app, and wait for their confirmation.
Get full details of a single transaction by its ID. Args: transaction_id: The transaction ID (starts with 'tx_'). If the response indicates SCA is required, you MUST stop execution, inform the user to approve the notification in their Monzo mobile app, and wait for their confirmation.
Check if the Monzo API connection is working and authenticated. This tool performs a live 'ping' to Monzo's servers. It will return: - 'Authenticated' if everything is working. - 'Needs Login' if OAuth tokens are missing or expired. - 'Waiting for SCA' if Monzo requires an app approval. If the response indicates SCA is required, you MUST stop execution, inform the user to approve the notification in their Monzo mobile app, and wait for their confirmation.
Output schemas not documented. LLMs cannot predict response structure (fields, types, nested objects). Responses return generic {status, message} dicts without documenting what data fields are included for successful calls.
No pagination support on list_transactions despite potentially large result sets. No next_cursor, page, or offset parameters. Limit capped at 100 but no guidance on handling >100 results or iterating through pages.
Error responses lack recovery guidance. Returns {status: 'error', message: str(e)} with raw exception text. LLM cannot determine if error is retryable, user-fixable, or fatal. No actionable next steps provided.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 61 | <=2025-11-25 | v2 |
List all Monzo accounts (current account, joint account, etc.). Returns account IDs, descriptions, types, and creation dates. Use this to discover available account IDs for other queries. If 'needs_login' is returned, follow the instructions in the message. If 'waiting_for_sca' is returned, tell the user to check their phone.
List all savings pots with their balances and goals. If the response indicates SCA is required, you MUST stop execution, inform the user to approve the notification in their Monzo mobile app, and wait for their confirmation.
List recent transactions from a Monzo account. Args: since: ISO 8601 timestamp (e.g. '2025-01-01T00:00:00Z'). Only returns transactions after this time. before: ISO 8601 timestamp. Only returns transactions before this time. limit: Maximum number of transactions to return (max 100, default 50). account_id: The account to query. Leave empty for default account. Note: Due to Strong Customer Authentication (SCA), transactions older than 90 days may not be accessible unless you recently re-authenticated in the Monzo app. If the response indicates SCA is required, you MUST stop execution, inform the user to approve the notification in their Monzo mobile app, and wait for their confirmation.
Analyze spending patterns over a time period. Args: days: Number of days to analyze (default 30, max 90 due to SCA). account_id: The account to analyze. Leave empty for default. If the response indicates SCA is required, you MUST stop execution, inform the user to approve the notification in their Monzo mobile app, and wait for their confirmation.
Tool annotations missing. No readOnlyHint, destructiveHint, or idempotentHint declarations. All tools are read-only (except monzo_complete_auth which is write), but this is not formally declared in schema.
Parameter format constraints not formalized in schema. ISO 8601 timestamps documented in text (since, before) but no format/pattern in JSON Schema. LLMs may pass invalid formats.