MO

Monzo MCP Server: Manage Balances, Pots, Transactions

Manage Monzo with natural language via the MCP server: check balances, manage pots, and list or annotate transactions across personal, joint and flex accounts.

Quick Install
npx -y @BfdCampos/monzo-mcp-bfdcampos

Overview

This MCP (Model Context Protocol) server provides a bridge between LLM-based agents and the Monzo banking API. It exposes a set of tools that let a model or developer perform common Monzo workflows—check balances across personal, joint and flex accounts, list and annotate transactions, and manage pots—using natural language or explicit tool calls. The server implements an MCP-compatible interface so LLMs can discover and invoke these tools during multi-step reasoning.

For developers building chat assistants, automations, or experimentations with agentic workflows, the Monzo MCP server removes the friction of wiring up OAuth, formatting API calls, and handling Monzo-specific data models. It centralizes account access, provides a small, focused toolset, and returns structured results an LLM can consume or a developer can use directly.

Features

  • Exposes MCP-compatible tools for interacting with Monzo accounts
  • Read balances across personal, joint, and flex accounts
  • List, filter, and annotate transactions (add contextual notes)
  • Create and manage pots; transfer money to/from pots
  • OAuth integration with Monzo (token refresh and secure configuration)
  • Returns structured JSON suitable for LLM consumption or programmatic use
  • Lightweight Node.js service with a simple HTTP interface

Installation / Configuration

Clone the repository and install dependencies:

git clone https://github.com/BfdCampos/monzo-mcp-bfdcampos.git
cd monzo-mcp-bfdcampos
npm install

Create a .env file in the project root with your Monzo API credentials and server settings. Typical environment variables:

# Monzo API credentials
MONZO_CLIENT_ID=your_monzo_client_id
MONZO_CLIENT_SECRET=your_monzo_client_secret
MONZO_REDIRECT_URI=https://yourapp/callback

# A long-lived refresh or access token (if using a personal token)
MONZO_REFRESH_TOKEN=your_monzo_refresh_token_or_token

# Server / MCP settings
PORT=3333
MCP_API_KEY=optinal_api_key_for_local_auth

Start the server (development):

npm run dev
# or for production
npm start

By default the server listens on the configured PORT (3333 if unset). Secure the process and the .env file when running in production.

Available Tools

The server exposes a set of tools (functions) an MCP-compatible LLM or client can invoke. Each tool returns structured JSON and, where relevant, human-readable summaries.

Tool namePurposeKey parameters
check_balanceGet balances for an account or all linked accountsaccount_id / account_type (personal, joint, flex)
list_accountsList available Monzo accounts with metadatanone
list_potsList pots for an accountaccount_id
create_potCreate a new potname, target_amount (optional)
transfer_to_potMove funds into a potamount, pot_id, account_id
transfer_from_potMove funds from a pot back to accountamount, pot_id, account_id
list_transactionsFetch transactions with filters (date range, merchant, min/max amount)start_date, end_date, merchant
annotate_transactionAttach a note or tag to a transactiontransaction_id, note, tags

Example: using the check_balance tool returns a JSON object with account identifiers, current balance, currency and a brief summary string for display.

Available Resources

  • GitHub repository: https://github.com/BfdCampos/monzo-mcp-bfdcampos
  • Monzo Developer Docs: https://docs.monzo.com/ (for API, scopes, and OAuth)
  • MCP (Model Context Protocol) specification (refer to your MCP client library docs) — the server follows a simple MCP tooling pattern so LLMs can call named tools and receive structured outputs.

Use Cases

  1. Quick balance check (natural language)

    • Prompt: “What’s my total balance across personal and joint accounts?”
    • Flow: LLM invokes check_balance for each account; server returns per-account balances and a consolidated total.
  2. Move money into a savings pot

    • Prompt: “Move £100 from my personal account into the ‘Holiday’ pot.”
    • Flow: LLM calls list_pots to find the pot ID, validates funds with check_balance, then calls transfer_to_pot. Server returns transaction ids and status.
  3. Investigate and annotate a transaction

    • Prompt: “List transactions at coffee shops in March and label the latte purchase as ‘business expense’.”
    • Flow: list_transactions with merchant filter, LLM selects the correct transaction_id(s), then calls annotate_transaction with a note or tag. Server stores and returns the annotated entry.
  4. Monthly spending summary

    • Prompt: “Summarize my spending last month by category.”
    • Flow: list_transactions for date range, server returns raw transactions; LLM aggregates and returns a summary breakdown.

Security and Best Practices

  • Treat Monzo credentials and refresh tokens as sensitive secrets; store them in a secrets manager.
  • Limit server exposure (use API keys, network rules, and TLS).
  • Audit which scopes and accounts are granted to the server. For shared or joint accounts ensure consent and appropriate access control.
  • Log