upbank-mcp
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., "@upbank-mcpshow my three most recent transactions"
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.
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 |
Docker | Docker Engine 20.10+ with Compose v2 ( |
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 --buildThe 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 |
| (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. |
|
| API base URL. Override only for testing against a mock. |
|
|
|
|
| Bind address for the HTTP transport, inside the container. |
|
| Listen port for the HTTP transport, inside the container. |
|
| Compose only. Host port published on |
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 removeThe 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-mcpSet 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:latestClaude 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 |
| — |
|
Accounts
Tool | Parameters | Returns |
|
| Page of accounts with balances. |
|
| One account. |
Transactions
Tool | Parameters | Returns |
|
| Page of transactions, newest first. Omit |
|
| 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 |
|
| The category tree, or one parent's children. Not paginated. |
|
| One category with its parent and child ids. |
|
| Sets the category, or clears it when |
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 |
|
| Page of tags. A tag's id is its label. |
|
| Adds tags, creating any that do not exist. |
|
| 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 |
|
| Page of attachments. |
|
| 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 |
|
| Page of webhooks. |
|
| One webhook. |
|
| The new webhook, including |
|
|
|
|
| Sends a test |
|
| 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 |
| Every account and its current balance, as a single JSON snapshot. |
| The full category tree, for resolving valid |
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
ToolErrorwith 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-Afterheader 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 :8000Drive 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 --buildSecurity
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.1only. Do not bind it to0.0.0.0or expose it through a tunnel or reverse proxy without putting authentication in front of it.The token is never baked into an image.
.envis 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..envis gitignored, and.env.examplecarries 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 |
|
|
Compose exits with | Same cause, caught at container start rather than first call. |
| Another process holds port 8000. Set |
| Token is invalid or revoked. Reissue it. |
|
|
| Ids are per-customer. Confirm the id came from this token's own data. |
Repeated | Sustained rate limiting. Reduce |
Client shows no tools | The client must run the container with |
Reference
Available Tools
19 toolsadd_tags_to_transactionAdd Tags To TransactionC
Add one or more tags to a transaction.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | Yes | Tag labels to add. Tags that do not exist yet are created. A transaction may hold at most 6 tags. | |
| transaction_id | Yes | The transaction to tag. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output 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 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| category_id | No | A child category id such as `restaurants-and-cafes`. Pass null to clear the category. Parent categories are not accepted. | |
| transaction_id | Yes | The transaction to categorise. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
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 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Publicly reachable HTTPS URL to deliver events to. | |
| description | No | Optional label, max 64 characters. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| webhook_id | Yes | The webhook to delete. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| account_id | Yes | The account's unique id. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output 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 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| attachment_id | Yes | The attachment's unique id. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output 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 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| category_id | Yes | The category id slug, e.g. `booze`. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output 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 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| transaction_id | Yes | The transaction's unique id. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output 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. '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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| webhook_id | Yes | The webhook's unique id. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| cursor | No | A `next_cursor` or `prev_cursor` from a previous call to this tool. When set, all other arguments are ignored. | |
| page_size | No | Number of records per page (1-100). | |
| account_type | No | Return only accounts of this type. | |
| ownership_type | No | Return only individual or joint accounts. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output 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. 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| cursor | No | A `next_cursor` or `prev_cursor` from a previous call to this tool. When set, all other arguments are ignored. | |
| page_size | No | Number of records per page (1-100). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
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 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| parent | No | Return only children of this parent category id, e.g. `good-life`. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
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 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| cursor | No | A `next_cursor` or `prev_cursor` from a previous call to this tool. When set, all other arguments are ignored. | |
| page_size | No | Number of records per page (1-100). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output 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 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | Tag id (its label), e.g. `Holiday`. | |
| since | No | Inclusive lower bound on createdAt. Accepts YYYY-MM-DD or a full RFC-3339 timestamp; bare dates are read as Australia/Sydney time. | |
| until | No | Inclusive upper bound on createdAt, same formats as since. | |
| cursor | No | A `next_cursor` or `prev_cursor` from a previous call to this tool. When set, all other arguments are ignored. | |
| status | No | Only transactions with this status. | |
| category | No | Category id slug, e.g. `restaurants-and-cafes`. Parent ids match their children. | |
| page_size | No | Number of records per page (1-100). | |
| account_id | No | Restrict to one account. Omit to search across all accounts. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| cursor | No | A `next_cursor` or `prev_cursor` from a previous call to this tool. When set, all other arguments are ignored. | |
| page_size | No | Number of records per page (1-100). | |
| webhook_id | Yes | The webhook whose deliveries to inspect. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| cursor | No | A `next_cursor` or `prev_cursor` from a previous call to this tool. When set, all other arguments are ignored. | |
| page_size | No | Number of records per page (1-100). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output 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 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| webhook_id | Yes | The webhook to send a PING event to. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output 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 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | Yes | Tag labels to remove. | |
| transaction_id | Yes | The transaction to untag. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output 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 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.
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.
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.
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.
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.
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.
19 tool updates
v0.1.0- First observed
add_tags_to_transaction - First observed
categorize_transaction - First observed
create_webhook - First observed
delete_webhook - First observed
get_account - First observed
get_attachment - First observed
get_category - First observed
get_transaction - First observed
get_webhook - First observed
list_accounts - First observed
list_attachments - First observed
list_categories - First observed
list_tags - First observed
list_transactions - First observed
list_webhook_logs - First observed
list_webhooks - First observed
ping - First observed
ping_webhook - First observed
remove_tags_from_transaction
TDQS
Scored across 19 tools
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.
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.
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.
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
Related MCP Connectors
The Mercado Pago MCP Server implements the Model Context Protocol to provide AI agents and LLMs with access to Mercado Pago's APIs and tools within compatible development environments. It acts as an intermediary that translates Mercado Pago resources into executable functions (tools) that AI applications can invoke to perform actions and automate flows. The server simplifies integration, enables using documentation to implement or improve code, and optimizes operations through natural language interactions without manual implementations.
Model Context Protocol server for the Apideck Unified API. Connect any MCP-compatible agent framework to 100+ accounting systems, HRIS platforms, file storage providers, and more through one integration. More information https://www.apideck.com/mcp-server
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
An MCP server that provides read access to your cloud storage providers, bank accounts and more.
Related MCP Servers
- FlicenseDqualityFmaintenanceA 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.234-
- AlicenseNot gradedqualityDmaintenanceAn 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.3MIT
- AlicenseNot gradedqualityCmaintenanceA 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.2MIT
- AlicenseNot gradedqualityCmaintenanceA 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