Skip to main content
Glama
pimvanoerle

open-banking-mcp

by pimvanoerle

open-banking-mcp

An MCP server that gives Claude read-only access to UK bank accounts through TrueLayer's Data API — one integration covering Monzo, Starling, HSBC, Barclays, Lloyds, NatWest, Nationwide, Santander and most other UK banks.

Read-only by design: this server requests Data API scopes only. There is no code path here that can move money.

Status: working against TrueLayer's sandbox. Not yet tried against a real bank connection.

Setup

1. Create a TrueLayer console account

  1. Sign up at console.truelayer.com — free, instant, Google/GitHub SSO or email.

  2. New accounts start in the sandbox environment, which is what you want first. Sandbox has a mock bank, no rate limits and no real money.

  3. Click Create App + and give it a client id: 4–30 lowercase letters and digits, no special characters. It cannot be changed later. Sandbox apps get a sandbox- prefix automatically.

  4. Copy the client secret from the credentials screen — it is shown once. You can mint more later under the app's Settings page.

  5. Under the app's settings, add a redirect URI of http://localhost:8080/callback. This must match byte for byte what the server sends, including the scheme and path; a mismatch is the single most common cause of auth failures.

2. Configure

export TRUELAYER_CLIENT_ID=sandbox-yourapp
export TRUELAYER_CLIENT_SECRET=...
export TRUELAYER_REDIRECT_URI=http://localhost:8080/callback
export TRUELAYER_ENV=sandbox          # or "production"

Optional:

Variable

Default

Purpose

TRUELAYER_SCOPES

all Data API scopes

Space-separated scope list

TRUELAYER_PROVIDERS

uk-cs-mock (sandbox)

Which banks to offer at consent

TRUELAYER_USE_KEYRING

1

Set 0 to store tokens in a file

TRUELAYER_TOKEN_FILE

~/.open-banking-mcp/tokens.json

Implies file storage

TRUELAYER_CACHE_FILE

~/.open-banking-mcp/cache.db

Local SQLite cache

TRUELAYER_MAX_AGE_HOURS

25

Age past which cached data is flagged stale

TRUELAYER_HISTORY_DAYS

365

How far back a full sync pulls

TRUELAYER_PSU_IP

unset

End user's IP; lifts rate limits for user-present calls

3. Connect a bank

open-banking-mcp auth

This opens a browser, you pick a bank and consent, and the tokens land in your macOS Keychain (or a 0600 JSON file on systems without a keyring).

In the sandbox, choose the mock bank and log in with username john, password doejohn1/doe1 through john100/doe100 also work for testing different account shapes. Note that the sandbox reports its provider id as mock, not uk-cs-mock, so that is the name status and logout expect.

open-banking-mcp status          # connected banks + consent countdown
open-banking-mcp logout uk-ob-monzo

Related MCP server: Monarch Money MCP Server

How it reads data

Every read is served from a local SQLite cache by default, refreshed by a daily sync. This is not just a speed trick: TrueLayer caches responses for an hour and throttles unattended callers to roughly 4 calls a day unless the request carries an X-PSU-IP header saying a human is present. An agent checking your accounts on a schedule is exactly the throttled case, so it reads from the cache instead.

open-banking-mcp sync     # pull everything; run this daily
open-banking-mcp cache    # what's stored, and when it last synced

Every response says how old it is:

{
  "data": { "current": 12.0, "available": 112.0, "currency": "GBP" },
  "as_of": "2026-09-11T16:26:19Z",
  "age": "3 hours old",
  "source": "cache",
  "stale": false
}

Past TRUELAYER_MAX_AGE_HOURS (default 25 — a daily sync plus slack) stale flips to true and a warning field is added, so an agent reporting a balance can say how current it is rather than implying it is live.

When you need live figures — you just sent a payment and want to know if it landed — every tool takes fresh=true, which bypasses the cache, queries the bank, and writes the result back:

get_balance(account_id="...", fresh=true)
get_transactions(account_id="...", fresh=true)   # also pulls pending

fresh=true on transactions needs a specific account_id: a live refresh is per-account, not a whole-portfolio sweep. It pulls pending transactions too, which is usually what "did my payment go through" actually means.

Scheduling the daily sync

On macOS, a launchd agent or a cron line is enough:

