Skip to main content
Glama
uiux-me

upbank-mcp

by uiux-me

upbank-mcp

A Model Context Protocol server that exposes the Up Banking API to LLM clients, built with FastMCP and packaged for Docker.

It provides 19 tools and 2 resources covering the complete public surface of the Up API — accounts, transactions, categories, tags, attachments and webhooks — with responses reshaped for token efficiency, cursor pagination preserved end to end, and automatic retry on rate limits.


Contents


Related MCP server: Up Bank MCP Server

Requirements

Up account

A personal access token from https://api.up.com.au/getting_started. Tokens look like up:yeah:….

Docker

Docker Engine 20.10+ with Compose v2 (docker compose, not docker-compose).

Python

3.11+ — only if running outside Docker.

The Up API is available to Up customers in Australia. A token grants access to the issuing customer's own data only.


Quick start

git clone git@github.com:uiux-me/upbank-mcp.git
cd upbank-mcp
cp .env.example .env          # paste your token into UP_API_TOKEN
docker compose up --build

The server listens on http://127.0.0.1:8000/mcp. Verify it:

docker compose exec upbank-mcp python -c "
import asyncio, upbank_mcp
from fastmcp import Client
async def main():
    async with Client(upbank_mcp.mcp) as c:
        print((await c.call_tool('ping')).data)
asyncio.run(main())"

A healthy response is your customer id and a status emoji:

{'ok': True, 'id': 'eb59f467-…', 'status_emoji': '⚡️'}

Configuration

All configuration is by environment variable. Compose reads .env from the project directory automatically.

Variable

Default

Description

UP_API_TOKEN

(required)

Personal access token. The only variable the server reads for credentials. Compose refuses to start without it; run directly, the server starts and fails on the first tool call.

UP_API_BASE

https://api.up.com.au/api/v1

API base URL. Override only for testing against a mock.

MCP_TRANSPORT

stdio

stdio for local MCP clients, http for a network-addressable server. Compose sets http.

MCP_HOST

0.0.0.0

Bind address for the HTTP transport, inside the container.

MCP_PORT

8000

Listen port for the HTTP transport, inside the container.

MCP_HOST_PORT

8000

Compose only. Host port published on 127.0.0.1. Change this if 8000 is already in use.


Running the server

HTTP, via Compose

Best for a long-running server shared by several clients on your machine.

docker compose up --build          # foreground
docker compose up -d --build       # detached
docker compose logs -f             # follow logs
docker compose down                # stop and remove

The port is published on 127.0.0.1 only. See Security.

stdio, via Docker

Best for MCP clients that spawn the server as a subprocess. Build the image once:

docker build -t upbank-mcp:latest .

The image defaults to MCP_TRANSPORT=stdio, so no transport override is needed.

Without Docker

pip install -e .
export UP_API_TOKEN=up:yeah:...
upbank-mcp

Set MCP_TRANSPORT=http to serve over HTTP instead of stdio.


Connecting an MCP client

Claude Code

claude mcp add upbank \
  -e UP_API_TOKEN=up:yeah:... \
  -- docker run -i --rm -e UP_API_TOKEN upbank-mcp:latest

Claude Desktop, or any client using mcpServers config

{
  "mcpServers": {
    "upbank": {
      "command": "docker",
      "args": ["run", "-i", "--rm", "-e", "UP_API_TOKEN", "upbank-mcp:latest"],
      "env": { "UP_API_TOKEN": "up:yeah:..." }
    }
  }
}

-i is required — the server communicates over stdin/stdout. --rm cleans up the container when the client disconnects.

Over HTTP

Point the client at http://127.0.0.1:8000/mcp while the Compose stack is running.


Tool reference

Required parameters are bold. Every list tool accepts cursor; see Pagination.

Utility

Tool

Parameters

Returns

ping

{ok, id, status_emoji}. Verifies the token and API reachability.

Accounts

Tool

Parameters

Returns

list_accounts

account_type (SAVER | TRANSACTIONAL | HOME_LOAN), ownership_type (INDIVIDUAL | JOINT), page_size (1–100, default 30), cursor

Page of accounts with balances.

get_account

account_id

One account.

Transactions

Tool

Parameters

Returns

list_transactions

account_id, status (HELD | SETTLED), since, until, category, tag, page_size (1–100, default 30), cursor

Page of transactions, newest first. Omit account_id to search across all accounts.

get_transaction

transaction_id

One transaction, including hold, round-up and cashback detail.

since and until bound createdAt inclusively. category accepts a parent id, which matches all of its children.

Categories

Tool

Parameters

Returns

list_categories

parent

The category tree, or one parent's children. Not paginated.

get_category

category_id

One category with its parent and child ids.

categorize_transaction

transaction_id, category_id

Sets the category, or clears it when category_id is null.

Categories are fixed by Up and cannot be created. Ids are slugs such as restaurants-and-cafes. Only transactions with is_categorizable: true can be changed, and only leaf categories are accepted — passing a parent such as good-life returns HTTP 403.

Tags

Tool

Parameters

Returns

list_tags

