{"id":"ee91f6fc-3135-49aa-9793-c5895fb2faec","slug":"samaxbytez-monzo-mcp","kind":"mcp","name":"monzo-mcp","summary":"MCP server for the Monzo banking API — check balances, list transactions, and manage pots from any MCP-compatible AI client","owner":"samaxbytez","repoUrl":"https://github.com/samaxbytez/monzo-mcp","license":"MIT","licenseTier":"permissive","trust":"community","stars":2,"match":null,"fewStars":true,"format":"mcp","createdAt":"2026-02-14T12:24:48.000Z","addedAt":"2026-10-21T20:36:01.679Z","logoUrl":"https://avatars.githubusercontent.com/u/107587555?u=3a880fb4d1bb8a8281d8881104a3708801592529&v=4","linkOnly":false,"collection":null,"skillPath":null,"categories":["cloud-infra"],"tags":[],"runtime":"node","local":true,"cloudCapable":false,"cloudCapability":"unknown","cloudReadyOnPlatform":false,"needsApiKey":false,"reviewed":false,"syncedAt":"2026-10-26T22:02:31.696Z","sample":false,"url":"https://conduits.dev/tools/samaxbytez-monzo-mcp","language":"TypeScript","transports":["stdio"],"install":{"npm":"monzo-mcp"},"requirements":{"env":[],"upstreamMayCharge":false},"tools":null,"readme":"# monzo-mcp\n\n[![npm version](https://img.shields.io/npm/v/monzo-mcp.svg)](https://www.npmjs.com/package/monzo-mcp)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\nAn MCP (Model Context Protocol) server for the [Monzo banking API](https://docs.monzo.com). Connect Claude and other AI assistants to your Monzo account to check balances, view transactions, manage pots, and more.\n\nWorks with any MCP-compatible client, including Claude Desktop, Claude Code, Cursor, Windsurf, Cline, and others. Provides 19 tools covering accounts, transactions, pots, feed items, attachments, receipts, and webhooks.\n\n> **Note:** The Monzo Developer API is for personal use only. You can only connect to your own account or a small number of explicitly allowed users.\n\n## Features\n\n- **Accounts** - Verify identity, list accounts, get balance\n- **Pots** - List pots, deposit into and withdraw from pots\n- **Transactions** - List transactions, get details, annotate with metadata\n- **Feed** - Create custom feed items in the Monzo app\n- **Attachments** - Upload images and attach them to transactions\n- **Receipts** - Create, get, and delete digital receipts\n- **Webhooks** - Register, list, and delete real-time webhooks\n\n## Prerequisites\n\nYou need a **Monzo Access Token**. To get one:\n\n1. Go to [developers.monzo.com](https://developers.monzo.com) and log in with your Monzo email\n2. Go to the [API Playground](https://developers.monzo.com/api/playground) and click **Auth**\n3. Approve the **push notification** on your Monzo app (PIN, fingerprint, or Face ID)\n4. Copy the **Access Token** shown in the Playground\n\n**Important notes about tokens:**\n- Tokens expire after approximately **6 hours**\n- After authentication, you have **5 minutes** of full transaction history access; after that, only the **last 90 days** are available\n- Generating a new token **invalidates** the previous one\n\n## Installation\n\n### Using npx (recommended)\n\n```bash\nnpx monzo-mcp\n```\n\n### Global install\n\n```bash\nnpm install -g monzo-mcp\nmonzo-mcp\n```\n\n### Build from source\n\n```bash\ngit clone https://github.com/samaxbytez/monzo-mcp.git\ncd monzo-mcp\nnpm install\nnpm run build\nnode build/index.js\n```\n\n## Configuration\n\n### Environment Variables\n\n| Variable | Required | Description |\n|----------|----------|-------------|\n| `MONZO_ACCESS_TOKEN` | Yes | Your Monzo API access token |\n\n### Claude Desktop\n\nAdd to your Claude Desktop config (`~/Library/Application Support/Claude/claude_desktop_config.json`):\n\n```json\n{\n  \"mcpServers\": {\n    \"monzo\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"monzo-mcp\"],\n      \"env\": {\n        \"MONZO_ACCESS_TOKEN\": \"your_access_token_here\"\n      }\n    }\n  }\n}\n```\n\n### Claude Code\n\nAdd to your project's `.mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"monzo\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"monzo-mcp\"],\n      \"env\": {\n        \"MONZO_ACCESS_TOKEN\": \"your_access_token_here\"\n      }\n    }\n  }\n}\n```\n\n### Other MCP Clients\n\nSet the `MONZO_ACCESS_TOKEN` environment variable and run:\n\n```bash\nMONZO_ACCESS_TOKEN=your_token npx monzo-mcp\n```\n\n## Architecture\n\n```\nmonzo-mcp/\n├── src/\n│   ├── index.ts              # Entry point, server setup\n│   ├── client.ts             # Monzo API HTTP client\n│   ├── utils.ts              # Shared utilities (jsonResponse, errorResponse, etc.)\n│   ├── client.test.ts        # Client tests\n│   ├── utils.test.ts         # Utils tests\n│   └── tools/\n│       ├── accounts.ts       # Account info and balance tools\n│       ├── pots.ts           # Pot management tools\n│       ├── transactions.ts   # Transaction tools\n│       ├── feed.ts           # Feed item tools\n│       ├── attachments.ts    # Attachment tools\n│       ├── receipts.ts       # Receipt tools\n│       ├── webhooks.ts       # Webhook tools\n│       └── tools.test.ts     # Tool handler tests\n├── package.json\n├── tsconfig.json\n└── README.md\n```\n\n**Design decisions:**\n- Uses Pattern A (Simple Bearer Token) since Monzo uses personal access tokens\n- One file per tool category for clean separation of concerns\n- All tool handlers use consistent `logToolCall()` + `try/catch` + `jsonResponse()`/`errorResponse()` pattern\n- Amounts are in **pence** (minor units) as per Monzo API convention\n\n## Tools Reference\n\n### Accounts (3 tools)\n\n| Tool | Description | API Endpoint |\n|------|-------------|-------------|\n| `monzo_whoami` | Verify authenticated user, returns user ID and auth type | `GET /ping/whoami` |\n| `monzo_list_accounts` | List all accounts, optionally filter by type (`uk_retail`, `uk_retail_joint`) | `GET /accounts` |\n| `monzo_get_balance` | Get account balance, total balance, currency, and spend today (in pence) | `GET /balance` |\n\n### Pots (3 tools)\n\n| Tool | Description | API Endpoint |\n|------|-------------|-------------|\n| `monzo_list_pots` | List all pots for an account | `GET /pots` |\n| `monzo_deposit_into_pot` | Move money from account into a pot (amount in pence, requires dedupe_id) | `PUT /pots/{pot_id}/deposit` |\n| `monzo_withdraw_from_pot` | Move money from pot back to account (locked pots cannot be withdrawn via API) | `PUT /pots/{pot_id}/withdraw` |\n\n### Transactions (3 tools)\n\n| Tool | Description | API Endpoint |\n|------|-------------|-------------|\n| `monzo_list_transactions` | List transactions with optional since/before/limit filters (90-day limit after 5 min) | `GET /transactions` |\n| `monzo_get_transaction` | Get single transaction details, optionally expand merchant info | `GET /transactions/{id}` |\n| `monzo_annotate_transaction` | Add custom key-value metadata to a transaction | `PATCH /transactions/{id}` |\n\n### Feed (1 tool)\n\n| Tool | Description | API Endpoint |\n|------|-------------|-------------|\n| `monzo_create_feed_item` | Create a custom item in the Monzo app feed with title, body, optional image/URL | `POST /feed` |\n\n### Attachments (3 tools)\n\n| Tool | Description | API Endpoint |\n|------|-------------|-------------|\n| `monzo_upload_attachment` | Get a pre-signed upload URL for an image | `POST /attachment/upload` |\n| `monzo_register_attachment` | Attach an uploaded image to a transaction | `POST /attachment/register` |\n| `monzo_deregister_attachment` | Remove an attachment from a transaction | `POST /attachment/deregister` |\n\n### Receipts (3 tools)\n\n| Tool | Description | API Endpoint |\n|------|-------------|-------------|\n| `monzo_create_receipt` | Create or update a digital receipt on a transaction | `PUT /transaction-receipts` |\n| `monzo_get_receipt` | Get a receipt by external ID | `GET /transaction-receipts` |\n| `monzo_delete_receipt` | Delete a receipt | `DELETE /transaction-receipts` |\n\n### Webhooks (3 tools)\n\n| Tool | Description | API Endpoint |\n|------|-------------|-------------|\n| `monzo_register_webhook` | Register a URL for real-time transaction notifications | `POST /webhooks` |\n| `monzo_list_webhooks` | List all webhooks for an account | `GET /webhooks` |\n| `monzo_delete_webhook` | Delete a webhook | `DELETE /webhooks/{id}` |\n\n## Example Prompts\n\n- \"What's my Monzo balance?\"\n- \"Show my recent transactions\"\n- \"List my pots\"\n- \"Move 50 pounds into my Holiday pot\"\n- \"What did I spend at Tesco last week?\"\n- \"Send me a notification in Monzo saying 'Remember to buy milk'\"\n- \"Show me my webhooks\"\n- \"Annotate my last transaction with a note\"\n\n## Development\n\n### Build\n\n```bash\nnpm run build\n```\n\n### Run tests\n\n```bash\nnpm test\n```\n\n### Watch mode\n\n```bash\nnpm run test:watch\n```\n\n### Lint\n\n```bash\nnpm run lint\n```\n\n### Format\n\n```bash\nnpm run format\n```\n\n### Adding new tools\n\n1. Create a new file in `src/tools/` or add to an existing category\n2. Follow the pattern: `registerXxxTools(server, client)` function\n3. Import and call the register function in `src/index.ts`\n4. Add tests in `src/tools/tools.test.ts`\n5. Update this README\n\n## Troubleshooting\n\n### \"Missing required environment variable: MONZO_ACCESS_TOKEN\"\n\nSet the `MONZO_ACCESS_TOKEN` in your MCP server config. See [Prerequisites](#prerequisites).\n\n### \"Monzo API error (401): unauthorized\"\n\nYour access token has expired (tokens last ~6 hours). Get a new one from the [Monzo Playground](https://developers.monzo.com/api/playground).\n\n### \"Monzo API error (403): forbidden\"\n\nYou may need to complete Strong Customer Authentication. Open the Monzo app and check for a pending approval notification.\n\n### Transaction history is empty or limited\n\nAfter 5 minutes post-authentication, the API only returns the last 90 days of transactions. This is a Monzo security restriction.\n\n### Pots withdrawal fails\n\nPots with \"added security\" (locked pots) cannot be withdrawn from via the API. Unlock the pot in the Monzo app first.\n\n### Tools not appearing in Claude\n\n- **Claude Desktop:** Restart the application after updating config\n- **Claude Code:** Restart the MCP server or reload settings\n- Verify your config uses `\"command\": \"npx\"` with `\"args\": [\"-y\", \"monzo-mcp\"]`\n\n## License\n\nMIT\n"}