Skip to main content
Glama
monarch-mcp

monarch-mcp

by vargahis

Monarch Money MCP Server

A Model Context Protocol (MCP) server for integrating with the Monarch Money personal finance platform through Claude Desktop.

Overview

  • Secure by design — browser-based login, token stored in OS keychain (never in config files or env vars)

  • Safe by default — read-only mode prevents accidental changes; write tools require explicit opt-in

  • Comprehensive — 44 tools covering accounts, transactions, splits, budgets, cashflow, tags, categories, transaction rules, recurring merchants, and credit history

  • Easy to install — Claude Desktop extension (.mcpb), uvx, or pip

Two operating modes:

The server starts in read-only mode by default. Write tools are hidden and blocked until you explicitly opt in.

Read-only (default)

Write mode

View accounts, transactions, budgets

Yes

Yes

Analyze cashflow, spending, net worth

Yes

Yes

Create transactions, tags, categories, rules

No

Yes

Update accounts, budgets, splits

No

Yes

Delete transactions, tags, accounts

No

Yes

Related MCP server: Monarch Money MCP Server

Quick Start

Installation

Enables toggling write mode on/off directly from the Claude Desktop app.

  1. Download the latest .mcpb from Releases

  2. In Claude Desktop: Settings > Extensions > Advanced Settings > Install Extensions — select the .mcpb file

  3. Restart Claude Desktop

To enable write tools: Settings > Extensions > Monarch Money MCP Server > Configure — toggle "Enable write tools" and click Save.


Also works with Claude Desktop, but write mode cannot be toggled from the app — set it in the config instead.

Add to your MCP config file:

{
  "mcpServers": {
    "Monarch Money": {
      "command": "uvx",
      "args": ["monarch-mcp"]
    }
  }
}

To enable write tools:

{
  "mcpServers": {
    "Monarch Money": {
      "command": "uvx",
      "args": ["monarch-mcp", "--enable-write"]
    }
  }
}

pip install monarch-mcp

Contributors: See docs/releasing.md for the release process, version scheme, and pre-release testing via TestPyPI.

Add to your MCP config using the full path to your Python interpreter:

{
  "mcpServers": {
    "Monarch Money": {
      "command": "/path/to/bin/python3",
      "args": ["-m", "monarch_mcp"]
    }
  }
}

To enable write tools, add "--enable-write" to args.


git clone https://github.com/vargahis/monarch-mcp.git
cd monarch-mcp
pip install -e .

Then add to your MCP config using the Python interpreter from your dev environment:

{
  "mcpServers": {
    "Monarch Money": {
      "command": "/path/to/bin/python3",
      "args": ["-m", "monarch_mcp"]
    }
  }
}

To enable write tools, add "--enable-write" to args.

Authentication

Authentication happens automatically in your browser the first time the MCP server starts without a saved session.

  1. Start (or restart) Claude Desktop

  2. The server detects that no token exists and opens a login page in your browser

  3. Enter your Monarch Money email and password

  4. Provide your 2FA code if you have MFA enabled

  5. Once authenticated, the token is saved to your system keyring — you're all set

Key details:

  • Credentials are entered in your browser only — never through Claude Desktop

  • Token stored in the OS keyring — persists across restarts, lasts weeks/months

  • Expired sessions re-authenticate automatically — the browser login re-triggers on the next tool call

  • MFA fully supported

  • Fallback: run python login_setup.py in a terminal for headless environments

For technical details on the auth architecture, see docs/authentication.md.

Usage Examples

Show me all my financial accounts
What were my last 50 transactions?
How's my budget looking this month?
Analyze my cashflow for the last 3 months
Create a tag called "Business Expenses" in red

Available Tools

Tool

Description

Mode

Auth

setup_authentication

Get setup instructions

read

check_auth_status

Check authentication status

read

debug_session_loading

Debug keyring issues

read

Accounts

get_accounts

Get all financial accounts

read

get_account_holdings

Get investment holdings

read

get_account_history

Get historical balance data

read

get_recent_account_balances

Get daily balances

read

get_account_snapshots_by_type

Net worth by account type

read

get_aggregate_snapshots

Daily aggregate net value

read

get_institutions

Get connected institutions

read

get_account_type_options

Get valid account types

read

refresh_accounts

Request account data refresh

read

create_manual_account

Create manual account

write

update_account

Update account settings

write

delete_account

Delete an account

write

Transactions

get_transactions

Get transactions with filtering (date, account, category, tag, search, needs_review, and more)

read

get_transaction_details

Get full transaction detail

read

get_transactions_summary

Aggregate transaction stats

read

get_transaction_splits

Get split information

read

get_recurring_transactions

Get recurring transactions

read

find_merchant_id_by_name

Search recent transactions for a merchant and return distinct IDs

read

create_transaction

Create new transaction

write

update_transaction