page_size (1–100, default 50), cursor

Page of tags. A tag's id is its label.

add_tags_to_transaction

transaction_id, tags (list)

Adds tags, creating any that do not exist.

remove_tags_from_transaction

transaction_id, tags (list)

Removes tags from the transaction.

A transaction holds at most 6 tags. Tags with no remaining transactions disappear from list_tags.

Attachments

Tool

Parameters

Returns

list_attachments

page_size (1–100, default 30), cursor

Page of attachments.

get_attachment

attachment_id

One attachment.

file_url is a signed URL that expires at file_url_expires_at. Fetch it promptly or re-request the attachment.

Webhooks

Tool

Parameters

Returns

list_webhooks

page_size (1–100, default 30), cursor

Page of webhooks.

get_webhook

webhook_id

One webhook.

create_webhook

url, description (≤64 chars)

The new webhook, including secret_key.

delete_webhook

webhook_id

{ok, deleted}. Permanent.

ping_webhook

webhook_id

Sends a test PING event.

list_webhook_logs

webhook_id, page_size (1–100, default 30), cursor

Recent delivery attempts with response codes and bodies.

secret_key is returned only at creation and never again. Store it to verify the X-Up-Authenticity-Signature header (SHA-256 HMAC) on incoming deliveries.


Resources

URI

Contents

up://accounts

Every account and its current balance, as a single JSON snapshot.

up://categories

The full category tree, for resolving valid category filter values.

Both are read on demand and reflect state at read time.


Response conventions

Shape

Up returns JSON:API, which nests every field under attributes/relationships and repeats self-links on each resource. This server flattens each resource into a compact dict and omits optional fields when absent, which materially reduces token cost without losing information a caller needs.

{
  "id": "45b83097-c97d-40da-9790-254056f03d40",
  "status": "SETTLED",
  "description": "Google One",
  "amount": { "value": "-2.49", "currency": "AUD", "base_units": -249 },
  "created_at": "2026-08-20T06:53:17+10:00",
  "settled_at": "2026-08-20T06:53:17+10:00",
  "account_id": "90c0fffc-bed6-4214-9450-6a76cd39957b",
  "category_id": "games-and-software",
  "parent_category_id": "good-life",
  "tags": [],
  "is_categorizable": true
}

Fields such as foreign_amount, hold_info, round_up, cashback, card_purchase_method, note and message appear only when the transaction has them.

Money

Every amount is an object:

{ "value": "-2.49", "currency": "AUD", "base_units": -249 }

value is a decimal string, base_units is the integer minor unit (cents for AUD). Debits are negative. Prefer base_units for arithmetic to avoid float error.

Pagination

List tools return:

{ "items": [ ... ], "next_cursor": "https://api.up.com.au/...", "prev_cursor": null }

To page, pass a returned cursor back as the cursor argument of the same tool. Cursors are Up's own opaque URLs and already encode the filters and page size, so all other arguments are ignored when cursor is set. A null cursor means no further page in that direction.

Cursors are validated against the configured API host before being followed, so a cursor cannot redirect the client to another server.

Dates

since and until accept either YYYY-MM-DD or a full RFC-3339 timestamp. Bare dates and naive datetimes are anchored to Australia/Sydney, matching how Up presents times in the app; the correct offset is applied for the date in question, so daylight saving is handled. Unparseable input is rejected before the request is made, rather than surfacing as an opaque HTTP 400.


Error handling and rate limits

  • API errors are raised as ToolError with the HTTP status and Up's own error title and detail, for example: HTTP 403 — Forbidden: Top-level categories cannot be set directly on transactions.

  • 429 and 5xx responses are retried up to 3 times with exponential backoff, honouring the Retry-After header when present.

  • Network failures are retried on the same schedule before surfacing.

  • 4xx responses other than 429 are not retried — they indicate a bad request.


Project layout

src/upbank_mcp/
├── client.py     Async HTTP client: auth, retry/backoff, date normalisation,
│                 cursor host validation
├── shapes.py     JSON:API → flat dict transforms, one per resource type
├── server.py     FastMCP instance, tool and resource definitions, entrypoint
├── __init__.py   Exports `mcp` and `main`
└── __main__.py   Enables `python -m upbank_mcp`

The separation is deliberate: client.py knows about HTTP and nothing about MCP, shapes.py is pure data transformation, and server.py holds the tool contracts. Each is independently testable.


Development

pip install -e .
export UP_API_TOKEN=up:yeah:...
upbank-mcp                              # stdio
MCP_TRANSPORT=http upbank-mcp           # http on :8000

Drive the server in-process with the FastMCP client:

import asyncio
from fastmcp import Client
import upbank_mcp

async def main():
    async with Client(upbank_mcp.mcp) as client:
        print(await client.list_tools())
        result = await client.call_tool("list_accounts", {"account_type": "TRANSACTIONAL"})
        print(result.data)

asyncio.run(main())

Rebuild the image after changes:

docker compose up -d --build

Security