17 6 * * *  cd ~/dev/openbanking-mcp && .venv/bin/open-banking-mcp sync >> ~/.open-banking-mcp/sync.log 2>&1

MCP tools

Tool

What it does

list_banks

Connected banks and last sync time

list_accounts / list_cards

Accounts and cards

get_balance / get_card_balance

One balance

get_balances

Every balance plus per-currency totals

get_transactions

Query by date range, account, or text search

list_standing_orders / list_direct_debits

Recurring payments

get_identity

Account holder details

sync_now

Refresh the whole cache

cache_status

What the cache holds

All except list_banks, sync_now and cache_status accept fresh.

Connecting it to Claude

{
  "mcpServers": {
    "open-banking": {
      "command": "/absolute/path/to/.venv/bin/open-banking-mcp-server",
      "env": {
        "TRUELAYER_CLIENT_ID": "sandbox-yourapp",
        "TRUELAYER_CLIENT_SECRET": "...",
        "TRUELAYER_ENV": "sandbox"
      }
    }
  }
}

Open Banking consent lasts 90 days under FCA rules, then you must re-authorise in a browser — there is no way around this. status shows the countdown per bank and colours it amber at 21 days and red at 7.

Token storage

Tokens go in the OS keychain by default (service name open-banking-mcp, one entry per bank). A plaintext list of which banks are connected — no secrets — lives at ~/.open-banking-mcp/providers.json, because keyrings can't be enumerated.

Set TRUELAYER_TOKEN_FILE to use a 0600 JSON file instead, on Linux or CI where no keyring daemon is running. The server falls back to this automatically if it finds no usable keyring backend.

Development

python3 -m venv .venv && .venv/bin/pip install -e ".[dev]"
.venv/bin/pytest

Licence

MIT

Available Tools

12 tools
cache_statusA

Show what the local cache holds and when it was last refreshed.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.5/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. It does signal a read-only inspection ("Show") and discloses that freshness information is returned, which is useful behavioral context, but it says nothing about side effects, permissions, or whether stale data is flagged.

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?

A single front-loaded sentence that wastes nothing and covers both what the cache contains and its recency.

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?

No output schema exists, so the description must convey return content; it does so at a summary level (cache contents plus last-refresh time). For a zero-parameter status tool this is close to complete, though it lacks detail on the shape or format of those values.

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?

The tool takes zero parameters, so the baseline is 4. There is nothing for the description to disambiguate, and it correctly omits parameter talk.

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

Purpose4/5

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

The description gives a specific verb ("Show") and resource ("the local cache") plus its content scope ("what it holds") and freshness ("last refreshed"). It is clearly distinct from the banking data siblings and from sync_now, though it never names or contrasts against them explicitly.

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?

There is no guidance on when to reach for this versus the closely related sync_now sibling, nor any stated preconditions. The only hint is the implied read-only "Show" framing; the agent must infer the use case entirely.

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

get_balanceB

Get the current and available balance for one account.

Use fresh=true when the answer must reflect a payment made moments ago.

ParametersJSON Schema
NameRequiredDescriptionDefault
freshNo
account_idYes
provider_idNo

TDQS

B3.2/5.0
Behavior3/5

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

With no annotations, the description carries the disclosure burden. It does reveal a meaningful behavioral trait – that results may be cached/stale by default and fresh=true forces a more up-to-date read – but says nothing about permissions, cost/latency of a fresh read, or error behavior.

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, front-loaded with the core purpose and immediately followed by the one conditional that changes invocation behavior. No filler.

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

Completeness2/5

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

For a tool with no annotations, no output schema, and 0% parameter documentation, the description is thin. It omits what 'current' vs 'available' balance means in the response, the role of provider_id, and any freshness/latency caveat beyond the one example.

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

Parameters2/5

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

Schema description coverage is 0% across 3 parameters, so the description must compensate. It explains the intent of fresh but not its exact effect, and leaves account_id and provider_id (and the provider_id null default) entirely unaddressed; an agent cannot tell what provider_id is for or when to supply it.

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

Purpose4/5

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

States a specific verb and resource ('Get the current and available balance') and scopes it to 'one account', which implicitly distinguishes it from the plural sibling get_balances and from get_card_balance. It does not name those siblings explicitly, so differentiation is inferable rather than stated.

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?