Update existing transaction (clear notes with clear_notes, unlink goal with clear_goal)

write

delete_transaction

Delete a transaction

write

update_transaction_splits

Create/modify/delete splits

write

update_recurring_merchant

Mark/unmark a merchant as recurring, update its frequency/amount, or deactivate it — is_recurring is required on every call (requires --enable-write)

write

Tags

get_transaction_tags

Get all tags

read

create_transaction_tag

Create new tag

write

delete_transaction_tag

Delete a tag

write

set_transaction_tags

Set tags on a transaction

write

Categories

get_transaction_categories

Get all categories

read

get_transaction_category_groups

Get category groups

read

create_transaction_category

Create a category

write

delete_transaction_category

Delete a category

write

Rules

get_transaction_rules

List every transaction rule with its criteria, actions, and recent application stats

read

create_transaction_rule

Create a transaction rule with full criteria + actions (category, tags, merchant, amount, splits…)

write

update_transaction_rule

Update a rule by id; merges overrides onto the current rule (handles Monarch's REPLACE semantics)

write

delete_transaction_rule

Delete a rule by ID

write

Budgets & Cashflow

get_budgets

Get budget information

read

get_cashflow

Get cashflow analysis

read

get_cashflow_summary

Get cashflow summary

read

set_budget_amount

Set budget for category

write

Other

get_subscription_details

Get subscription status

read

get_credit_history

Get credit score history

read

Testing

This project has two complementary test surfaces:

1. Mocked unit tests (the quality gate) — fast, offline, no Monarch connection. These run in CI and must stay green:

uv run pytest tests/

The Monarch client is mocked, so these never touch a real account. Live e2e tests (below) are deselected by default.

2. Live end-to-end (e2e) integration tests — exercise the MCP tools against a real Monarch account to verify they handle the live API robustly (adversarial/edge inputs, server-side error paths). They are opt-in and never run in CI:

MONARCH_LIVE_TESTS=1 uv run pytest tests/integration -m integration

Prerequisites: a stored keyring token (run python login_setup.py once), or MONARCH_EMAIL / MONARCH_PASSWORD in the environment. Without these, the suite skips. The tests create and delete data prefixed with MCP-Test- and self-clean (a post-suite sweep removes any residue). See tests/integration/README.md for details and safety notes.

There is also a separate agent test skill (.claude/skills/test-monarch-mcp/) that drives an AI agent to verify it calls the tools correctly — distinct from the two pytest suites above.

🙏 Acknowledgments

Forked from @robcerda's monarch-mcp-server, maintained by vargahis.

Built on the monarchmoneycommunity Python library.

Thanks to:

License

MIT License

Available Tools

25 tools
check_auth_statusA

Check if already authenticated with Monarch Money.

Inputs: no named parameters. Returns: result

debug_session_loadingC

Debug keyring session loading issues.

Inputs: no named parameters. Returns: result

get_account_historyC

Get historical balance snapshots for an account.

Args: account_id: The ID of the account

Inputs: account_id (required). Returns: result

get_account_holdingsC

Get investment holdings for a specific account.

Args: account_id: The ID of the investment account

Inputs: account_id (required). Returns: result

get_accountsA

Get all financial accounts from Monarch Money.

Inputs: no named parameters. Returns: result

get_account_snapshots_by_typeA

Get net value snapshots grouped by account type.

Args: start_date: Start date in YYYY-MM-DD format timeframe: Aggregation period - "month" or "year"

Inputs: start_date (required), timeframe (required). Returns: result

get_account_type_optionsA

Get available account types and sub-types for creating manual accounts.

Inputs: no named parameters. Returns: result

get_aggregate_snapshotsA

Get daily aggregate net value of all accounts.

Args: start_date: Start date in YYYY-MM-DD format end_date: End date in YYYY-MM-DD format account_type: Filter by account type (optional)

Inputs: start_date, end_date, account_type. Returns: result

get_budgetsB

Get budget information from Monarch Money.

Args: start_date: Start date in YYYY-MM-DD format (default: last month) end_date: End date in YYYY-MM-DD format (default: next month) use_v2_goals: Whether to use v2 goals format (default: True)

Inputs: start_date, end_date, use_v2_goals. Returns: result

get_cashflowB

Get cashflow analysis from Monarch Money.

Args: start_date: Start date in YYYY-MM-DD format (requires end_date; defaults to current month) end_date: End date in YYYY-MM-DD format (requires start_date; defaults to current month)

Inputs: start_date, end_date. Returns: result

get_cashflow_summaryA

Get cashflow summary (income, expenses, savings, savings rate).

Args: limit: Number of records to retrieve (default: 100) start_date: Start date in YYYY-MM-DD format (requires end_date) end_date: End date in YYYY-MM-DD format (requires start_date)

Inputs: limit, start_date, end_date. Returns: result

get_credit_historyA

Get credit score history and related details.

Inputs: no named parameters. Returns: result

get_institutionsA

Get all connected financial institutions and their connection status.

Inputs: no named parameters. Returns: result

get_recent_account_balancesB

Get daily balance for all accounts from a start date.

Args: start_date: Start date in YYYY-MM-DD format (optional)

Inputs: start_date. Returns: result

get_recurring_transactionsC

Get recurring transactions from Monarch Money.

Args: start_date: Start date in YYYY-MM-DD format (requires end_date) end_date: End date in YYYY-MM-DD format (requires start_date)

Inputs: start_date, end_date. Returns: result

get_subscription_detailsB

Get Monarch Money subscription status and details.

Inputs: no named parameters. Returns: result

get_transaction_categoriesA

Get all transaction categories from Monarch Money.

Inputs: no named parameters. Returns: result

get_transaction_category_groupsA

Get all transaction category groups from Monarch Money.

Inputs: no named parameters. Returns: result

get_transaction_detailsA

Get detailed information about a specific transaction.

Args: transaction_id: The ID of the transaction redirect_posted: Whether to redirect to posted transaction (default: True)

Inputs: transaction_id (required), redirect_posted. Returns: result

get_transactionsA

Get transactions from Monarch Money.

Args: limit: Number of transactions to retrieve (default: 100) offset: Number of transactions to skip (default: 0) start_date: Start date in YYYY-MM-DD format (requires end_date) end_date: End date in YYYY-MM-DD format (requires start_date) account_id: Specific account ID to filter by (shorthand for account_ids with one ID) search: Free text search query category_ids: List of category IDs to filter by account_ids: List of account IDs to filter by (cannot use with account_id) tag_ids: List of tag IDs to filter by has_attachments: Filter transactions with/without attachments has_notes: Filter transactions with/without notes hidden_from_reports: Filter transactions hidden/visible in reports is_split: Filter split/unsplit transactions is_recurring: Filter recurring/non-recurring transactions synced_from_institution: Filter synced/manual transactions needs_review: Filter transactions that need review

Inputs: limit, offset, start_date, end_date, +12 more. Returns: result

get_transaction_splitsB

Get split information for a transaction.

Args: transaction_id: The ID of the transaction

Inputs: transaction_id (required). Returns: result

get_transactions_summaryB

Get aggregate transaction summary (count, sum, avg, max, income, expenses).

Inputs: no named parameters. Returns: result

get_transaction_tagsA

Get all transaction tags from Monarch Money.

Inputs: no named parameters. Returns: result

refresh_accountsB

Request account data refresh from financial institutions.

Inputs: no named parameters. Returns: result

setup_authenticationA

Get instructions for setting up secure authentication with Monarch Money.

Inputs: no named parameters. Returns: result

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    B3.2/5.0

    Scored across 25 tools

    Disambiguation5/5

    Each tool targets a distinct aspect of Monarch Money (accounts, transactions, budgets, cashflow, credit, institutions, auth). Even with many transaction-related tools, they differ in scope (e.g., get_transactions vs get_transaction_details vs get_transaction_splits) and have clear parameter distinctions, leaving no ambiguity.

    Naming Consistency4/5

    All tool names use snake_case and follow a verb_noun pattern, which is consistent. However, the verbs vary: most use 'get_', but there are also 'check_', 'debug_', 'setup_', and 'refresh_'. This minor inconsistency prevents a perfect score.

    Tool Count4/5

    With 25 tools, the server is on the larger side but covers many facets of personal finance (accounts, transactions, budgets, cashflow, credit, institutions). Each tool serves a clear purpose, and the count feels justified for the domain, though slightly heavy.

    Completeness2/5

    The tool set is heavily read-focused, lacking any create, update, or delete operations for core entities like accounts, transactions, or budgets. This is a significant gap for agents that need to manage finances, leaving the surface incomplete for typical CRUD workflows.

    Maintenance

    ActivityNo data
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      C
      maintenance
      Enables AI assistants to access and analyze MonarchMoney personal finance data through natural language queries. Provides comprehensive financial insights including account balances, transaction analysis, budget tracking, and spending patterns with enterprise-grade security.
      11
      MIT
    • A
      license
      A
      quality
      D
      maintenance
      Enables integration with Monarch Money to query financial data, analyze spending patterns, track budgets, and get personalized financial insights through conversational AI with Claude Desktop.
      11
      3
      ISC
    • A
      license
      Not graded
      quality
      D
      maintenance
      Provides read-only access to Monarch Money financial data, enabling AI assistants to analyze transactions, budgets, and cashflow.
      4
      MIT
    • A
      license
      Not graded
      quality
      B
      maintenance
      Interactive UI for Monarch Money inside claude.ai, running on Monarch's official OAuth. Provides interactive widgets for transactions, spending, and accounts with inline editing and broad data-tool coverage.
      MIT