Skip to main content
Glama
partymola

monzo-mcp

monzo-mcp

CI License: GPL v3 Python 3.13+ Glama MCP Server

Monzo 뱅킹 API용 MCP 서버입니다. 계정, 잔액, 포트, 거래 내역, 지출 분석에 대한 읽기 전용 접근을 제공하며, Claude Code 또는 모든 MCP 클라이언트를 통해 사용할 수 있습니다.

6시간 만에 만료되는 원시 bearer 토큰을 사용하는 다른 Monzo MCP 구현과 달리, 이 서버는 자동 토큰 갱신을 포함한 전체 OAuth를 처리합니다.

기능

  • 읽기 전용 도구 7개 - 쓰기 작업 없음, 자금 이동 없음

  • 자동 갱신 OAuth - 토큰이 자동으로 갱신되며 수동 재생성이 필요 없음

  • 로컬 거래 캐시 - SQLite 데이터베이스가 Monzo의 90일 SCA 기간을 넘어 데이터를 보존

  • 요청 시 자동 동기화 - 캐시 읽기 도구가 오늘 동기화되지 않은 경우 증분 동기화를 자동으로 실행하므로 monzo_sync를 직접 호출할 일이 거의 없습니다

  • 지출 분석 - 카테고리별 분류, 주요 가맹점, 월간 비교

  • 거래 검색 - 캐시된 내역에서 가맹점, 수취인(거래 상대방), 설명 또는 메모로 검색

  • 거래 상대방 세부 정보 - 은행 송금(faster payments, p2p, Bacs)이 수취인 이름, sort code, 계좌 번호와 함께 캐시됩니다

Related MCP server: monzo-mcp

도구

도구

설명

데이터 소스

monzo_list_accounts

유형 및 ID와 함께 계정 나열

실시간 API

monzo_get_balance

현재 잔액 및 오늘 지출 표시

실시간 API

monzo_list_pots

저축 포트 및 잔액 나열

실시간 API

monzo_sync

거래를 로컬 캐시에 동기화

실시간 API -> SQLite

monzo_list_transactions

캐시된 거래 나열/필터링

로컬 캐시(오래된 경우 자동 동기화)

monzo_search_transactions

가맹점/수취인/설명/메모로 검색

로컬 캐시(오래된 경우 자동 동기화)

monzo_spending

카테고리별 분류가 포함된 지출 분석

로컬 캐시(오래된 경우 자동 동기화)

사전 요구 사항

설치

git clone https://github.com/partymola/monzo-mcp.git
cd monzo-mcp
uv venv --python 3.13 .venv
uv pip install -e .

이 패키지는 PyPI에 없습니다. 해당 이름은 관련 없는 프로젝트가 사용 중입니다. 대신 컨테이너 이미지가 게시되며, Docker를 참조하세요.

설정

1. Monzo OAuth 클라이언트 등록

developers.monzo.com으로 이동하여 OAuth 클라이언트를 생성합니다:

  • 리디렉트 URL을 http://localhost:6600/callback으로 설정

  • Client ID와 Client Secret을 기록해 둡니다

2. 인증

monzo-mcp auth

Monzo OAuth를 위해 브라우저가 열립니다. 인증 후 5분 이내에 Monzo 앱에서 로그인을 승인하면 전체 거래 내역에 접근할 수 있습니다(Monzo SCA 기간).

3. Claude Code에 등록

claude mcp add -s user monzo -- /path/to/monzo-mcp/.venv/bin/monzo-mcp

Windows에서는 콘솔 스크립트가 .venv\Scripts\monzo-mcp.exe에 있습니다.

4. 첫 동기화

Claude Code에서 monzo_sync를 실행하여 로컬 거래 캐시를 채웁니다. SCA 기간(최대 11개월 내역)을 활용하려면 인증 직후에 실행하세요.

Docker

이미지는 ghcr.io/partymola/monzo-mcp에 게시됩니다. 태그는 v 접두사를 사용합니다(:vX.Y.Z), :latest는 가장 최근 릴리스를 가리킵니다.

컨테이너에는 볼륨이 필요합니다. 자격 증명과 거래 캐시는 /data에 저장됩니다. 아무것도 마운트하지 않으면 컨테이너는 시작되지만 모든 도구가 '구성되지 않음'을 보고하며, 인증한 내용은 컨테이너가 교체되는 즉시 손실됩니다.