The token is powerful. Up personal access tokens cannot move money — the API has no payment or transfer endpoint — but they can read your complete transaction history and mutate categories, tags and webhooks. Treat one like a password.

  • The HTTP transport has no authentication of its own. Anything that can reach the port can read your banking data. Compose therefore publishes to 127.0.0.1 only. Do not bind it to 0.0.0.0 or expose it through a tunnel or reverse proxy without putting authentication in front of it.

  • The token is never baked into an image. .env is listed in .dockerignore, and the token is supplied at runtime. It does not appear in any image layer, so the image is safe to push to a registry.

  • .env is gitignored, and .env.example carries a placeholder only.

  • The container runs as a non-root user (uid 10001).

  • Rotate immediately at https://api.up.com.au/getting_started if a token is ever exposed. Tokens do not expire on their own.


Troubleshooting

Symptom

Cause and fix

No Up API token configured

UP_API_TOKEN is unset or empty. Check .env, and that Compose is run from the project directory.

Compose exits with set UP_API_TOKEN in .env

Same cause, caught at container start rather than first call.

Bind for 127.0.0.1:8000 failed: port is already allocated

Another process holds port 8000. Set MCP_HOST_PORT in .env.

HTTP 401 — Unauthorized

Token is invalid or revoked. Reissue it.

HTTP 403 — Top-level categories cannot be set…

categorize_transaction was given a parent category. Use a leaf id from list_categories.

HTTP 404 on a valid-looking id

Ids are per-customer. Confirm the id came from this token's own data.

Repeated HTTP 429

Sustained rate limiting. Reduce page_size and request frequency; retries are already automatic.

Client shows no tools

The client must run the container with -i. Without it, stdio is closed immediately.


Reference

Available Tools

19 tools
add_tags_to_transactionAdd Tags To TransactionC

Add one or more tags to a transaction.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagsYesTag labels to add. Tags that do not exist yet are created. A transaction may hold at most 6 tags.
transaction_idYesThe transaction to tag.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

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, yet it says nothing about mutability semantics beyond the verb. It does not disclose that unknown tags are auto-created, the 6-tag cap, whether duplicates are ignored, whether the operation is idempotent, or what error occurs when the limit is hit — all of which live only in the schema.

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 zero waste, but it is arguably too terse for a mutation tool — it could have spent one more clause on behavior without becoming bloated.

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?

Because an output schema exists, return values need not be explained, and the schema fully covers both parameters. However, for a mutation tool with no annotations the description leaves behavioral gaps (auto-creation, cap, idempotency) that structured fields alone only partially cover.

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 description coverage is 100%: the schema already documents that tags are array items, that missing tags are created, and that a transaction holds at most 6 tags, plus the transaction_id meaning. The description adds no parameter detail beyond the schema, so the baseline 3 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?

Clear specific verb ("Add") and resource ("tags" to "a transaction"), and plural "one or more tags" signals batch capability. It does not explicitly distinguish itself from the sibling remove_tags_from_transaction or list_tags, but the verb makes the direction of the operation 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?

The description offers no when-to-use guidance, no prerequisites (e.g., the transaction must exist), and never names the complementary sibling remove_tags_from_transaction for the reverse operation. The agent must infer usage from the name alone.

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

categorize_transactionCategorize TransactionA

Set or clear a transaction's category.

Only transactions with is_categorizable: true can be changed.

ParametersJSON Schema
NameRequiredDescriptionDefault
category_idNoA child category id such as `restaurants-and-cafes`. Pass null to clear the category. Parent categories are not accepted.
transaction_idYesThe transaction to categorise.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.7/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 behavioral burden. It usefully discloses a mutation precondition (is_categorizable) that is absent from the schema, but says nothing about permissions, reversibility of the change, or error behavior when the precondition fails — significant gaps for a write tool.

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

Conciseness5/5

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

Two sentences, no filler, with the core action stated first and the precondition second. Every sentence earns its place.

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

Completeness5/5

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

