open-banking-mcp
Provides read-only access to Barclays bank accounts via TrueLayer's Data API, including account and card balances, transactions, standing orders, direct debits, and account holder identity.
Provides read-only access to HSBC bank accounts via TrueLayer's Data API, including account and card balances, transactions, standing orders, direct debits, and account holder identity.
Provides read-only access to Monzo bank accounts via TrueLayer's Data API, including account and card balances, transactions, standing orders, direct debits, and account holder identity.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@open-banking-mcphow much money is in my accounts right now?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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
Sign up at console.truelayer.com — free, instant, Google/GitHub SSO or email.
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.
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.Copy the client secret from the credentials screen — it is shown once. You can mint more later under the app's Settings page.
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 |
| all Data API scopes | Space-separated scope list |
|
| Which banks to offer at consent |
|
| Set |
|
| Implies file storage |
|
| Local SQLite cache |
|
| Age past which cached data is flagged stale |
|
| How far back a full sync pulls |
| unset | End user's IP; lifts rate limits for user-present calls |
3. Connect a bank
open-banking-mcp authThis 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
doe — john1/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-monzoRelated 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 syncedEvery 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 pendingfresh=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>&1MCP tools
Tool | What it does |
| Connected banks and last sync time |
| Accounts and cards |
| One balance |
| Every balance plus per-currency totals |
| Query by date range, account, or text search |
| Recurring payments |
| Account holder details |
| Refresh the whole cache |
| 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"
}
}
}
}Consent expiry
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/pytestLicence
MIT
Available Tools
12 toolscache_statusA
Show what the local cache holds and when it was last refreshed.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| fresh | No | ||
| account_id | Yes | ||
| provider_id | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| fresh | No | ||
| provider_id | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| fresh | No | ||
| card_id | Yes | ||
| provider_id | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| fresh | No | ||
| provider_id | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| fresh | No | ||
| limit | No | ||
| search | No | ||
| to_date | No | ||
| from_date | No | ||
| account_id | No | ||
| provider_id | No | ||
| include_pending | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| fresh | No | ||
| provider_id | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| fresh | No | ||
| provider_id | No |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| fresh | No | ||
| account_id | Yes | ||
| provider_id | No |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| fresh | No | ||
| account_id | Yes | ||
| provider_id | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| provider_id | No | ||
| history_days | No |
TDQS
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.
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.
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.
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.
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.
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.
12 tool updates
v0.1.0- First observed
cache_status - First observed
get_balance - First observed
get_balances - First observed
get_card_balance - First observed
get_identity - First observed
get_transactions - First observed
list_accounts - First observed
list_banks - First observed
list_cards - First observed
list_direct_debits - First observed
list_standing_orders - First observed
sync_now
TDQS
Scored across 12 tools
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.
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.
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.
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
Related MCP Connectors
Read-only bank access for your AI agent. Connects Claude, ChatGPT, Cursor, Gemini, Codex.
Read-only access to your bank, investment, and crypto accounts: balances, transactions, holdings.
- Era ContextOAuthapp.era
Personal finance, bank account, and shared memory connector for Claude, ChatGPT, Gemini Spark & more
- BankSyncOAuthio.banksync
Connect AI agents to bank accounts, transactions, balances, and investments.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceProvides read-only access to Tiller Money financial data in Google Sheets, enabling natural language queries for accounts, transactions, categories, and budgets through Claude Desktop.10MIT
- AlicenseNot gradedqualityFmaintenanceProvides read-only access to Monarch Money financial data, enabling AI assistants to analyze transactions, budgets, and cashflow.4MIT
- AlicenseNot gradedqualityCmaintenanceRead-only Monzo banking integration for Claude Code that allows querying balances, transactions, pots, and spending analysis through natural conversation.4MIT
- FlicenseAqualityDmaintenanceExposes SimpleFIN bank data (accounts and transactions) as tools for Claude Code, enabling users to connect to bank accounts, list balances, and fetch transactions.4-