먼저 설정 1단계에 설명된 대로 OAuth 클라이언트를 등록하세요. auth가 Client ID와 secret을 입력받으며, 나중에 제공할 방법이 없습니다. 리디렉트 URL은 소스 설치와 동일한 http://localhost:6600/callback입니다.

명명된 볼륨에 한 번 인증합니다. 실행 전에 대신 바인드 마운트를 사용할지 결정하세요. 나중에 전환하면 다시 인증해야 합니다:

docker volume create monzo-mcp-data
docker run --rm -it \
  -v monzo-mcp-data:/data \
  -p 127.0.0.1:6600:6600 \
  ghcr.io/partymola/monzo-mcp:latest auth

게시된 포트는 OAuth 리디렉트가 컨테이너에 도달할 수 있도록 이 단계에서만 필요합니다. 127.0.0.1에 바인딩하면 콜백 리스너가 네트워크에 노출되지 않습니다. 브라우저는 열리지 않습니다 - 컨테이너에는 브라우저가 없으므로 - 출력된 URL을 복사하세요. 그런 다음 5분 이내에 Monzo 앱에서 로그인을 승인하세요(Monzo SCA 기간 참조).

그런 다음 동일한 볼륨을 재사용하여 서버를 등록합니다:

claude mcp add -s user monzo -- \
  docker run --rm -i -v monzo-mcp-data:/data ghcr.io/partymola/monzo-mcp:latest

-i는 필수입니다 - 서버는 stdin과 stdout을 통해 JSON-RPC로 통신합니다.

즉시 동기화하세요. 11개월 백필은 Monzo 앱에서 승인한 후 5분이 지나면 닫히며(Monzo SCA 기간 참조), 이 방식은 소스 설치보다 더 오래 걸리므로 서버가 등록되는 즉시 monzo_sync를 호출하세요. 이 시점을 놓치면 오류 없이 조용히 90일만 받게 됩니다.

파일을 직접 읽을 수 있는 위치에 보관하려면 명명된 볼륨 대신 바인드 마운트를 사용하세요. 컨테이너는 root로 실행되며 자격 증명을 소유자 전용으로 기록하므로 --user를 사용하지 않으면 root 소유가 됩니다:

mkdir -p ~/monzo-mcp-data/config
docker run --rm -it \
  -v ~/monzo-mcp-data:/data \
  --user $(id -u):$(id -g) \
  -p 127.0.0.1:6600:6600 \
  ghcr.io/partymola/monzo-mcp:latest auth

서버 명령에도 동일한 -v와 --user를 전달하세요. 디렉터리를 먼저 생성하세요. 명명된 볼륨에 --user를 사용하면 실패하는데, 볼륨이 이미지에서 root 소유로 초기화되기 때문입니다.

CLI

monzo-mcp              Start the MCP server (stdio transport)
monzo-mcp auth         Interactive OAuth setup (opens the browser)
monzo-mcp --version    Print the installed package version

구성

모든 설정은 환경 변수를 통해 이루어집니다(선택 사항):

변수

기본값

설명

MONZO_MCP_CONFIG_DIR

<package>/config/

OAuth 자격 증명 및 토큰용 디렉터리

MONZO_MCP_DB_PATH

<package>/monzo.db

SQLite 거래 캐시 경로

MONZO_MCP_CALLBACK_HOST

localhost

auth 콜백 서버가 바인딩되는 인터페이스. 리디렉트 URI에는 영향을 주지 않습니다

컨테이너 이미지는 처음 두 값을 /data 아래로 설정합니다. 패키지 상대 기본값이 인터프리터의 lib 디렉터리로 해석되는데, 이는 마운트할 수 없기 때문입니다. 세 번째 값은 0.0.0.0으로 설정합니다. 게시된 포트는 컨테이너의 브리지 인터페이스를 통해 도착하며 localhost 바인딩은 이를 거부하기 때문입니다.

자격 증명 파일(monzo-mcp auth가 생성):

  • config/monzo_client.json - OAuth 클라이언트 ID 및 secret

  • config/monzo_tokens.json - 액세스 및 리프레시 토큰(자동 갱신됨)

Monzo SCA 기간

Monzo의 강력한 고객 인증(SCA)은 거래 내역 접근을 제한합니다:

  • 앱 승인 후 5분 이내: 최대 약 11개월의 내역

  • 기간 만료 후: 최근 90일만