An output schema exists, so return values need not be explained, and the schema fully documents parameters. The description supplies the one key gating rule (is_categorizable) an agent would otherwise miss, making it complete for this small two-parameter 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 100%, so the schema already documents both parameters, including the 'pass null to clear' semantics and the 'parent categories are not accepted' constraint. The description's 'set or clear' merely echoes the schema's null behavior, adding no new parameter detail — baseline 3.

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 pair (set/clear) and resource (a transaction's category), which cleanly separates it from the tag-oriented siblings (add_tags_to_transaction, remove_tags_from_transaction) and the read-only get_transaction. It does not name those siblings, so it stops short of explicit differentiation.

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 concrete precondition (only transactions with is_categorizable: true can be changed), which is real usage guidance. However, it never addresses when to choose this tool over the adjacent tagging tools or what to do when the transaction is not categorizable — alternatives and failure handling are left implicit.

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

create_webhookCreate WebhookA

Register a webhook for transaction events.

The response contains secret_key, which is returned only once — store it now to verify the X-Up-Authenticity-Signature header on incoming deliveries.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesPublicly reachable HTTPS URL to deliver events to.
descriptionNoOptional label, max 64 characters.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior4/5

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

With no annotations, the description carries the full behavioral burden, and it discloses a high-value non-obvious trait: secret_key is returned only once and must be stored immediately. It also names the verification header (X-Up-Authenticity-Signature), which tells the agent what the secret is for. It stops short of stating auth requirements, duplicate-URL behavior, or retry semantics.

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

Conciseness5/5

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

Two sentences, no filler, with the core action front-loaded and the one-time secret warning immediately after. Every clause carries information the agent cannot get elsewhere.

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?

For a two-parameter creation tool with full schema coverage and an output schema, the description covers the critical operational fact (one-time secret) that a schema cannot express. It is nearly complete; a note on authorization or duplicate registrations would close the remaining gap given the absence of annotations.

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 description coverage is 100%, so 'url' (publicly reachable HTTPS) and the optional 64-character 'description' are fully documented in the schema. The description adds no parameter-level detail beyond that, so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource ('Register a webhook') plus the event scope ('for transaction events'), which cleanly separates it from the list/get/delete/ping webhook siblings. An agent needs no schema inspection to know this creates a new subscription.

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 explicit when-to-use guidance, no prerequisites (e.g. required plan or permissions), and no mention of when to prefer this over ping_webhook or list_webhooks as a next step. The only usage-adjacent content concerns verifying deliveries after the fact, not selecting this tool.

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

delete_webhookDelete WebhookB

Permanently delete a webhook. This cannot be undone.

ParametersJSON Schema
NameRequiredDescriptionDefault
webhook_idYesThe webhook to delete.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior3/5

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

With no annotations, the description carries the behavioral burden, and it does disclose the key trait: permanence and irreversibility ('cannot be undone'). However, it omits what happens to associated resources (e.g., webhook logs), auth requirements, and whether confirmation is needed, so it is only partially complete.

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 short sentences with the destructive nature front-loaded and zero wasted words. Every clause earns its place.

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?

An output schema exists, so return values need not be explained. For a one-parameter destructive tool the description is largely sufficient, with the main gap being the absence of auth/permission or downstream-effect context.

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 100% and the single parameter is fully documented in the schema, so baseline 3 applies. The description adds no syntax or semantic detail beyond what the schema already provides for webhook_id.

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 (delete) and resource (webhook) with the added modifier 'permanently'. It does not explicitly differentiate from siblings like get_webhook or create_webhook, but the verb-resource pairing 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?

No guidance on when to use this versus alternatives such as get_webhook, or any preconditions (e.g., confirming the webhook is no longer needed). The description is purely a statement of effect, leaving the agent to infer context.

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

get_accountGet AccountC

Retrieve a single account by id.

ParametersJSON Schema
NameRequiredDescriptionDefault
account_idYesThe account's unique id.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

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, yet it discloses nothing beyond the basic operation: no error behavior for a missing id, no permission/auth requirements, no note that it is a safe read. For a getter with zero annotation coverage this is a notable gap, though the presence of an output schema offsets some of the load.

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 no filler or repetition. It is efficient, though its brevity borders on under-specification rather than optimal conciseness.

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 one-parameter getter with a complete input schema and an output schema that documents the return, the description is minimally adequate. It omits any operational context (auth, not-found handling) but nothing structurally required to make the call is missing.

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

Parameters3/5

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

Schema description coverage is 100% with a single, well-documented account_id parameter, so the schema does the heavy lifting. The description's 'by id' adds only a restatement, which is the expected baseline of 3.

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 ('Retrieve a single account by id'), and the word 'single' implicitly contrasts with the sibling list_accounts. It stops short of naming the alternative explicitly, so it is clear but not fully differentiated from 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 when-to-use guidance and no mention of alternatives such as list_accounts. The agent must infer that this is for fetching one known account versus browsing all accounts, which is left entirely to inference.

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

get_attachmentGet AttachmentB

Retrieve a single attachment by id.

ParametersJSON Schema
NameRequiredDescriptionDefault
attachment_idYesThe attachment's unique id.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.1/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 disclosure burden. It doesn't say whether the call is read-only (implied by 'Retrieve' but not stated), what happens with an invalid or inaccessible id, or whether any access constraints apply. For a zero-annotation tool this is thin, though the read-only nature of a getter is fairly self-evident.

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 short sentence with the verb and identifier front-loaded and no wasted words. It is efficient, though its brevity contributes to the guidance gaps noted elsewhere.

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?

An output schema exists, so the description needn't explain return values, and the tool has only one fully documented parameter. What remains missing is minor behavioral context (failure modes, auth), acceptable for a simple getter.

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 description coverage is 100% for the single attachment_id parameter, so the schema already documents it fully. The description adds no format, naming convention, or source-of-id detail beyond what structured data provides, making the baseline of 3 appropriate.

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 ('Retrieve') and resource ('a single attachment'), and the word 'single' implicitly distinguishes it from the sibling list_attachments. However, it never names that sibling or any retrieval scope (e.g., ownership/permissions), so differentiation must be inferred.

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 and no mention of the obvious alternative, list_attachments. The agent must infer that this is the tool for fetching one attachment when the id is already known.

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

get_categoryGet CategoryB

Retrieve a single category by id.

ParametersJSON Schema
NameRequiredDescriptionDefault
category_idYesThe category id slug, e.g. `booze`.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output 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 burden. It does not state that this is a read-only operation, nor what happens when the id is unknown (error vs empty), nor any auth requirements.

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 efficient sentence with the verb and resource front-loaded and zero wasted words.

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?

An output schema exists, so return values need not be explained, and the tool is a trivial one-parameter getter. The only gap is unstated not-found/error behavior.

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 description coverage is 100% and the schema documents category_id with a concrete example ('booze'). The description adds no meaning beyond the schema, so the baseline of 3 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?

States a specific verb and resource ('Retrieve a single category by id'), which clearly conveys the operation. It does not differentiate itself from the sibling list_categories, though 'single' and 'by id' implicitly contrast with a listing endpoint.

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 use this versus list_categories or other get_* siblings, and no prerequisites or context of use. The agent must infer the distinction from the name alone.

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

get_transactionGet TransactionB

Retrieve a single transaction by id, including hold, round-up and cashback detail.

ParametersJSON Schema
NameRequiredDescriptionDefault
transaction_idYesThe transaction's unique id.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.4/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 behavioral burden. 'Retrieve' implies a safe read-only operation and it discloses the detail fields returned, but it says nothing about lookup failures (e.g., not-found behavior), permissions, or side effects. Reasonable for a simple getter, but thin given zero annotation coverage.

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?

One compact sentence, front-loaded with the core action and scope and followed by the useful detail about returned fields. Every clause earns its place.

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?

For a one-parameter getter with a defined output schema, the description needn't explain return values. It covers what the tool fetches and what extra detail is included, leaving only minor gaps around error behavior.

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

Parameters3/5

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

The single parameter is fully documented in the schema (100% coverage), and the description's 'by id' aligns with the schema's transaction_id. Since the schema does the heavy lifting, the baseline of 3 is appropriate.

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 ('Retrieve a single transaction by id') with a clear scope ('single'), which implicitly distinguishes it from the sibling list_transactions. It also names the extra detail returned (hold, round-up, cashback), but does not explicitly call out the sibling it differs from.

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 or when-not-to-use guidance, and no alternatives are named. An agent must infer from 'by id' that this is the point-lookup counterpart to list_transactions, with nothing stated about preferred usage or prerequisites.

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

get_webhookGet WebhookC

Retrieve a single webhook by id.

ParametersJSON Schema
NameRequiredDescriptionDefault
webhook_idYesThe webhook's unique id.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.9/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, yet it discloses nothing about auth requirements, error behavior when the id does not exist, or rate limits. It only restates the read intent already implied by the name.

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 zero filler. It is arguably too terse for the information an agent may need, but structure and economy are sound.

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?

The tool is a simple single-resource read and an output schema exists, so return values need not be explained. However, with no annotations at all, the definition leaves the behavioral surface (failure modes, permissions) entirely undocumented, which is a gap even for a trivial read.

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 description coverage is 100% — the single webhook_id parameter is already documented in the schema as 'The webhook's unique id.' The description adds no format, source, or lookup hints beyond what the schema provides, so the baseline 3 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?

States a specific verb (Retrieve) and resource (webhook) with the scoping qualifier 'by id', which cleanly separates it from list_webhooks and delete_webhook in the sibling set. It does not explicitly name a sibling alternative, but the single-resource read intent 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?

No when-to-use guidance is given; the description never mentions list_webhooks as the alternative for enumerating webhooks, nor any condition or prerequisite for fetching a single one. Usage is inferable only from the tool name.

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

list_accountsList AccountsB

List the customer's Up accounts with their current balances.

ParametersJSON Schema
NameRequiredDescriptionDefault
cursorNoA `next_cursor` or `prev_cursor` from a previous call to this tool. When set, all other arguments are ignored.
page_sizeNoNumber of records per page (1-100).
account_typeNoReturn only accounts of this type.
ownership_typeNoReturn only individual or joint accounts.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output 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. It hints that balances are included in the response but says nothing about pagination behavior, auth requirements, or read-only/safe semantics that an agent would otherwise need to confirm.

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 carries information and the key content (accounts + balances) appears immediately.

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?

With an output schema present, the description need not explain return values, and all four optional parameters are documented in the schema. The only real gap is the absence of routing guidance relative to get_account, so the definition is nearly but not fully complete for this simple list 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 description coverage is 100%, so cursor, page_size, account_type, and ownership_type are already fully documented in the schema, including the rule that other arguments are ignored when cursor is set. The description adds nothing beyond that, making the baseline of 3 appropriate.

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 ('List') and resource ('Up accounts') and adds that balances are returned, so an agent knows exactly what the tool produces. However, it does not differentiate from the sibling get_account (singular, likely one account) or explain the relationship, leaving that distinction to inference.

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 statement of when to use this tool versus alternatives such as get_account or list_transactions, and no mention of prerequisites or filtering intent. Usage is only implied by the verb 'List'.

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

list_attachmentsList AttachmentsB

List transaction attachments. File URLs are signed and expire shortly.

ParametersJSON Schema
NameRequiredDescriptionDefault
cursorNoA `next_cursor` or `prev_cursor` from a previous call to this tool. When set, all other arguments are ignored.
page_sizeNoNumber of records per page (1-100).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.4/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 behavioral burden. It usefully discloses that file URLs are signed and expire shortly, a real operational caveat not in the schema, but it says nothing about read-only safety, pagination traversal, or result shape beyond that caveat.

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 short sentences with zero padding; the purpose is front-loaded and the expiry caveat follows immediately.

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?

An output schema exists, so return-value explanation is unnecessary, and pagination is covered by the schema. The description supplies the key non-schema caveat (expiring signed URLs), leaving only minor gaps such as ordering or read-only safety.

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 description coverage is 100%, so cursor and page_size are fully documented in the schema, including the important note that cursor overrides other arguments. The description adds no parameter meaning beyond that, so the baseline 3 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?

States a specific verb and resource ('List transaction attachments'), which clearly separates it from get_attachment, the singular fetch sibling. It does not explicitly name or differentiate against that sibling, but the scope 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?

No when-to-use guidance is provided. The sibling set includes get_attachment, but the description never says when to enumerate attachments versus fetch a single one, nor does it mention any prerequisite for paginating through results.

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

list_categoriesList CategoriesA

List the category tree. Categories are fixed by Up, not user-defined.

ParametersJSON Schema
NameRequiredDescriptionDefault
parentNoReturn only children of this parent category id, e.g. `good-life`.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.6/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, and it does disclose one meaningful trait: categories are a fixed, provider-controlled taxonomy (i.e., read-only and non-user-defined). It says nothing about ordering, tree depth, or pagination behavior, so transparency is partial.

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 short sentences with zero filler, and the core action is front-loaded before the supporting constraint.

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?

An output schema exists, so return values need not be explained, and the single optional parameter is documented in the schema. The definition is sufficient to call the tool correctly; only the tree shape and filtering behavior are left implicit.

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 100% and the sole 'parent' parameter already carries a description with an example id, so the schema does the heavy lifting. The description adds no filtering semantics beyond what the schema states.

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 the category tree'), which is enough to distinguish it from the sibling get_category that fetches a single category. It doesn't explicitly name that sibling or clarify the tree-vs-single boundary, so it falls 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 Guidelines3/5

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

Usage is implied by the resource and by the note that categories are fixed by Up, which signals that listing (not creating/editing) is the only relevant operation. However, there is no explicit when-to-use guidance, no mention of when to prefer get_category over list_categories, and no prerequisites.

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

list_tagsList TagsB

List all tags the customer has created. A tag's id is its label.

ParametersJSON Schema
NameRequiredDescriptionDefault
cursorNoA `next_cursor` or `prev_cursor` from a previous call to this tool. When set, all other arguments are ignored.
page_sizeNoNumber of records per page (1-100).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.3/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 disclosure burden. It adds one genuinely useful semantic detail (a tag's id equals its label), but says nothing about permissions, whether the list is scoped to the calling customer automatically, ordering, or pagination behavior beyond what the schema already documents.

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 short, front-loaded sentences with zero filler. The scope statement comes first and the identity detail second, which is the right ordering.

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?

An output schema exists and the parameter schema is complete, so return values and pagination mechanics do not need restating. However, with no annotations at all, the description could have cheaply closed the remaining gap by stating that this is a safe read scoped to the authenticated customer.

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 description coverage is 100%: both cursor and page_size are fully documented in the schema, including the 'all other arguments are ignored' caveat and the 1-100 bounds. The description adds nothing about parameters, so the baseline 3 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?

Clear specific verb+resource: 'List all tags the customer has created.' An agent immediately knows this enumerates the tag catalog. It does not explicitly differentiate itself from the tag-mutating siblings (add_tags_to_transaction, remove_tags_from_transaction), but the read-vs-mutate distinction is obvious from the verb.

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 use this versus alternatives, or what prerequisites exist. The natural workflow (list tags before calling add_tags_to_transaction) is left entirely to inference. No exclusions, no context statements.

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

list_transactionsList TransactionsA

List transactions, newest first, optionally filtered by account, status, date range, category or tag.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagNoTag id (its label), e.g. `Holiday`.
sinceNoInclusive lower bound on createdAt. Accepts YYYY-MM-DD or a full RFC-3339 timestamp; bare dates are read as Australia/Sydney time.
untilNoInclusive upper bound on createdAt, same formats as since.
cursorNoA `next_cursor` or `prev_cursor` from a previous call to this tool. When set, all other arguments are ignored.
statusNoOnly transactions with this status.
categoryNoCategory id slug, e.g. `restaurants-and-cafes`. Parent ids match their children.
page_sizeNoNumber of records per page (1-100).
account_idNoRestrict to one account. Omit to search across all accounts.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior3/5

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

With no annotations, the description must carry the behavioral load, and it does disclose one real trait beyond the schema: results come back newest first. It does not mention pagination behavior, default page size, or that filters combine, so the disclosure is partial.

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 zero filler; the verb, ordering and filter dimensions all arrive before any clause ends. Nothing could be trimmed without losing information.

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?

An output schema exists, so return values need no prose, and all 8 optional parameters are covered by the schema. The only minor gap is that pagination/aggregate behavior isn't mentioned in the description, though the cursor parameter documents it.

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 description coverage is 100%, so date formats, cursor semantics, enum values and page-size bounds are already fully documented. The description's filter list (account, status, date range, category, tag) adds no meaning beyond what the schema provides, so the baseline 3 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?

States a specific verb and resource plus ordering ('List transactions, newest first') and enumerates the filterable dimensions. An agent can distinguish it from get_transaction by the plural scope, though no sibling is named explicitly.

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 word 'optionally' implies this is the browse-all entry point and filters are narrowing, which gives implied usage. There is no explicit when-to-use versus get_transaction or the tagging/categorizing siblings, and no stated exclusions.

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

list_webhook_logsList Webhook LogsA

List recent delivery attempts for a webhook, to debug failing deliveries.

ParametersJSON Schema
NameRequiredDescriptionDefault
cursorNoA `next_cursor` or `prev_cursor` from a previous call to this tool. When set, all other arguments are ignored.
page_sizeNoNumber of records per page (1-100).
webhook_idYesThe webhook whose deliveries to inspect.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.6/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. 'List' and 'recent delivery attempts' imply a safe read of a recent window, but there is no disclosure of ordering, retention limits, permissions, or rate limits. The pagination behavior is left entirely to the schema.

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 tight sentence with the resource and its debugging purpose front-loaded. No filler or redundancy.

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?

An output schema exists, so return values need not be described, and all three parameters are schema-documented. The description is nearly sufficient for invoking the tool, missing only a note on pagination/recency semantics.

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 description coverage is 100%, so webhook_id, cursor, and page_size are already documented in the schema. The description only loosely ties 'a webhook' to webhook_id and adds no format or constraint detail beyond that, so baseline 3 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?

States a specific verb (List) and resource (delivery attempts for a webhook), plus the outcome it serves (debug failing deliveries). It is distinguishable from siblings like list_webhooks and get_webhook, though it does not explicitly name them.

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 clause 'to debug failing deliveries' implies the intended scenario, giving some usage context. However, it never states when not to use it or which sibling to prefer (e.g., get_webhook for config vs. this for delivery history).

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

list_webhooksList WebhooksC

List configured webhooks.

ParametersJSON Schema
NameRequiredDescriptionDefault
cursorNoA `next_cursor` or `prev_cursor` from a previous call to this tool. When set, all other arguments are ignored.
page_sizeNoNumber of records per page (1-100).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

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 burden of behavioral disclosure, and it discloses almost nothing. It does not state that this is a read-only listing operation, does not describe pagination behavior despite cursor/page_size params, and gives no sense of result ordering or volume.

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 short sentence with no filler or redundancy, and the core purpose is front-loaded. Its only weakness is that it is so terse it conveys little more than the tool name.

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?

The tool is simple (0 required params, output schema present so return values need not be explained), which lowers the bar. Even so, for a listing tool with pagination semantics and several sibling list/get tools, the description is barely complete enough to route an agent correctly.

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 description coverage is 100%, with cursor and page_size fully documented in the schema itself, including the notable detail that cursor makes all other arguments ignored. The description adds no parameter meaning beyond the schema, so the baseline of 3 applies.

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

Purpose3/5

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

The description states a clear verb and resource ("List ... webhooks"), but it essentially restates the title "List Webhooks" and adds only the word "configured." It offers no differentiation from siblings like list_webhook_logs or get_webhook, so an agent cannot tell from the text why it would pick this over the alternatives.

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 use this tool versus get_webhook, list_webhook_logs, or ping_webhook. No prerequisites, no mention of the paginated listing context, and no exclusions are given.

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

pingPingA

Check that the configured Up API token is valid and the API is reachable.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior3/5

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

With no annotations, the description carries the burden, and it does disclose meaningful behavior: it verifies auth (token validity) as well as connectivity, implying an auth-failure return mode. It does not state side-effect-free/read-only nature, rate limits, or failure semantics, which for a zero-arg health check is a modest gap.

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 wasted words that covers both facets of the check (auth validity and reachability).

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?

An output schema exists, so return values need not be described, and the description covers the full scope of this simple no-arg tool. Minor gaps remain around error/auth-failure reporting, but nothing essential for correct invocation is missing.

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 no parameters, so there is nothing to disambiguate; baseline 4 applies and no schema compensation is needed.

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 (check) and the exact resources verified: the configured Up API token and API reachability. It implicitly distinguishes itself from the similarly-named sibling ping_webhook, though it never names that alternative explicitly.

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 purpose implies a diagnostic/health-check use case (validate credentials, confirm connectivity), but there is no explicit statement of when to call it versus siblings like list_accounts, nor any exclusions or prerequisites.

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

ping_webhookPing WebhookA

Send a test PING event to a webhook to verify it is reachable.

ParametersJSON Schema
NameRequiredDescriptionDefault
webhook_idYesThe webhook to send a PING event to.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/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 disclosure burden. It usefully reveals the nature of the operation by calling the event a 'test PING' (implying it is diagnostic rather than a real delivery), but it says nothing about side effects, rate limits, whether the ping is logged, or what a failure implies.

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?

One sentence, front-loaded with the action and ending with the purpose; every clause earns its place and there is no filler.

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

Completeness4/5

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

For a single-parameter diagnostic tool with an output schema covering the response, the description is essentially complete about what the tool does. It could add a note on the return semantics of a failed ping or any rate/duplicate-send constraints, which is the only gap.

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 description coverage is 100% and the single parameter is already documented as 'The webhook to send a PING event to.' The description adds no format, identifier, or validation detail beyond that, so the schema does the heavy lifting and the baseline of 3 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 uses a specific verb and resource ('Send a test PING event to a webhook'), making the action unambiguous. It implicitly separates itself from the sibling `ping` (which pings something other than a webhook) and from `get_webhook`, but it never names an alternative to make the distinction explicit.

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?

'...to verify it is reachable' states the concrete situation in which the tool is the right choice, which is clear usage context. It stops short of naming alternatives (e.g. list_webhook_logs, get_webhook) or stating when not to use it, so it does not reach a 5.

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

remove_tags_from_transactionRemove Tags From TransactionC

Remove one or more tags from a transaction.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagsYesTag labels to remove.
transaction_idYesThe transaction to untag.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

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 burden. It implies a mutation but says nothing about idempotency, what happens when a tag is not present on the transaction, permission requirements, or reversibility.

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 verb front-loaded and no filler. It is perhaps overly terse, but nothing is wasted.

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?

An output schema exists, so return values need no explanation. However, for a destructive mutation with no annotations at all, the description should at least cover partial-failure or missing-tag behavior to be fully complete.

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

Parameters3/5

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

Schema description coverage is 100% and both parameters are documented in the schema, so the baseline is 3. The description's 'one or more tags' adds minor reinforcement of the array/minItems semantics but no new detail.

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?

Clear specific verb ('Remove') plus resource ('tags from a transaction'), and 'one or more' conveys batch semantics. It distinguishes itself adequately from add_tags_to_transaction by the verb alone, though it does not explicitly name the sibling.

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 use this versus related tools such as add_tags_to_transaction or list_tags, and no mention of prerequisites. The context is only implied by the verb.

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. 19 tool updatesv0.1.0
    • First observedadd_tags_to_transaction
    • First observedcategorize_transaction
    • First observedcreate_webhook
    • First observeddelete_webhook
    • First observedget_account
    • First observedget_attachment
    • First observedget_category
    • First observedget_transaction
    • First observedget_webhook
    • First observedlist_accounts
    • First observedlist_attachments
    • First observedlist_categories
    • First observedlist_tags
    • First observedlist_transactions
    • First observedlist_webhook_logs
    • First observedlist_webhooks
    • First observedping
    • First observedping_webhook
    • First observedremove_tags_from_transaction

TDQS

A3.5/5.0

Scored across 19 tools

Disambiguation5/5

Each tool targets a distinct resource and action (accounts, transactions, categories, tags, attachments, webhooks), with clear separation between list/get/create/delete/add/remove/ping operations. Overlap is minimal and descriptions explicitly differentiate ambiguous pairs like ping vs ping_webhook.

Naming Consistency4/5

Nearly all tools follow a consistent snake_case verb_noun pattern (list_accounts, get_transaction, create_webhook, add_tags_to_transaction). The sole minor deviation is 'ping', which lacks a noun but remains unambiguous and predictable.

Tool Count4/5

19 tools across six resource groups is slightly above the typical 3–15 sweet spot, but each tool maps to a distinct, necessary operation for a banking API. No tool appears redundant or trivially thin.

Completeness4/5

Coverage is broad: full webhook lifecycle plus ping/logs, transaction list/get/categorize, tag add/remove/list, and read operations for accounts, categories, and attachments. Minor gaps exist, notably no attachment upload/delete, but core workflows are otherwise well-covered.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    D
    quality
    F
    maintenance
    A Model Context Protocol server that allows AI assistants to connect to and manage Israeli bank accounts, fetch transactions, and handle authentication for all major Israeli banks and credit card companies.
    2
    34
    -
  • A
    license
    Not graded
    quality
    D
    maintenance
    An MCP wrapper for Up Bank's API that allows Claude and other MCP-enabled clients to manage accounts, transactions, categories, tags, and webhooks from Up Bank.
    3
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    A Model Context Protocol server that enables interaction with You Need A Budget (YNAB) via their API, allowing users to manage budgets, accounts, categories, and transactions through natural language.
    2
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    A Model Context Protocol server that allows AI assistants to interact with Lunch Money accounts, enabling management of transactions, categories, budgets, and other financial data through natural language commands.
    MIT