Provides one concrete usage condition for the fresh parameter ('when the answer must reflect a payment made moments ago'), which is genuinely useful. However, there is no guidance on when to pick this tool over get_balances or get_card_balance, so tool selection is left to inference.

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

get_balancesC

Get balances for every account and card at once -- the 'how am I doing' view.

ParametersJSON Schema
NameRequiredDescriptionDefault
freshNo
provider_idNo

TDQS

C2.9/5.0
Behavior2/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, and it discloses almost nothing beyond the aggregate scope. It never says whether this is a cached read, whether it hits the network or triggers a provider sync, or what the freshness guarantees are - all relevant given the undocumented 'fresh' flag. No permissions, rate-limit, or response-shape context is given.

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

Conciseness4/5

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

A single front-loaded sentence with the primary action first and the scope qualifier close behind. The quoted tagline is slightly fluffy but does add a usable framing at minimal cost.

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

Completeness2/5

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

With no annotations, no output schema, and 0% parameter coverage, the description leaves the agent without enough to call this correctly or interpret the result. It does not explain the fresh/refresh behavior, the provider_id filter, or what the returned balances look like.

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

Parameters2/5

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

Schema description coverage is 0% and neither of the two parameters is mentioned in the description. 'fresh' (evidently a refresh-from-provider flag) and 'provider_id' (evidently a scoping filter) are left entirely unexplained, and the phrase 'every account and card' does nothing to clarify how provider_id narrows the result.

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

Purpose4/5

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

States a specific verb ('Get') and resource ('balances') with an explicit scope qualifier ('for every account and card at once') that distinguishes it from the singular get_balance and get_card_balance siblings. It stops short of naming those alternatives directly, so the differentiation is implied rather than stated.

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 tagline 'the "how am I doing" view' implies an aggregate/summary use case, which is a reasonable hint about when to reach for this over the single-account tools. However, there is no explicit when-to-use or when-not-to-use guidance and no sibling is named, leaving the agent to infer the routing.

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

get_card_balanceC

Get a card's balance, credit limit and payment due details.

ParametersJSON Schema
NameRequiredDescriptionDefault
freshNo
card_idYes
provider_idNo

TDQS

C2.7/5.0
Behavior2/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 implies a read but says nothing about caching, authentication, rate limits, or what the 'fresh' flag actually changes (cached vs live fetch), which is the one behavior that materially affects the call.

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

Conciseness4/5

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

A single tight sentence that front-loads the verb and resource with no filler. It is appropriately sized for the tool, though it is arguably too terse given the undocumented parameters.

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

Completeness2/5

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

With no annotations, no output schema, and 0% parameter coverage, the description should do more. It helpfully enumerates the returned fields, but leaves the fresh/provider_id semantics and the distinguishing behavior versus get_balance entirely unaddressed.

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

Parameters2/5

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

Schema description coverage is 0% across 3 parameters. card_id is inferable from the description, but provider_id (nullable) and especially fresh (boolean, default false) are completely unexplained in both schema and description, so an agent cannot know when to set them.

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

Purpose4/5

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