로컬 SQLite 캐시는 동기화된 모든 거래를 영구적으로 보존하므로 monzo-mcp auth 직후에 monzo_sync를 실행하세요.

특정 범위를 백필하려면 monzo_sync에 since를 전달하세요 - ISO 날짜(2026-01-01) 또는 날짜시간(2026-01-01T14:30:00Z)입니다. 약 90일 이상 거슬러 올라가는 것은 SCA 기간 내에서만 작동하며, 기간 밖에서는 최근 90일만 반환됩니다.

오래된 캐시 거래는 다시 가져올 때만 새 버전에서 추가된 필드(예: 은행 송금의 거래 상대방/수취인 세부 정보)를 얻습니다. 인증 후 전체 동기화는 다시 가져오는 내역에 대해 이 작업을 수행합니다.

보안

  • 쓰기 도구 0개 - 자금을 보내거나, 포트 간 자금을 이동하거나, 거래를 수정할 수 없음

  • Monzo API 자체도 외부 계좌로 자금을 보낼 수 없음

  • 토큰은 config/ 디렉터리에 JSON 파일로 저장됩니다(gitignore 처리됨)

  • 모든 API 호출은 Bearer 토큰 인증을 사용하는 GET 요청입니다

문제 해결

  • "SCA required" 오류 또는 90일치 내역만 표시되는 경우 - monzo-mcp auth를 다시 실행하고 5분 이내에 Monzo 앱에서 로그인을 승인한 후 즉시 동기화하세요(위의 SCA 기간 참조).

  • 토큰 만료 / 갱신 안 됨 - monzo-mcp auth를 다시 실행하여 재인증하세요.

  • "No transaction data available" 오류 - 캐시가 비어 있습니다. 인증 후 monzo_sync(또는 자동 동기화되는 캐시 읽기 도구)를 한 번 호출하세요.

  • Docker에서 모든 도구가 "not configured"를 보고하거나 재시작 후 인증이 유지되지 않는 경우 - /data에 마운트된 것이 없습니다. Docker를 참조하세요. 동일한 볼륨을 auth 실행과 서버 모두에 전달해야 합니다.

  • 승인 후 auth가 "Waiting for callback..."에 머무는 경우 - 콜백이 전달되지 않았습니다. Ctrl-C를 누르고 다시 실행하세요. Docker에서는 포트가 게시되었는지 확인하세요(-p 127.0.0.1:6600:6600).

기여

개발 설정, 테스트 워크플로, pre-commit 훅은 CONTRIBUTING.md를 참조하세요. 변경 사항은 CHANGELOG.md에 기록됩니다.

라이선스

GPL-3.0-or-later. LICENSE를 참조하세요.

Available Tools

7 tools
monzo_get_balanceA

Get current balance for a Monzo account.

Args: account_type: "personal" or "joint" (default: "personal")

Returns balance, spend today, and currency. Also records a balance snapshot.

ParametersJSON Schema
NameRequiredDescriptionDefault
account_typeNopersonal

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral disclosure burden. It usefully discloses return fields and a side effect: 'Also records a balance snapshot.' However, it omits details about authorization, whether the balance is live/cached, or consequences of the snapshot, leaving material ambiguity for a side-effecting read tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact, front-loaded with the core action, and structured into Args and Returns sections. Every sentence earns its place and there is no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter tool with an output schema, the description is mostly sufficient to invoke correctly. It covers the parameter, the return, and a side effect. However, it lacks usage context and enough detail about the snapshot side effect to feel fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description restates the only parameter and its allowed values, which are already present in the schema as an enum with a default. It provides no deeper meaning about what distinguishes personal from joint or how selection works, so it only partially compensates for the absence of schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Get current balance for a Monzo account.' This clearly distinguishes it from siblings like monzo_list_transactions, monzo_list_accounts, and monzo_spending.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No when-to-use or when-not-to-use guidance is provided. It mentions the account_type default but does not explain how to choose between personal and joint, nor does it point to an alternative sibling for cases where a different tool would be more appropriate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

monzo_list_accountsA

List all Monzo accounts with their types and IDs.

Returns account details including whether each is personal or joint, and whether it is open or closed.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations present. The description states it returns account details, but does not explicitly confirm it is read-only or disclose potential side effects. For a simple list, default behavior is assumed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no wasted words, front-loaded with purpose and key return details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter list tool with an output schema, the description sufficiently explains what is returned (type and status), making it complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Zero parameters: schema coverage is 100% trivially, and the description adds no param info (as none needed). Baseline of 4 is appropriate per rubric.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states verb 'List' and resource 'Monzo accounts', specifying returned details (type, status) that distinguish it from siblings like transaction or balance tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit when-to-use or alternatives are provided. Usage is implied from context, but the description lacks direct guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