States a specific verb (Get) and resource (card's balance) and even names the returned fields: balance, credit limit, payment due details. It is clearly distinct from the account-oriented get_balance in the resource it targets, though it never explicitly contrasts itself with get_balance/get_balances, so it stops short of a 5.

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?

There is no when-to-use guidance at all, and the sibling set contains get_balance and get_balances, so an agent must guess whether this is the card-scoped variant or a duplicate. No prerequisites or conditions are stated.

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

get_identityC

Get the account holder's identity as the bank holds it.

ParametersJSON Schema
NameRequiredDescriptionDefault
freshNo
provider_idNo

TDQS

C2.6/5.0
Behavior2/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 conveys only that this is a retrieval of identity; it says nothing about authentication/consent requirements (KYC/PII sensitivity), rate limits, caching behavior, or what happens when a provider connection is stale.

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

Conciseness4/5

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

A single efficient sentence with the resource front-loaded. It is tight and readable, though arguably under-specified rather than purely concise.

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

Completeness2/5

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

For a simple two-optional-parameter read tool with no output schema, the description is still too thin: the two parameters that govern its behavior (fresh, provider_id) are undocumented and no return shape or sensitivity constraints are given.

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

Parameters1/5

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

Schema coverage is 0% for two parameters, and the description explains neither. 'fresh' is particularly cryptic — it presumably controls cache bypass or a forced re-fetch from the bank, but the agent is left to guess. 'provider_id' is also unexplained and its null default is ambiguous.

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

Purpose4/5

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

States a specific verb (Get) and resource (account holder's identity), and the qualifier 'as the bank holds it' signals this is the authoritative bank-side record rather than any cached or derived view. An agent can distinguish it from get_balance, get_transactions, and the list_* siblings.

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?

There is no guidance on when to call this versus sync_now, cache_status, or the other get_* tools, and no mention of prerequisites. The 'fresh' parameter strongly implies a caching decision that the description never addresses.

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

get_transactionsA

Query transactions across accounts and cards.

Dates are YYYY-MM-DD and the range is inclusive. search matches the description or merchant name. Omit account_id to search every account. fresh=true re-pulls one account from the bank first, so it needs account_id.

ParametersJSON Schema
NameRequiredDescriptionDefault
freshNo
limitNo
searchNo
to_dateNo
from_dateNo
account_idNo
provider_idNo
include_pendingNo

TDQS

A3.5/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 and does disclose meaningful traits: date format and inclusive range, what `search` matches against, the effect of omitting account_id, and the fresh=true dependency on account_id. It still omits limit/pagination behavior and the include_pending default, but the behavioral coverage is well above average.

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?

Four tight sentences, each adding distinct information with zero filler, and the resource scope is front-loaded. Every clause earns its place.

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 an 8-parameter tool with no annotations and no output schema, the description covers the highest-value behaviors but leaves three parameters undocumented. Return values need no explanation since no output schema exists, but the parameter gaps keep this from being 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?

Schema coverage is 0% across 8 parameters, so the description must compensate. It documents from_date/to_date, search, account_id, and fresh (5 of 8), but leaves limit, provider_id, and include_pending entirely unexplained in both schema and description.

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

Purpose4/5

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

States a specific verb (Query) and resource (transactions) with scope (across accounts and cards), which cleanly separates it from siblings like get_balance and list_accounts. However, it does not explicitly name or contrast with any sibling tool, so differentiation is implied rather than stated.

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?

The description offers scoping hints (omit account_id to search every account) but never states when to choose this tool over alternatives such as get_balance or list_standing_orders. No when-not conditions or alternative routing are given.

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

list_accountsA

List bank accounts, with sort code and account number where available.

Set fresh=true to bypass the local cache and query the bank directly.

ParametersJSON Schema
NameRequiredDescriptionDefault
freshNo
provider_idNo

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 full burden; it does disclose caching behavior and that some fields may be absent ('where available'), which is useful context. It says nothing about authentication requirements, rate limits, or whether the cache is stale by default.

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 front-loaded sentences with no wasted words: the resource and returns come first, the flag behaviour second.

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?

There is no output schema, and the description only partially covers the return shape (sort code, account number) and omits provider_id semantics entirely. Adequate but with clear gaps for a two-parameter listing tool.

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?

Schema coverage is 0%, so the description must compensate. It fully explains fresh=true, but provider_id is left entirely undocumented in both the schema and the description, leaving half the parameters opaque.

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

Purpose4/5

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

States a specific verb and resource ('List bank accounts') and even names the fields returned (sort code, account number). It is distinguishable from siblings like list_banks and list_cards by the resource noun, but it never explicitly contrasts itself with those near-neighbours.

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 gives a clear condition for the fresh flag ('bypass the local cache and query the bank directly'), but offers no guidance on when to prefer this tool over get_balances, get_balance, or list_banks. Usage is implied by the resource, not stated.

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

list_banksB

List connected banks and when each was last synced.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.2/5.0
Behavior2/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, yet it discloses almost nothing: no pagination behavior, no ordering, no auth requirements, and no indication of what happens when no banks are connected. It only hints at the return content via 'last synced'.

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?

A single front-loaded sentence with no filler; every word contributes to the meaning.

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 trivial read-only list with no parameters and no annotations, the description is adequate, and it partially compensates for the missing output schema by naming the returned fields. However, with no output schema and no annotations, more detail on the response shape or empty-state behavior would help.

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?

The tool takes zero parameters, so there is nothing for the description to disambiguate; the baseline for a no-parameter tool applies.

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

Purpose4/5

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

The description states a specific verb ('List') and resource ('connected banks') plus an extra returned attribute ('when each was last synced'), which clearly separates it from siblings like list_accounts or list_cards. It does not explicitly name or contrast against any alternative, but the resource itself 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 Guidelines2/5

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

There is no guidance on when to reach for this tool versus list_accounts, list_cards, or get_balances, nor any stated prerequisites such as requiring banks to be connected first. Usage is only inferable from the name and resource.

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

list_cardsC

List credit and debit cards.

ParametersJSON Schema
NameRequiredDescriptionDefault
freshNo
provider_idNo

TDQS

C2.4/5.0
Behavior2/5

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

With no annotations, the description carries the full burden, and it discloses nothing: no read-only confirmation, pagination, rate limits, or caching behavior. The 'fresh' parameter implies a cache interaction with siblings like cache_status and sync_now that is never explained.

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

Conciseness3/5

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

A single front-loaded sentence with no waste, but its brevity comes from under-specification rather than efficiency. There is nothing to trim, yet it earns little.

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

Completeness2/5

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

A two-parameter list tool with no annotations and no output schema, and the description supplies none of the missing context: filtering behavior of provider_id, meaning of fresh, or what a card record contains. Inadequate for correct invocation.

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

Parameters1/5

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

Schema description coverage is 0%, and the description mentions neither 'fresh' nor 'provider_id'. The non-obvious 'fresh' boolean—presumably whether to bypass a cache—is left completely undefined, so an agent cannot know how to set it.

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

Purpose4/5

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

States a specific verb (List) and resource (credit and debit cards), which is enough to separate it from list_banks and list_accounts. It stops short of any scope or sibling differentiation (e.g., versus get_card_balance), so it is clear but thin.

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 guidance on when to call this versus get_card_balance, list_accounts, or sync_now. The agent is left to infer usage entirely from the name.

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

list_direct_debitsC

List direct debits on an account (Open Banking providers only).

ParametersJSON Schema
NameRequiredDescriptionDefault
freshNo
account_idYes
provider_idNo

TDQS

C2.9/5.0
Behavior2/5

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

No annotations exist, so the description carries the full behavioral burden. 'List' implies a read-only operation and the provider restriction is disclosed, but there is no mention of pagination, caching/freshness behavior (despite a 'fresh' param existing), or what happens for unsupported providers.

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

Conciseness4/5

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

A single tight sentence with the resource front-loaded and the scope qualifier appended. Zero filler, though it is arguably too terse given the undocumented parameters.

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

Completeness2/5

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

With no annotations, no output schema, and 0% parameter coverage, the description needs to do much more than one sentence. An agent still cannot tell what 'fresh' toggles or when provider_id is required, so the definition is incomplete for correct invocation.

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

Parameters2/5

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

Schema description coverage is 0% across three parameters, so the description must compensate and largely does not. 'On an account' weakly implies account_id, but neither 'fresh' nor 'provider_id' is explained, leaving two of three parameters semantically opaque.

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

Purpose4/5

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

States a specific verb (list) and resource (direct debits) scoped to an account, which clearly differentiates it from siblings like list_standing_orders and list_transactions. The 'Open Banking providers only' qualifier further narrows intent. It lacks explicit routing language but 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 parenthetical '(Open Banking providers only)' gives an implied applicability condition, which is more than nothing. However, it does not say when to choose this over list_standing_orders or what to do for non-Open-Banking providers, leaving the agent to infer usage.

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

list_standing_ordersB

List standing orders on an account (Open Banking providers only).

ParametersJSON Schema
NameRequiredDescriptionDefault
freshNo
account_idYes
provider_idNo

TDQS

B3.1/5.0
Behavior3/5

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

With no annotations provided, the description carries the full disclosure burden. It usefully surfaces a provider-type constraint (Open Banking only) and the "List" verb implies a read-only operation, but it says nothing about permissions required, whether results are cached vs. fetched live, or result volume/pagination behavior.

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

Conciseness4/5

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

A single tight sentence with the resource front-loaded and the constraint attached immediately after. Nothing is wasted, though the extreme brevity comes at the cost of the behavioral and parameter detail noted elsewhere.

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

Completeness2/5

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

No output schema, no annotations, and three parameters at 0% schema coverage leave the definition materially incomplete. The unexplained "fresh" parameter and the absence of any return-shape or safety context mean an agent cannot call this confidently without guessing.

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

Parameters2/5

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

Schema description coverage is 0% across three parameters. The description implies account_id through the phrase "on an account," but the non-obvious "fresh" flag and optional provider_id are never explained — notably whether "fresh" forces a live refresh rather than a cached response. It fails to compensate for the coverage gap.

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

Purpose4/5

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

States a specific verb and resource ("List standing orders") scoped to an account, which distinguishes it from siblings like list_direct_debits and list_cards by resource alone. The parenthetical adds a real provider restriction ("Open Banking providers only"), though it does not explicitly name a sibling alternative.

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?

Usage is implied: use this to retrieve standing orders for a given account, and only for Open Banking providers. There is no explicit statement of when not to use it, nor any pointer to an alternative tool if the provider is not Open Banking-enabled — the agent must infer what to do in that case.

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

sync_nowA

Pull everything from the bank into the local cache.

Normally a scheduled job does this daily; call it when you need the whole cache refreshed rather than one account.

ParametersJSON Schema
NameRequiredDescriptionDefault
provider_idNo
history_daysNo

TDQS

A3.5/5.0
Behavior3/5

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

No annotations, so the description carries the full burden. It usefully discloses that this bulk refresh is normally a daily background job (implying it is heavy / a fallback), but says nothing about cost, duration, rate limits, or how it interacts with the cache (overwrite vs merge). For an unannotated bulk mutation of local state, that leaves gaps.

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 tight sentences with the action front-loaded and the trigger condition immediately after. 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 2-param, no-output-schema, no-annotation tool, the description explains the operation and its default trigger but omits all parameter meaning and any sense of return/status (e.g., relationship to cache_status). Adequate but with clear gaps.

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

Parameters2/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 explain the two parameters and does not. Neither provider_id nor history_days is mentioned; in fact 'pull everything' sits uneasily with a provider_id that would narrow the scope, leaving an ambiguity the agent cannot resolve.

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

Purpose4/5

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

States a concrete verb and effect: 'Pull everything from the bank into the local cache.' The phrase 'rather than one account' implicitly scopes it against the per-account readers in the sibling list, giving reasonable differentiation, though it never names a specific sibling tool.

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 explicit when-to-use guidance ('call it when you need the whole cache refreshed rather than one account') and notes the normal trigger is a daily scheduled job, so the agent knows this is the manual override. It stops short of naming which sibling to prefer for single-account reads.

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. 12 tool updatesv0.1.0
    • First observedcache_status
    • First observedget_balance
    • First observedget_balances
    • First observedget_card_balance
    • First observedget_identity
    • First observedget_transactions
    • First observedlist_accounts
    • First observedlist_banks
    • First observedlist_cards
    • First observedlist_direct_debits
    • First observedlist_standing_orders
    • First observedsync_now

TDQS

B3.3/5.0

Scored across 12 tools

Disambiguation5/5

Each tool targets a distinct resource or aggregation level: banks, accounts, cards, individual balances, aggregate balances, transactions, standing orders, direct debits, identity, and cache operations. Although get_balance, get_card_balance, and get_balances all relate to balances, their scopes are clearly separated by description.

Naming Consistency4/5

Most tools follow a predictable verb_noun pattern (list_banks, get_balance, list_standing_orders). Two outliers—sync_now and cache_status—break the pattern slightly, but the overall set remains readable and consistent.

Tool Count5/5

12 tools is well within the typical 3-15 range for a focused domain server and each tool earns its place by covering a distinct part of the open banking read surface.

Completeness4/5

The server provides broad read-only coverage for open banking data: banks, accounts, cards, balances, transactions, standing orders, direct debits, identity, and cache management. Minor gaps exist—such as payment initiation, payee/beneficiary listing, or individual transaction lookup—but these are likely outside the intended read-only scope.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Provides read-only access to Tiller Money financial data in Google Sheets, enabling natural language queries for accounts, transactions, categories, and budgets through Claude Desktop.
    10
    MIT
  • A
    license
    Not graded
    quality
    F
    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
    C
    maintenance
    Read-only Monzo banking integration for Claude Code that allows querying balances, transactions, pots, and spending analysis through natural conversation.
    4
    MIT
  • F
    license
    A
    quality
    D
    maintenance
    Exposes SimpleFIN bank data (accounts and transactions) as tools for Claude Code, enabling users to connect to bank accounts, list balances, and fetch transactions.
    4
    -