monzo_list_potsA

List all pots (savings buckets) for a Monzo account.

Args: account_type: "personal" or "joint" (default: "personal")

Returns the account the pots belong to, plus pot names and balances. Also records balance snapshots.

ParametersJSON Schema
NameRequiredDescriptionDefault
account_typeNopersonal

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the behavioral burden. It discloses what the tool returns (account, pot names, balances) and notes an important side effect: "Also records balance snapshots." It does not discuss authentication or rate limits, but for a simple list tool the disclosure is adequate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and well-structured: purpose comes first, followed by the single argument, then return behavior and side effect. Every sentence earns its place and there is no extraneous content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with one optional parameter and an output schema, the description covers purpose, argument semantics, return contents, and the snapshot side effect. Nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description restates the schema's enum and default values for account_type without adding deeper meaning, such as when to choose personal versus joint. Since it is the only optional parameter and the schema already defines it clearly, this is sufficient but not additive.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: "List all pots (savings buckets) for a Monzo account." This clearly distinguishes the tool from the sibling tools, none of which target pots, and the parenthetical clarifies the domain-specific term.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context on what the tool does and documents the account_type choice of personal or joint. It does not explicitly name alternatives or exclusions, but no sibling tool overlaps with listing pots, so the guidance is sufficient for selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

monzo_list_transactionsA

List transactions from the local cache.

Auto-syncs if the cache is stale (last sync before today).

Queries the synced transaction database, not the live API. Bank transfers (faster payments, p2p, bacs) include a counterparty object with the payee name and, where the scheme provides them, sort code and account number.

Returns {"account_type": ..., "transactions": [...]}, where account_type echoes the filter applied and is null when unfiltered.

Args: account_type: "personal" or "joint" (default: all) since: Start date, e.g. "2026-01-01" (inclusive) before: End date, e.g. "2026-02-01" (exclusive) category: Exact category match, e.g. "groceries", "eating_out", "transport" merchant: Merchant name search (case-insensitive, partial match) limit: Max results (default 50)

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
sinceNo
beforeNo
categoryNo
merchantNo
account_typeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations present, the description carries the full burden, and it discloses the most important behaviors: cached-not-live data access, the auto-sync side effect with its staleness threshold, the counterparty enrichment for bank transfers, and the shape of the response envelope. It stops short of a 5 because it does not state what happens if the auto-sync fails (stale data served? error?) or whether results are paginated beyond the limit.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but well-organized: purpose front-loaded in the first line, followed by the cache/sync behavior, the counterparty caveat, the return envelope, and a clean Args block. Every sentence earns its place, and the parameter documentation is scannable rather than prose-heavy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that an output schema exists, the description is not obligated to explain return values in detail, yet it still provides the top-level envelope. All six optional parameters are fully documented, and the tool's complexity is moderate. The only material gap is failure behavior during the auto-sync path and the absence of pagination semantics, which keeps this from a 5.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must document the parameters itself — and it does, exhaustively and with added meaning. It specifies inclusive/exclusive semantics for since/before, exact-match semantics for category, case-insensitive partial-match semantics for merchant, allowed values plus default for account_type, and the max-results behavior for limit, all with concrete examples. This fully compensates for the empty schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first line — 'List transactions from the local cache' — pairs a specific verb (list) with a specific resource (transactions) and a scope qualifier (local cache), immediately distinguishing it from siblings such as monzo_get_balance, monzo_list_pots, and monzo_search_transactions. The follow-up 'not the live API' further sharpens the boundary, making the tool's identity unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context for when the tool is appropriate: it reads from the synced database rather than the live API, and it 'auto-syncs if the cache is stale (last sync before today)', which tells an agent when a prior sync step is unnecessary. It does not explicitly name an alternative tool for cases where live or search-level data is required (e.g., monzo_sync or monzo_search_transactions), so the when-not guidance is implied rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

monzo_search_transactionsA

Search cached transactions by merchant, counterparty (payee), description, or notes.

Auto-syncs if the cache is stale (last sync before today).

Case-insensitive partial match across merchant_name, counterparty_name, description, and notes fields. Counterparty matching finds bank transfers (faster payments, p2p, bacs) by payee name.

Returns {"account_type": ..., "transactions": [...]}, where account_type echoes the filter applied and is null when unfiltered.

Args: query: Search term account_type: "personal" or "joint" (default: all) since: Start date, e.g. "2026-01-01" (inclusive) before: End date, e.g. "2026-02-01" (exclusive) limit: Max results (default 30)

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryYes
sinceNo
beforeNo
account_typeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It discloses case-insensitive partial matching, the exact fields searched, counterparty behavior for bank transfers, cache auto-sync behavior, and the response shape. This is unusually transparent for a search tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded in the first sentence, followed by compact, high-value behavioral details and a clean Args list. Every sentence adds information; there is no redundant filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with five parameters and no annotations, the description covers search matching, cache staleness behavior, date-range semantics, account filtering, result limits, and the returned JSON shape. Nothing essential is missing for an agent to select and invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 0% description coverage, but the description lists every parameter with meaningful detail: query semantics, account_type values, since/before inclusivity with examples, and the limit default. This fully compensates for the schema gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb-resource pair: 'Search cached transactions by merchant, counterparty (payee), description, or notes.' This clearly distinguishes it from sibling tools like monzo_list_transactions or monzo_sync by focusing on search across cached transaction fields.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear usage context: search by named fields, with automatic sync when the cache is stale ('last sync before today'). It stops short of explicitly naming alternatives or saying when not to use the tool, but the intended scenarios are easy to infer.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

monzo_spendingA

Analyse spending from cached Monzo transactions.

Auto-syncs if the cache is stale (last sync before today).

Every result carries account_type, echoing the filter applied and null when unfiltered, so a zero total says which account it measured.

Args: month: Month in YYYY-MM format (default: current month) category: Filter by category, e.g. "groceries", "eating_out", "transport" account_type: "personal" or "joint" (default: all) detail: If true, return individual transactions instead of category summary

ParametersJSON Schema
NameRequiredDescriptionDefault
monthNo
detailNo
categoryNo
account_typeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden. It discloses the auto-sync side effect, the output behavior (account_type echo, null when unfiltered), and the detail switch affecting the return format. This goes beyond the schema and provides useful context, though it does not mention potential side effects like rate limits or error handling. The disclosure is substantial and does not contradict any annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured: a clear summary sentence, a brief note on caching, an explanation of output behavior, and a concise Args list. It is front-loaded with the core purpose, and every sentence adds value. It is appropriately sized for a tool with four parameters and behavioral nuances, with no redundant phrasing.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the tool's purpose, caching behavior, output characteristics, and all parameter semantics. It does not explicitly detail the return schema, but an output schema is available, so that is acceptable. It lacks explicit guidance on when to use this versus siblings, but the purpose is clear enough. Overall, it is nearly complete for an analysis tool, with only minor gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. The Args section provides format (YYYY-MM for month), examples (category values), default behavior (current month, all accounts), and the effect of detail (individual transactions vs summary). This adds rich meaning beyond the bare schema titles and types, fully satisfying the requirement.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Analyse spending from cached Monzo transactions,' which states a specific verb (analyse), a resource (spending from Monzo transactions), and the caching behavior. This clearly distinguishes it from siblings like monzo_list_transactions (which would list raw transactions) and monzo_get_balance (which reads a balance). The purpose is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains what the tool does and mentions auto-sync when the cache is stale, but it does not explicitly state when to prefer this tool over alternatives like monzo_search_transactions or monzo_list_transactions. The usage context is implied by the purpose (spending analysis) but not directly contrasted with siblings, leaving some room for ambiguity.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

monzo_syncA

Sync transactions, balances, and pots from the Monzo API into the local cache.

Fetches up to 11 months of history (within SCA window) or falls back to the last-synced timestamp / 90 days. Handles pagination and auth-hold deduplication automatically.

Args: account_type: "personal", "joint", or None to sync all accounts since: Optional ISO date ("2026-01-01") or datetime ("2026-01-01T14:30:00Z") to start the backfill from, overriding last-sync resumption. Reaching beyond ~90 days only works inside the post-auth SCA window.

ParametersJSON Schema
NameRequiredDescriptionDefault
sinceNo
account_typeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of behavioral disclosure. It transparently covers the 11-month fetch window, the fallback to last-synced timestamp or 90 days, automatic pagination, auth-hold deduplication, and the SCA constraint on deep backfills. It does not address side effects on the local cache or auth prerequisites in detail, but it is substantially transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a purpose statement, a behavior summary, and a clear parameter list. Every sentence adds substantive value, and the most important constraints are front-loaded. There is no redundant restatement of schema information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is complete for a tool with two optional parameters and an output schema. It explains what the tool fetches, the sync window behavior, pagination/deduplication, parameter semantics, and edge cases around the SCA window. Return values are reasonably covered by the output schema, so no extra explanation is needed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it does. It explains account_type values ('personal', 'joint', or None to sync all accounts') and gives precise since formats (ISO date or datetime) plus its override behavior and SCA limitation. This goes well beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Sync') and resource ('transactions, balances, and pots from the Monzo API into the local cache'), clearly distinguishing it from sibling read/list/search tools. It also adds concrete scope details like history depth, pagination, and deduplication.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for refreshing or backfilling a local cache, but it does not explicitly state when to prefer this over sibling tools like monzo_list_transactions or monzo_search_transactions. It gives helpful context around backfill windows and last-sync resumption, but no exclusions or alternative routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

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

  1. 6 tool updatesv0.9.0
    • Changedmonzo_get_balance1 field changed
      • addedInput schema / properties / account_type / enum
        Added value: +[
        +  "personal",
        +  "joint"
        +]
    • Changedmonzo_list_pots1 field changed
      • addedInput schema / properties / account_type / enum
        Added value: +[
        +  "personal",
        +  "joint"
        +]
    • Changedmonzo_list_transactions1 field changed
      • changedInput schema / properties / account_type / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "enum": [
        +      "personal",
        +      "joint"
        +    ],
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedmonzo_search_transactions1 field changed
      • changedInput schema / properties / account_type / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "enum": [
        +      "personal",
        +      "joint"
        +    ],
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedmonzo_spending1 field changed
      • changedInput schema / properties / account_type / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "enum": [
        +      "personal",
        +      "joint"
        +    ],
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedmonzo_sync1 field changed
      • changedInput schema / properties / account_type / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "enum": [
        +      "personal",
        +      "joint"
        +    ],
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
  2. 1 tool updatev0.2.1
    • Changedmonzo_sync1 field changed
      • addedInput schema / properties / since
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Since"
        +}
  3. 7 tool updatesv0.1.0
    • First observedmonzo_get_balance
    • First observedmonzo_list_accounts
    • First observedmonzo_list_pots
    • First observedmonzo_list_transactions
    • First observedmonzo_search_transactions
    • First observedmonzo_spending
    • First observedmonzo_sync

TDQS

A4.1/5.0

Scored across 7 tools

Disambiguation4/5

Tools are mostly distinct, but monzo_search_transactions and monzo_list_transactions both query cached transactions, differing mainly in search vs filter semantics; users could confuse which to use. Spending analysis is distinct as it provides aggregated insights.

Naming Consistency4/5

All tools follow the monzo_ prefix with snake_case and mostly verb_noun pattern (get_balance, list_pots, search_transactions). However, 'monzo_sync' lacks a noun and 'monzo_spending' uses a noun as the action, deviating slightly from the pattern.

Tool Count5/5

Seven tools is well-scoped for a personal finance MCP covering balance, pots, accounts, transactions, and spending analysis. Each tool serves a clear purpose without redundancy.

Completeness4/5

Covers core read-only banking operations: balance, accounts, pots, transaction listing/search, spending analysis, and data synchronization. Missing features like pot transfers or transaction details by ID, but these are beyond typical read-only scope.

Maintenance

ActivityActive
ResponsivenessSlow

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Provides an MCP server for querying and managing Monarch Money personal finance data through a local SQLite mirror with read-only SQL access. It enables users to sync transaction history from the Monarch API and analyze accounts, categories, and tags.
    1
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Read-only Monzo banking integration for Claude Code that allows querying balances, transactions, pots, and spending analysis through natural conversation.
    4
    MIT
  • -
    license
    Not graded
    quality
    Not graded
    maintenance
    Enables interaction with Monzo bank accounts for balance checking, transaction management, pot operations, and reconciliation through natural language.
    -
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables local read-only exploration of Quicken Simplifi financial data through MCP, with tools for searching transactions, categories, tags, and merchants, using a local SQLite cache and token-based authentication.
    1
    MIT