MCP Server for YNAB
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., "@MCP Server for YNABhow's this month going? anything overspent?"
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.
MCP Server for YNAB
Ask your budget a question. Connect Claude, Codex, Cursor, or any MCP client to YNAB and get answers about your actual money — how the month is going, what is overspent, what your subscriptions really cost.

YNAB_API_KEY=your_token uvx mcp-server-for-ynab smokeRead-only by default. The write tools are not registered at all unless you
set YNAB_ALLOW_WRITES=1, so they never appear to the assistant and nothing can
change your budget until you say so. When you do enable them, every write
records the state that preceded it and can be undone.
An MCP server that exposes the YNAB API as tools, then adds enriched tools answering questions the raw API cannot answer in one call — budget health, cleanup queues, spending analysis, recurring charges.
Quick Start
1. Get a YNAB token
Generate a personal access token at app.ynab.com/settings/developer.
You also need uv, which provides uvx:
curl -LsSf https://astral.sh/uv/install.sh | sh # macOS and Linux
brew install uv # macOS with Homebrew
winget install --id=astral-sh.uv -e # WindowsCheck both work. Nothing to clone — uvx fetches the package and runs it in a
throwaway environment:
YNAB_API_KEY=your_token uvx mcp-server-for-ynab smokesmoke validates configuration and tool registration, then exits. It should
print smoke: app created, 62 tools registered.
2. Add it to your client
Client | Setup |
VS Code (GitHub Copilot) | |
The two most common paths:
Claude Code — install the plugin, which brings its own MCP config:
/plugin marketplace add hs737/mcp-server-for-ynab
/plugin install mcp-server-for-ynab@mcp-server-for-ynabOr register the server directly, if you would rather not use a plugin:
claude mcp add --env YNAB_API_KEY=your_ynab_token --transport stdio --scope user \
ynab -- uvx mcp-server-for-ynab stdioClaude Desktop, Cursor, Windsurf, and most others — paste into the client's MCP config file:
{
"mcpServers": {
"ynab": {
"command": "uvx",
"args": ["mcp-server-for-ynab", "stdio"],
"env": {
"YNAB_API_KEY": "your_ynab_token",
"YNAB_PLAN_ID": "your_plan_id"
}
}
}
}YNAB_PLAN_ID is optional but recommended — with it set, you never have to
name a budget in a request. Full per-client instructions, including where each
config file lives and how to keep the token out of it, are in
Client Setup.
Desktop hosts that accept bundles — download the .mcpb file from the
latest release
and open it. The host asks for your token in a form and stores it in your OS
keychain, so there is no config file to edit and no token sitting in plain text.
A checkbox controls whether writes are enabled.
Docker
A published image is available for linux/amd64 and linux/arm64. The server
speaks MCP over stdin and stdout, so run it attached with -i. There is no
port to publish:
docker run -i --rm -e YNAB_API_KEY=your_ynab_token \
ghcr.io/hs737/mcp-server-for-ynabOr build it yourself from a clone:
docker build -t mcp-server-for-ynab .
docker run -i --rm -e YNAB_API_KEY=your_ynab_token mcp-server-for-ynabIf you enable writes, mount a volume for the history — otherwise --rm discards
the record that makes a revert possible:
docker run -i --rm -e YNAB_API_KEY=your_ynab_token -e YNAB_ALLOW_WRITES=1 \
-v ynab-mcp-history:/home/app/.mcp-server-for-ynab mcp-server-for-ynab3. Ask it something
What's my cash position across all accounts?
If that works, you're set. If it doesn't, see
Troubleshooting — the usual cause is
that the client cannot find uvx on its PATH.
Related MCP server: YNAB MCP Server
What You Can Ask
Read-only, works out of the box:
Ask | Tool it reaches for |
"How is this month's budget doing?" |
|
"What's my cash position across all accounts?" |
|
"Which transactions still need a category?" |
|
"What's waiting for me to approve?" |
|
"Which categories are overspent, and by how much?" |
|
"Which targets won't be funded this month?" |
|
"Are any scheduled transactions at risk?" |
|
"What have I spent at this payee over the last year?" |
|
"What subscriptions am I actually paying for?" |
|
"Does this account match the statement, and what's in the way?" |
|
"Here's the bank CSV — what's missing on each side?" |
|
"Are there card holds sitting on my account that never posted?" |
|
With YNAB_ALLOW_WRITES=1:
Categorize last week's uncategorized transactions, then show me what you changed.
The agent categorizes, and history_list shows every write with the value that
preceded it. history_revert undoes any of them.
Agents work best when they start with overview_available_tools, which returns
the current tool catalog grouped by family. See
Tool Surface for the full map.
Guided workflows
Seven prompts ship with the server, and most clients surface them as slash commands — a starting point that does not require reading the tool list first: monthly review, weekly triage, categorize and approve, subscription audit, cash position, review-and-undo, and a multi-month budget audit.
Four resources (ynab://guide/*) carry the YNAB method, the write-safety
rules, guidance on which tool to reach for, and how credit accounts behave. They are fetched on demand, so
they cost nothing until a client asks for them.
Configuration
Variable | Required | Description |
| Yes | YNAB personal access token |
| Recommended | Default plan ID, making |
| No | Register write tools. Unset means read-only |
| No | Write history file, default |
| No | Client-side request budget, default |
| No | Warn when this many requests remain, default |
| No | Logging verbosity, default |
Set these in your MCP client's env block. For local development, copy
.env.example to .env and fill it in.
Rate limits
YNAB allows 200 requests per hour per token, and a single enriched tool can spend several. The server tracks its own usage in a rolling hour and stops just below YNAB's ceiling, so the limit you hit is local and clearly reported rather than a 429 in the middle of a workflow.
Every tool response carries requests_used_this_hour and requests_remaining,
the way an HTTP API returns X-RateLimit-Remaining — an agent paces itself
against a number it can already see, where asking for it costs a call it will
not make. overview_request_budget adds the limit, the window, and when an
exhausted budget reopens; ping answers whether the server is up at all. Both
cost nothing.
The quota belongs to the access token, so your own YNAB apps spend from it too. The count here is what this server used, which can be less than what YNAB has left — every rate-limit error says so, and carries the reopening time as an absolute timestamp as well as a delay, so a scheduled retry does not come back early.
Tool Families
62 read-only tools, 84 with writes enabled, plus 7 guided prompts and 4 reference resources.
Family | Type | Purpose |
| enriched | Budget health snapshots and orientation |
| enriched | Transaction cleanup queues |
| enriched | Categorization suggestions, memo help, history |
| enriched | Overspending, funding gaps, scheduled risks, card funding, multi-month audits |
| enriched | Statement comparison, bank-export matching, and finishing a reconciliation |
| enriched | Review and roll back writes this server made |
| enriched | What moved since a given |
| raw | YNAB user info |
| raw | Plan and settings reads |
| raw | Account reads and creation |
| raw | Categories and category groups |
| raw | Month-level budget data, multi-month ranges, batch assignment |
| raw | Payee management |
| raw | Geographic payee metadata, niche/low-priority |
| raw | Transaction CRUD and import trigger |
| raw | Scheduled transaction management |
| raw | Money movement data, and moving money between categories |
Raw tools are close mirrors of YNAB endpoints — use them for exact reads and
most writes. Enriched tools combine several reads into one answer — use them
for orientation, investigation, and analysis. Every tool is labeled read or
write, and no enriched tool writes unless its name and description say so.
Reading a lot of budget without reading a lot of JSON
A single month of a real plan is around 60 KB of JSON, because YNAB returns every goal field of every category, hidden ones included. Reviewing a year that way does not fit in a context window.
months_getandcategories_listtakecompact=true, which returns six fields per category instead of thirty — about a quarter of the size.months_rangereturns a whole range as one category-by-month matrix, so a twenty-one-month review is one call rather than twenty-one.category_groups_summary_by_monthdoes the same at group level, which is where most "is this healthy" questions actually live.changes_sincereports what moved since aserver_knowledgevalue, so re-checking after the user edits their budget costs one small call.
Range tools still spend one YNAB request per month — there is no range endpoint — so each one says what it costs and the range is capped at 36 months.
More detail: Tool Surface
Write Tools
Write tools are not registered unless you opt in:
YNAB_ALLOW_WRITES=1Without it the server is read-only, and the write tools are absent from
tools/list — an agent cannot call what it cannot see. This is deliberate: the
server holds a credential that can modify real financial records, and refusing a
call at execution time would still advertise the capability.
Every write is recorded, and most can be undone
When writes are enabled, each one records the state that existed before it. YNAB has no history endpoint, so this is the only way to get an overwritten value back.
Tool | Purpose |
| Recent writes, newest first, each marked revertible or not |
| One entry in full, including the before state |
| Undo one write |
| Roll the plan back to its state at a chosen entry |
history_revert_to undoes everything after the entry you name, newest first,
because overlapping edits to the same record only compose correctly in reverse.
Reverting is itself recorded, so a revert can be reverted.
What cannot be undone. YNAB has no delete route for accounts, categories,
category groups, or payees, so creating one is permanent. Those operations are
recorded as non-revertible with the reason, and a rollback reports them under
blocked rather than skipping them silently — an incomplete rollback that
claims success is worse than one that tells you what it left behind. A
recreated transaction also gets a new id and loses any bank-import link.
Writes are checked, not assumed
Tools that change a value re-read it afterwards and report a verification
block. A 200 response is not proof: YNAB accepts budgeted on the category
update route, returns 200, and ignores it. Verification is what catches that.
Applying a plan, and moving money
YNAB's API assigns money one category-month at a time, which makes a month's plan thirty-five separate writes and thirty-five separate history entries.
months_assign_manyapplies a whole month in one call, journaled as one entry, so it can be undone as the one decision it was.money_movemoves available money between two categories — or to and from Ready to Assign — reading the current amounts and doing the arithmetic, so a carried-forward balance is not mistaken for the assigned amount.reconcile_applyfinishes a reconciliation: it marks the agreed transactions reconciled in one bulk call and posts the adjustment that closes the residual, as a single entry that undoes both together.
Both assignment tools also take adjust_by instead of a total — "add $4,500 to
this category" without your reading the current figure first, since they read it
anyway to record what a revert would restore. It is not an atomic delta: YNAB's
API has no delta and no conditional write, so the amount is read and the sum is
written, and an edit made in the app between those two calls is overwritten.
Pass expected_budgeted alongside it and the write is refused when the amount
read is not the one you expected, so a caller acting on a figure that has
already moved stops rather than overwrites. That is a check before the write,
not a precondition on it: the gap between the read and the write stays open,
because YNAB's route offers nothing to close it with.
Either way the response reports previous_budgeted, budgeted and change, so
a write can be confirmed without a re-read.
None of them is atomic, because YNAB has no transaction boundary. Each reports
what was applied and what failed, and a half-written money_move is still
journaled so the money can be put back.
One limit worth knowing before you reconcile through an agent: YNAB's API has no
route that sets an account's last_reconciled_at. The transactions really are
marked reconciled, but the app will still show the date of the last
reconciliation done there, and the tools say so rather than reporting an account
as reconciled.
Amount Convention
All YNAB monetary amounts are in milliunits: 1000 = $1.00.
Raw tools accept and return milliunits for canonical amount fields.
Enriched tools may include display helpers alongside canonical values.
Your Data
This server stores exactly one thing on your machine: a record of the writes it
made, used by history_revert. Nothing is sent anywhere except api.ynab.com,
and there is no telemetry.
uvx mcp-server-for-ynab history --show # where it is, how much is there
uvx mcp-server-for-ynab history --export out.json
uvx mcp-server-for-ynab history --delete # also removes the ability to revertThese need no credentials and no agent: getting your data back, or gone, should not require running an LLM.
For Contributors
This repo is structured so a contributor or AI agent can answer three questions quickly: where the MCP server lives, where the YNAB API wrappers and models live, and where to add new tools, tests, and docs.
flowchart LR
A["MCP Client"] --> B["MCPServer Server"]
B --> C["Tool Handlers"]
C --> D["ynab_client"]
D --> E["http_client (httpx)"]
E --> F["YNAB API"]
C --> G["enriched/"]
G --> DThe code is centered on a small set of layers:
src/mcp_server_for_ynab/server/: MCPServer app, tool metadata, tool registration, error boundarysrc/mcp_server_for_ynab/ynab_client/: one async wrapper module per YNAB resource familysrc/mcp_server_for_ynab/http_client/: outboundhttpxwrapper with retries, redaction, and error normalizationsrc/mcp_server_for_ynab/models/: typed YNAB shapes, shared error model, milliunit helperssrc/mcp_server_for_ynab/enriched/: higher-level read-only workflows built on top of raw clientstests/: unit, contract, integration, and QA/Postman source assets
Run it from a clone:
git clone https://github.com/hs737/mcp-server-for-ynab
cd mcp-server-for-ynab
uv sync
cp .env.example .env # then set YNAB_API_KEY
make smoke-stdio
make run-stdio
make run-httpRun the tests:
make test
make test-unit
make test-contract
make test-integration
make test-postman-operatorThose check that the server works. evals/ asks a different question — whether
an assistant uses it correctly, which is where this project's real failures
have been: a rate-limit lockout from a loop that should have been one call, an
account reported as reconciled that YNAB still showed as stale. Those cases are
graded by a model rather than asserted, so they run on demand with
claude plugin eval rather than in make check. See
evals/README.md.
Where to read next
If you are:
connecting a client: Client Setup
new to the repo: Architecture
adding code: Contributing, Repo Structure, Agent Guidance
adding or changing tools: Tool Surface, Agent evals
verifying behavior: Testing
working on auth, error handling, or logging: Security
cutting a release, or adding a channel: Distribution — the release notes are the tag annotation, so write them before tagging
Full map: Docs Index. Also: Postman Notes, Legal Notice.
Current State
The current implementation uses Python 3.12, MCPServer from the official mcp
package, asyncio end to end, httpx for outbound YNAB calls, and the built-in
stdio and streamable HTTP transports.
This is a local, personal-access-token server. A hosted or public connector is not implemented — that includes ChatGPT custom connectors, which require a remote HTTPS endpoint rather than a local process. The intent is for a hosted runtime to live in its own repository, importing this package through its embed surface so OAuth and public-app concerns stay out of here.
If architecture and implementation ever diverge, the source of truth should be Architecture, updated to reflect the actual code.
License
Apache License 2.0. See LICENSE and NOTICE.md.
Disclaimer
We are not affiliated, associated, or in any way officially connected with YNAB or any of its subsidiaries or affiliates. The official YNAB website can be found at https://www.ynab.com.
The names YNAB and You Need A Budget, as well as related names, tradenames, marks, trademarks, emblems, and images are registered trademarks of YNAB.
Available Tools
62 toolsaccounts_getAccounts — GetARead-only
[READ] Get a single account by ID. Balance is in milliunits (1000 = $1.00). last_reconciled_at is read-only: no route in the YNAB API sets it, so it stays where the YNAB app last left it however many transactions this server marks reconciled.
| Name | Required | Description | Default |
|---|---|---|---|
| plan_id | No | ||
| account_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered; the description adds genuinely non-obvious context: balances are in milliunits and last_reconciled_at is never written by the API. It does not discuss auth or error behavior, but the domain-specific disclosure is valuable.
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?
Front-loaded with the verb and resource in the first clause, zero filler, and the milliunits note is a compact, high-value unit clarification. The final sentence on last_reconciled_at is longer than needed but still earns its place as non-obvious behavior.
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 read-only semantics are well covered. However, the unexplained plan_id parameter and absent account_id format leave a real gap for a two-parameter lookup tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must carry parameter meaning, but it only says 'by ID'. account_id format and plan_id (nullable, default null, likely the budget selector) are left completely unexplained in both schema and description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Get) and resource (a single account) scoped by ID, and the singular framing clearly distinguishes it from the sibling accounts_list. An agent can route between accounts_get and accounts_list without opening either schema.
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 'single account by ID', but the description never names accounts_list as the alternative or states when to prefer one over the other. No prerequisites or exclusions are given, leaving selection to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
accounts_listAccounts — ListARead-only
[READ] List all accounts for a plan. Balances are in milliunits (1000 = $1.00). last_reconciled_at is read-only everywhere in this API: marking transactions reconciled does not move it, and no tool here can set it. Only reconciling in the YNAB app does, so an account cleaned up through this server will still show its old reconciliation date. Supports delta sync: pass last_knowledge_of_server — the server_knowledge value any earlier response returned — and YNAB sends only what changed since, which is how a long session stays current without re-reading everything. changes_since does the same across categories, months and transactions in one call.
| Name | Required | Description | Default |
|---|---|---|---|
| plan_id | No | ||
| last_knowledge_of_server | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the read-only, non-destructive profile, and the description adds substantial non-obvious behavior: balances are in milliunits (1000 = $1.00), and last_reconciled_at is read-only everywhere in this API — reconciling via this server will not move it. The delta-sync mechanics are also explained. This is exactly the kind of context annotations cannot carry.
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?
Front-loaded with the [READ] tag and the core purpose, and most sentences earn their place. The reconciliation point sprawls across three sentences ("marking transactions reconciled does not move it... Only reconciling in the YNAB app does...") that restate the same fact and could be tightened.
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 key behavioral traits (units, reconciliation, delta sync) plus an alternative tool. The only real gap is the undocumented plan_id, which is minor for a two-parameter read 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 0%, so the description must compensate and only partially does. last_knowledge_of_server is explained well (it is "the server_knowledge value any earlier response returned"), but plan_id gets no explanation at all, leaving half the parameters undocumented in both schema and description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with scope: "List all accounts for a plan." This distinguishes it from the sibling accounts_get (single account) and from the various transactions_*/categories_* listers without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear usage context for delta sync ("pass last_knowledge_of_server ... and YNAB sends only what changed since") and names changes_since as the cross-resource alternative for categories/months/transactions. It never explicitly states when to choose accounts_list over the sibling accounts_get, so it stops short of full when/when-not coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analysis_assignment_patternsAnalysis — Assignment patternsARead-only
[READ] Categories whose monthly assignment equals a fixed base plus the money that arrived in the category that month. This is the interest double-count: a savings category earns interest, the interest is categorised into it, and the assignment is then written as 'the usual $1,500 plus the $12.40 of interest' — funding it twice. Each month is individually plausible, which is why nobody notices; sixteen months of it came to about $841 on the plan this was written for. Narrow it with group_ids or category_ids. from_month and to_month: 'YYYY-MM', an ISO date, or 'current'. total_if_unintended is what the pattern would have double-funded. It is a signal, not a verdict: a category deliberately funded to cover its own activity produces the same shape, so the matching months are reported for checking. Costs one YNAB request per month in the range (limit 36 months); check overview_request_budget before a long range. Plus one for the inflows.
| Name | Required | Description | Default |
|---|---|---|---|
| plan_id | No | ||
| to_month | No | ||
| group_ids | No | ||
| from_month | Yes | ||
| category_ids | No | ||
| include_hidden | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/non-destructive/closed-world, but the description goes well beyond them: it quantifies the request cost (one YNAB request per month, 36-month cap, plus one for inflows), explains the false-positive case (deliberately self-funded categories), and clarifies that total_if_unintended is a signal metric, not a verdict. That is rich behavioral context the annotations cannot carry.
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?
It is front-loaded with the [READ] marker and the core definition, then layers caveats and cost. Nearly every sentence earns its place, though the illustrative anecdote ('sixteen months... about $841') is color that a tighter version could drop.
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 description covers cost, interpretation, filtering, and date formats. The only gaps are the undocumented plan_id and include_hidden parameters, minor for a plan-scoped analysis 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 0%, so the description must compensate, and it does for four of six params: from_month/to_month get explicit accepted formats ('YYYY-MM', ISO date, 'current'), and group_ids/category_ids are explained as narrowing filters. plan_id and include_hidden are left undocumented, so it is not fully complete.
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 names a precise verb and resource: it detects categories whose monthly assignment equals a fixed base plus that month's inflows (interest double-counting). The opening [READ] tag and the concrete mechanism distinguish it immediately from sibling analysis_* tools like analysis_copied_forward_months or analysis_credit_funding.
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?
It tells the agent how to narrow results (group_ids/category_ids), when to check cost (overview_request_budget before a long range), and how to interpret output ('a signal, not a verdict'). It lacks an explicit statement of when this analysis is preferable to a sibling like analysis_flow_trace, so it's a strong 4 rather than a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analysis_copied_forward_monthsAnalysis — Copied forward monthsARead-only
[READ] Find months whose assignments are an exact copy of the month before. That is the signature of YNAB's 'assign last month's amounts' applied without review, which carries one-off assignments forward as though they were the plan — a one-time $10,000 move repeated silently the next month. Defaults to the last 12 months; pass from_month and to_month to widen or shift it. The month before the range is read too, so the first month has something to be compared against. Costs one YNAB request per month in the range (limit 36 months); check overview_request_budget before a long range.
| Name | Required | Description | Default |
|---|---|---|---|
| plan_id | No | ||
| to_month | No | ||
| from_month | No | ||
| include_hidden | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry the safety profile (readOnly, non-destructive, closed-world), and the description adds substantial extra behavior: the per-month request cost, the 36-month limit, the pre-read of the month before the range, and the 12-month default. This is exactly the kind of cost/scope disclosure annotations cannot express.
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?
Front-loads the definition and keeps the operational details (defaults, cost, limits) at the end where they belong. The $10,000 anecdote is illustrative but slightly restates the 'applied without review' idea already conveyed, costing a bit of density.
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, return values need no explanation, and the description covers scope, defaults, and request cost adequately for an analysis tool. The remaining gap is the silent treatment of plan_id and include_hidden, which an agent must infer from the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does explain from_month/to_month semantics (widen or shift the window) plus the effective default. However, plan_id and include_hidden are never addressed, leaving half the parameters undocumented anywhere.
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?
Names a specific verb+resource ('find months whose assignments are an exact copy of the month before') and frames the diagnostic meaning of that pattern. It is clearly distinguishable from sibling analysis tools such as analysis_assignment_patterns or months_range.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear when-to-use context (detecting unreviewed 'assign last month's amounts'), states the default window, and points to overview_request_budget before running a long range. It never names an explicit alternative or a when-not-to-use condition, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analysis_credit_fundingAnalysis — Credit fundingARead-only
[READ] For every credit card and line of credit: what it owes, what its payment category holds, and the difference. Two problems live here and nowhere else in YNAB's interface — debt with no money set aside for it, and money stranded in the payment category of a closed account, which the budget counts as spoken for but cannot spend. Also reports payment categories that went negative in recent months, which is how overspending on a card turns into uncovered debt. months: how many recent months of payment-category history to include (default 6, one request each; 0 to skip). Accounts and payment categories are matched by name, because YNAB provides no identifier linking them; anything unmatched is reported rather than dropped.
| Name | Required | Description | Default |
|---|---|---|---|
| months | No | ||
| plan_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish the safe read-only profile, and the description adds genuinely useful behavior beyond that: one request per month of history, name-based matching because YNAB exposes no linking identifier, and explicit reporting of unmatched accounts/categories rather than silent dropping. It does not state rate-limit or failure behavior in detail, keeping it at a 4.
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?
Front-loaded with a [READ] tag and the core purpose, then the diagnostic value, then the parameter detail. Every sentence is substantive, though the two 'problems' enumeration and the parenthetical explanation of the historical-negative case run slightly long.
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?
Output schema exists so return values need not be explained, and the description covers matching semantics, the months default/cost, and the unmatched-handling edge case. The only real gap is the undocumented `plan_id`, which slightly detracts from an otherwise complete picture for this complexity level.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description has to carry both parameters. It fully documents `months` (default 6, one request per month, 0 to skip) including the cost tradeoff, but `plan_id` is never mentioned, leaving half the parameters undocumented in both schema and description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific analysis resource (credit card / line-of-credit funding) and enumerates exactly what it reports: what each card owes, what its payment category holds, the difference, uncovered debt, and stranded money in closed-account payment categories. The line 'two problems live here and nowhere else in YNAB's interface' cleanly separates it from siblings like analysis_overspent_history and analysis_target_funding_gaps.
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 clear context for when this tool is the right one — detecting debt with no money set aside and funds stranded in a closed account's payment category — and effectively rules out other tools by stating those diagnostics exist nowhere else. It stops short of explicitly naming an alternative tool or a when-not condition, so it is a 4 rather than a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analysis_flow_traceAnalysis — Flow traceARead-only
[READ] Follow one category's money through a range of months: assigned in, moved in, moved out, spent, refunded, and the balance left at the end of each month. This is 'where did the holiday money go', which needs three different YNAB resources to answer because assigning, moving between categories, and spending are three different records. from_month and to_month: 'YYYY-MM', an ISO date, or 'current'. Costs one YNAB request per month in the range (limit 36 months); check overview_request_budget before a long range. Plus two for the money movements and transactions.
| Name | Required | Description | Default |
|---|---|---|---|
| plan_id | No | ||
| to_month | No | ||
| from_month | Yes | ||
| category_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the read-only annotations, the description discloses substantial operational traits: cost of one YNAB request per month in the range, a 36-month limit, an extra two requests for movements and transactions, and a suggestion to check the request budget first. This goes well beyond what the annotations provide.
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?
The description is front-loaded with purpose, then rationale, parameter formats, and cost warning. Every sentence roughly earns its place, though the middle explanatory sentence about three YNAB resources is slightly verbose for the value it adds.
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?
Given the tool's complexity, the presence of an output schema, and read-only annotations, the description covers purpose, parameter formats for two key fields, and cost/limits well. It still omits what happens if 'to_month' is omitted and does not explain 'plan_id', which are notable gaps for a 4-parameter tool with zero schema descriptions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry parameter meaning. It usefully documents the format for 'from_month' and 'to_month' ('YYYY-MM', ISO date, or 'current'), but 'category_id' is only implied and 'plan_id' is entirely unexplained, leaving two of four parameters without clear semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Follow one category's money through a range of months', and enumerates the resulting flow components (assigned in, moved in, moved out, spent, refunded, balance left). This scope distinguishes it from sibling tools that operate on groups, single months, or raw movements, without needing to open a schema.
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?
It gives a clear usage context ('where did the holiday money go') and notes the need to check 'overview_request_budget' before long ranges. However, it does not name alternative tools or specify when-not to use it versus e.g. 'transactions_list_by_category' or 'money_movements_list_by_month'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analysis_group_parityAnalysis — Group parityARead-only
[READ] Compare two category groups month by month: assigned, activity, balance, and the gap between them. Written for plans that split money between two people — paired 'his' and 'hers' or 'partner A' and 'partner B' groups — where the question is whether the two are being funded and spent evenly. Gaps are always group A minus group B. Get group ids from categories_list. from_month and to_month: 'YYYY-MM', an ISO date, or 'current'. Costs one YNAB request per month in the range (limit 36 months); check overview_request_budget before a long range.
| Name | Required | Description | Default |
|---|---|---|---|
| plan_id | No | ||
| to_month | No | ||
| from_month | Yes | ||
| group_a_id | Yes | ||
| group_b_id | Yes | ||
| include_hidden | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/openWorld annotations, the description discloses real operational behavior: the cost model (one YNAB request per month), a hard 36-month limit, and the fixed gap sign convention. Pointing at overview_request_budget for budget checking is genuine guidance an agent can act on.
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?
Front-loaded with the [READ] tag and the core comparison, and every sentence carries weight (framing, sign convention, id source, month format, cost). Slightly dense, but 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?
An output schema exists, so return values need no explanation, and the description still supplies the pieces an agent needs: id provenance, month syntax, sign convention, and rate-limit/cost constraints. Complete for a 6-parameter, 36-month-capped analysis 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 0%, so the description must carry the load: it defines the month format ('YYYY-MM', ISO date, or 'current'), sources group ids from categories_list, and pins down which group is subtracted from which. It does not explain plan_id or include_hidden, leaving those to inference, so not quite a 5.
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 (compare) and resource (two category groups month by month), and enumerates the compared metrics (assigned, activity, balance, gap). The 'group A minus group B' convention and the 'split money between two people' framing make it unmistakable against siblings like category_groups_summary_by_month.
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?
Explicitly scopes when to use it — plans that split money between paired groups where the question is even funding/spending — and gives a prerequisite (get group ids from categories_list) plus a pre-flight step (check overview_request_budget for long ranges). Nothing is left to inference about when this tool applies.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analysis_overspent_categoriesAnalysis — Overspent categoriesBRead-only
[READ] Categories with negative balances for a given month. Sorted by most-overspent first. Includes budgeted, activity, and balance. month: ISO date string for first day of month (e.g. '2024-01-01'). Defaults to current month.
| Name | Required | Description | Default |
|---|---|---|---|
| month | No | ||
| plan_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered (the '[READ]' prefix merely restates it). The description does add a genuine behavioral trait beyond annotations: results are sorted by most-overspent first. Field listing (budgeted, activity, balance) is likely redundant with the output 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?
Front-loaded and compact: purpose, then sort order, then fields, then the month parameter. Every sentence earns its place, with only the redundant '[READ]' tag as minor waste.
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 needn't be explained, and with zero required parameters the call is easy to make. However, plan_id is entirely unaddressed, leaving a real gap for a two-parameter analysis 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 0%, so the description must compensate. It documents month well (ISO date, first day of month, example, defaults to current month) but says nothing about plan_id, leaving half the parameters undocumented in both schema and description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource and scope: categories with negative balances for a given month, sorted most-overspent first. An agent can tell what the tool returns, though it never names or contrasts with the close sibling analysis_overspent_history, so differentiation is left 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?
No when-to-use guidance and no mention of alternatives such as analysis_overspent_history. The only usage context is the month default ('defaults to current month'), which is behavioral, not a selection guideline.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analysis_overspent_historyAnalysis — Overspent historyARead-only
[READ] Every negative month-end category balance across a range, with each overspend flagged as cash or credit and a running total of what was absorbed by Ready to Assign. Cash overspending comes out of the next month's Ready to Assign, which is why a month can look under-funded for a reason invisible inside it; credit overspending stays as a negative balance and becomes debt the payment category has not covered. YNAB does not report which kind an overspend was, so it is inferred from the accounts the category was spent on. from_month and to_month: 'YYYY-MM', an ISO date, or 'current'. Also returns the categories that were overspent in the most months. Costs one YNAB request per month in the range (limit 36 months); check overview_request_budget before a long range. Plus one for the transaction history used to tell cash from credit.
| Name | Required | Description | Default |
|---|---|---|---|
| plan_id | No | ||
| to_month | No | ||
| from_month | Yes | ||
| include_hidden | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the safety profile (readOnly, non-destructive, closed-world), and the description goes well beyond that: the cash-vs-credit inference and why YNAB cannot report it, the downstream effect on next month's Ready to Assign, and the per-month request cost model. This is exactly the extra behavioral context annotations cannot carry.
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?
Front-loaded with '[READ]' and the core return shape, followed by the conceptual cash/credit explanation and then the cost caveat. Dense but every clause carries information; the cash/credit mechanism paragraph is the only mildly padded part.
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 spelled out, yet the description helpfully summarizes them anyway. Cost, limits, and date formats are covered; the only real gap is the semantics of plan_id and include_hidden for a 4-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 0%, so the description must compensate. It does document accepted formats for from_month/to_month ('YYYY-MM', ISO date, or 'current'), but says nothing about plan_id or include_hidden, leaving half the parameters undocumented in both schema and description. Minimum-viable rather than complete.
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+resource (overspent/inference history) and explicitly scopes it 'across a range', which implicitly separates it from the single-period sibling analysis_overspent_categories. It also enumerates what is returned (negative month-end balances, cash/credit flags, running total, most-overspent categories). It misses an explicit disambiguation sentence naming the sibling, 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?
Gives a concrete operational precondition ('check overview_request_budget before a long range') and states the 36-month cap, which tells the agent when the call is expensive. However it never states when to prefer this over analysis_overspent_categories or the month-scoped alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analysis_recurring_chargesAnalysis — Recurring chargesARead-only
[READ] Find repeating charges (subscriptions, memberships, regular bills) and estimate what each costs per year. months: how far back to look, default 12. Charges are grouped by YNAB payee id, not by payee name, so no fuzzy name matching is involved: YNAB already resolves a merchant to one payee regardless of how the bank spelled it. Only outflows count; transfers between your own accounts are excluded. A series needs at least 3 charges on a recognisable cadence (weekly through yearly) to be reported. Each result carries occurrences — treat a series seen 3 times as a weaker signal than one seen 12 times — plus amount_changed and days_since_last, which surface price rises and charges that may have lapsed. Amounts are in milliunits (1000 = $1.00).
| Name | Required | Description | Default |
|---|---|---|---|
| months | No | ||
| plan_id | No | ||
| since_date | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly, non-destructive, closed-world), and the description adds substantial context beyond that: grouping is by payee id rather than name, outflows-only filtering, transfer exclusion, the 3-charge recognition threshold, per-result fields (occurrences, amount_changed, days_since_last), and the milliunits unit convention. This is exactly the operational detail an agent needs to interpret results correctly.
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?
The definition is front-loaded: '[READ]' plus the core purpose lead, followed by parameters, grouping semantics, filtering rules, and result interpretation. It is dense and runs long, but nearly every clause (cadence threshold, occurrences weighting, milliunits) earns its place rather than repeating structured fields.
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 not required, and the description still helpfully interprets the key result fields. The gap is the two unexplained parameters (plan_id, since_date), which for a 3-parameter tool with 0% schema coverage leaves an agent unsure how to scope the query beyond the default window.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden of parameter explanation. It defines 'months' well ('how far back to look, default 12'), but plan_id and since_date — which scope the query to a plan and a date bound — are never mentioned. Two of three parameters are left undocumented in both structured data and prose.
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 opens with a specific verb and resource — 'Find repeating charges (subscriptions, memberships, regular bills) and estimate what each costs per year.' This is unambiguous and immediately distinct from siblings like analysis_overspent_history or analysis_copied_forward_months. An agent can route to this tool without opening the schema.
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?
Scope conditions are stated clearly: only outflows count, transfers between own accounts are excluded, and a series needs at least 3 charges on a recognizable cadence to be reported. This gives strong implicit guidance on when results will and won't appear. It does not name a sibling alternative or an explicit 'use this instead of X' rule, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analysis_target_funding_gapsAnalysis — Target funding gapsARead-only
[READ] Categories with unmet funding goals for a given month. Shows how much more needs to be budgeted to meet each goal target. month: ISO date string for first day of month (e.g. '2024-01-01'). Defaults to current month.
| Name | Required | Description | Default |
|---|---|---|---|
| month | No | ||
| plan_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, openWorldHint=false, so the '[READ]' prefix largely restates structured data. The description does add useful context that the result measures the shortfall against each goal target, but says nothing about scope limits, permissions, or result size.
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?
Three tight sentences, front-loaded with the read tag and the core resource, then the output meaning, then the parameter detail. 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?
An output schema exists, so return values need not be explained, and the month semantics are covered. However, with two parameters and zero schema coverage, leaving plan_id entirely unexplained is a real gap for a tool whose results are presumably plan-scoped.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It documents 'month' well (ISO first-of-month format, example, current-month default), which genuinely exceeds the schema, but 'plan_id' is completely undocumented in both schema and description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource (categories with unmet funding goals) scoped to a given month, plus what the output means (how much more must be budgeted). It separates itself from sibling analyses only implicitly, though — no sibling such as analysis_credit_funding is named as an alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The '[READ]' tag and 'for a given month' framing imply this is a read-only inspection of goal shortfalls, but there is no explicit when-to-use vs. when-not, and no routing to related analyses like analysis_credit_funding or analysis_overspent_categories.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analysis_unassigned_transfersAnalysis — Unassigned transfersARead-only
[READ] Transfers between two on-budget accounts, month by month, against what was assigned in the category groups they were meant to fund. A transfer between on-budget accounts moves no category money — both accounts are already inside the budget — so a standing 'move $1,500 to the joint account' changes no category balance, while looking in the register exactly like it did. Seven months of that went unnoticed on the plan this was written for. group_ids: the groups those transfers were meant to fund. Pass them and the months where money moved and nothing was assigned come back flagged; leave them out and you get the transfers alone. Get group ids from categories_list. account_ids narrows it to transfers touching those accounts. from_month and to_month: 'YYYY-MM', an ISO date, or 'current'. Costs two requests, plus one per month when group_ids is given.
| Name | Required | Description | Default |
|---|---|---|---|
| plan_id | No | ||
| to_month | No | ||
| group_ids | No | ||
| from_month | Yes | ||
| account_ids | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/non-destructive/closed-world, but the description adds a genuinely useful behavioral detail beyond them: the request cost ('two requests, plus one per month when group_ids is given'). It does not discuss permissions or failure modes, but the cost disclosure is real added value.
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?
Front-loaded with [READ] and the core purpose, and the parameter guidance is actionable. However, the anecdotal backstory ('Seven months of that went unnoticed on the plan this was written for') is not needed for an agent to select or invoke the tool and inflates the text.
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, return values need no explanation, and the description covers the important input semantics plus request cost. The unaddressed plan_id and the unstated optionality/defaults for to_month are the only shortfalls.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the load, and it does for most params: group_ids meaning and effect, account_ids narrowing behavior, and from_month/to_month accepted formats ('YYYY-MM', ISO date, 'current'). plan_id and to_month's default/optionality are never mentioned, leaving one clear gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource scope: transfers between two on-budget accounts reviewed month by month against category-group assignments. It explains why the analysis exists (on-budget transfers move no category money while looking like normal transactions). It does not explicitly differentiate itself from siblings like analysis_flow_trace or money_movements_list_by_month, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete conditional guidance: pass group_ids to get flagged months where money moved with no assignment, omit them to get the transfers alone, and it names categories_list as the source of group ids. It also documents accepted date formats. It lacks explicit 'do not use this when...' framing relative to sibling analyses, so 4 rather than 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analysis_upcoming_scheduled_risksAnalysis — Upcoming scheduled risksARead-only
[READ] Scheduled outflows due within lookahead_days that may exceed category balances. Flags each transaction as is_risk=true when the category balance is insufficient. lookahead_days: how many days ahead to scan (default 30, max recommended 90).
| Name | Required | Description | Default |
|---|---|---|---|
| plan_id | No | ||
| lookahead_days | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/openWorldHint/destructiveHint, so the bar is lower, yet the description adds real behavioral detail: it discloses the exact criterion that sets is_risk=true (insufficient category balance) and the default/ceiling for the scan window. It omits any note on cost or result volume, so it is not a 5.
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?
Three compact sentences, front-loaded with the core purpose and capability. The '[READ]' prefix partially duplicates the readOnlyHint annotation, which is minor waste but not enough to hurt readability.
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 not required. For a read-only two-parameter analysis tool, the description supplies the risk criterion and window guidance; only the unexplained plan_id leaves a small 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 0%, so the description must carry parameter meaning. It explains lookahead_days well (default 30, max recommended 90), but plan_id is never mentioned, leaving one of two parameters undocumented in both schema and prose.
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+resource: scheduled outflows within a lookahead window that may exceed category balances, plus the is_risk flagging behavior. This clearly distinguishes it from sibling list tools like scheduled_transactions_list, which merely enumerate scheduled transactions without risk assessment.
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 phrase 'may exceed category balances' implies the analytic use case, but the description never says when to prefer this over scheduled_transactions_list or analysis_overspent_categories, nor any prerequisite for plan_id. Usage is inferable but not explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bookkeeping_categorization_suggestionsBookkeeping — Categorization suggestionsARead-only
[READ] Suggest categories for uncategorized transactions using payee history. Confidence: high (>=80% of past transactions), medium (>=50%), or low (<50%). Does NOT write — use transactions_update to apply suggestions.
| Name | Required | Description | Default |
|---|---|---|---|
| plan_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds genuinely new behavioral context: the confidence tiers (high >=80%, medium >=50%, low <50%) derived from payee history, which shapes how an agent should treat each suggestion.
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?
Three short sentences, all load-bearing, with scope and the read/write boundary front-loaded. 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 simple read-only suggestion tool with an output schema and full annotation coverage, the description supplies purpose, confidence semantics, and the handoff to the write tool. The only real gap is the undocumented plan_id parameter, which is minor relative to everything else covered.
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?
There is one parameter (plan_id) with 0% schema description coverage, and the description never mentions it or what scope it controls. The schema provides only a title and null default, so the description leaves the parameter entirely unexplained.
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 ('Suggest categories for uncategorized transactions') and the mechanism ('using payee history'). The [READ] prefix plus the explicit pointer to transactions_update cleanly separates it from the write-side 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?
Usage is scoped to 'uncategorized transactions' and the description explicitly states 'Does NOT write — use transactions_update to apply suggestions', naming both the when-not condition and the alternative tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bookkeeping_memo_annotation_suggestionsBookkeeping — Memo annotation suggestionsARead-only
[READ] Find transactions missing memos that probably need them. Flags large transactions (>= $50) and splits without memos. since_date: ISO date to limit history (e.g. '2024-01-01').
| Name | Required | Description | Default |
|---|---|---|---|
| plan_id | No | ||
| since_date | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/openWorldHint/destructiveHint, so the safety profile is covered. The description adds genuinely useful behavioral detail beyond that: the $50 large-transaction threshold and the split-line flagging rule, which tell the agent what counts as 'probably needs one'.
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?
Three compact sentences, front-loaded with the action and scoping heuristic, then the one parameter hint. 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?
Output schema exists so return values need no explanation, and annotations cover safety. The remaining gap is the unexplained plan_id and the absence of any note on scope/default behavior when since_date is omitted.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry parameter meaning. It documents since_date with an ISO format example, but plan_id — a nullable parameter — is not explained at all, leaving half the parameters undocumented.
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 ('find transactions missing memos') plus the heuristic that decides inclusion (>= $50, splits without memos). This clearly separates it from siblings like bookkeeping_categorization_suggestions, so an agent can route without opening schemas.
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 scope ('transactions missing memos that probably need them') implies when it applies, but there is no explicit when-to-use/when-not guidance and no named alternative among the many bookkeeping/triage siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bookkeeping_transaction_historyBookkeeping — Transaction historyARead-only
[READ] Retrieve recent transactions with optional filters and totals. Filter by one of: payee_id, category_id, or account_id. since_date: ISO date to limit history (e.g. '2024-01-01'). Returns inflow, outflow, and net totals in addition to the transaction list.
| Name | Required | Description | Default |
|---|---|---|---|
| plan_id | No | ||
| payee_id | No | ||
| account_id | No | ||
| since_date | No | ||
| category_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered. The description adds real behavioral context beyond that: it returns aggregated inflow, outflow, and net totals in addition to the transaction list, and enforces single-filter selection. It does not mention pagination or result limits, keeping it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, front-loaded with a [READ] tag and the core action, then filters, then the date parameter detail. No filler. Slightly dense around the filter list, but every sentence carries 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 not be detailed, and the description usefully names the aggregate totals anyway. The gap is plan_id, which is undocumented in both schema and description, leaving an agent unsure how it interacts with the filter parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 5 parameters, so the description must compensate. It does partially: since_date gets a format and example ('2024-01-01'), and the mutual exclusivity of the three *_id filters is conveyed. But plan_id is never explained, and the filter params get no ID-format guidance. Baseline is above 1 only because of the real added meaning.
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 ('Retrieve recent transactions') and states the scope: filters plus inflow/outflow/net totals. It is clear what the tool does, but it does not explicitly distinguish itself from the many sibling list tools (transactions_list, transactions_list_by_account, etc.), so an agent must infer the difference.
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?
It provides the key usage constraint that only one of payee_id, category_id, or account_id should be used at a time, which is useful filtering guidance. However, it never says when to prefer this tool over the sibling transactions_* list tools, nor does it state 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.
categories_getCategories — GetBRead-only
[READ] Get a single category by ID. Amounts are in milliunits (1000 = $1.00).
| Name | Required | Description | Default |
|---|---|---|---|
| plan_id | No | ||
| category_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the '[READ]' prefix is largely redundant. The description does add one genuinely useful behavioral detail not in structured fields: amounts are reported in milliunits (1000 = $1.00), which prevents misinterpretation of returned values.
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, front-loaded with the operation and followed by the unit convention. Nothing is wasted and no filler is present.
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 milliunits note covers the main interpretive risk. However, for a tool whose schema has 0% parameter documentation, leaving plan_id entirely unexplained makes the definition only minimally 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 0% and neither parameter is documented in the schema. The description clarifies that category_id is an ID lookup and introduces the milliunits convention, but the optional plan_id parameter is never mentioned, leaving a real gap in a 2-parameter tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get a single category by ID'), which is clearer than the sibling list tools and distinguishes the single-item fetch. It does not, however, name the alternatives (categories_list, categories_get_for_month, category_groups_summary_by_month) to route the agent explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance at all: nothing explains when to prefer this over categories_list, categories_get_for_month, or categories_list. 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.
categories_get_for_monthCategories — Get for monthARead-only
[READ] Get a category's budgeted, activity, and balance for a specific month. month: ISO date string for the first day of the month (e.g. '2024-01-01'). Amounts are in milliunits (1000 = $1.00).
| Name | Required | Description | Default |
|---|---|---|---|
| month | Yes | ||
| plan_id | No | ||
| category_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds genuinely useful non-schema context: the milliunits convention (1000 = $1.00) and the ISO first-of-month requirement, both of which affect correct interpretation of results. No rate limits or auth notes, but the added unit semantics justify a 4 against an already-covered safety profile.
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, zero filler, with the operation and the critical formatting rule (month) and unit scale front-loaded. Every clause carries information an agent needs.
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 milliunits note covers interpretation anyway. The remaining gap is that two of three parameters (category_id, plan_id) are undocumented in both schema and description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for all three parameters. It does document month's format with a concrete example, but category_id and plan_id remain entirely unexplained, so compensation is only partial.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get a category's budgeted, activity, and balance') and scopes it to a month, which is enough to distinguish it from the all-time categories_get and the list-oriented categories_list. It stops short of explicitly contrasting with those siblings, so it is clear but not sibling-differentiating.
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, no prerequisites, and no named alternative. The month scoping implies a use case, but the agent must infer on its own that categories_get is the non-month-scoped counterpart.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
categories_listCategories — ListARead-only
[READ] List all categories grouped by category group. Amounts (budgeted, activity, balance) are in milliunits (1000 = $1.00) and are for the current month. compact=true returns only id, group, name, budgeted, activity and balance per category — about a quarter of the size, and enough to find an id or read the shape of a plan. include_hidden=true adds hidden categories, which is where YNAB keeps the credit-card payment categories; deleted categories are never returned. Note: category group listing is embedded here — YNAB returns categories already grouped. Supports delta sync: pass last_knowledge_of_server — the server_knowledge value any earlier response returned — and YNAB sends only what changed since, which is how a long session stays current without re-reading everything. changes_since does the same across categories, months and transactions in one call.
| Name | Required | Description | Default |
|---|---|---|---|
| compact | No | ||
| plan_id | No | ||
| include_hidden | No | ||
| last_knowledge_of_server | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the safety profile (readOnlyHint=true, destructiveHint=false); the description adds substantial operational context beyond that — milliunits convention (1000 = $1.00), current-month scope, roughly a quarter payload size for compact mode, that hidden categories are where credit-card payment categories live, and that deleted categories are never returned.
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?
Front-loaded with the read verb and resource, and nearly every clause earns its place (units, hidden categories, delta semantics). It runs as one dense unbroken block, which makes it slightly harder to scan than a short structured list would be.
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 shape needn't be described, and the description still covers scope (current month), units, hidden/deleted handling, compact mode, and incremental sync. For a four-parameter read tool this leaves nothing an agent needs unresolved.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden, and it delivers: compact, include_hidden, and last_knowledge_of_server are each explained with effect and intended use, including that the value comes from a prior response's server_knowledge. Only plan_id is left implicit, a minor gap given the rest.
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?
Opens with a specific verb+resource and scope: '[READ] List all categories grouped by category group.' The note that group listing is embedded here distinguishes it cleanly from categories_get (single category) and the group-summary/money-movement siblings without the agent needing to open any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete when-to-use guidance per mode: compact=true 'enough to find an id or read the shape of a plan', include_hidden=true for credit-card payment categories, and delta sync to keep a long session current. It also nudges toward the changes_since sibling for cross-resource sync, but never states explicit exclusions against the other listing tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
category_groups_summary_by_monthCategory groups — Summary by monthARead-only
[READ] Per-group, per-month totals of budgeted, activity and balance. Most 'is this budget healthy' questions live at group level, and a group view is small enough to read whole where a category view is not. from_month and to_month: 'YYYY-MM', an ISO date, or 'current'. to_month defaults to the current month. Hidden categories are included by default here, because excluding them would silently drop the credit-card payment group; pass include_hidden=false to leave them out. Amounts are in milliunits (1000 = $1.00). Costs one YNAB request per month in the range (limit 36 months); check overview_request_budget before a long range.
| Name | Required | Description | Default |
|---|---|---|---|
| plan_id | No | ||
| to_month | No | ||
| from_month | Yes | ||
| include_hidden | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/non-destructive, but the description adds substantial non-obvious context: hidden categories are included by default and why (dropping the credit-card payment group), milliunits convention, and the cost model (one request per month, 36-month cap). This is behavior an agent cannot get from the schema or annotations.
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?
Front-loads a [READ] tag and the core purpose, then layers format, defaults, cost. Every sentence earns its place with no filler; density is high but not padded.
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 needn't be described; given the tool's complexity, the description covers inputs, defaults, units, cost limits and sibling relationship. Nothing essential to a correct 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?
With 0% schema description coverage the description must carry parameters, and it does for three of four: from_month/to_month accept 'YYYY-MM', ISO date, or 'current', to_month defaults to current month, and include_hidden defaults true with a rationale. Only plan_id is left unexplained.
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?
State a precise verb+resource: per-group, per-month totals of budgeted, activity and balance. It explicitly contrasts with a category-level view ('a group view is small enough to read whole where a category view is not'), so an agent can distinguish it from sibling aggregation tools.
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?
Names the question class it serves ('is this budget healthy' at group level), states the default for to_month, and warns to check overview_request_budget before a long range. It routes the agent toward the right scenario and away from costly misuse.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
changes_sinceChanges — Since last checkARead-only
[READ] What changed in the plan since a given server_knowledge value: categories, months, and transactions, compactly. Use it after the user edits their budget in the app instead of re-reading everything. Call it with no arguments first to get a baseline server_knowledge, then pass that value back on each later call. Every response returns the value to use next time. This is the cheap way to keep a long session honest: re-reading a range you already have costs one request per month, and this costs three no matter how much moved. Deleted records are omitted, and delta sync reports that a record changed, not how — the values shown are current ones. Costs three requests.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| plan_id | No | ||
| server_knowledge | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, non-destructive, closed-world behavior, and the description adds real context beyond that: deleted records are omitted, a delta only reports that a record changed (not how) so values shown are current, and the call costs three requests regardless of volume. It stops short of describing pagination/limit behavior against the default of 200.
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?
Front-loads the purpose and the calling protocol, and most sentences earn their place. The cost point is stated twice at the end ('this costs three no matter how much moved' and 'Costs three requests'), which is a minor 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?
With an output schema present, return values need not be described, and the description covers the incremental-sync workflow, deletion behavior, and cost model well. It is only slightly incomplete in not addressing what limit and plan_id do.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description has to carry the load, and it does explain server_knowledge thoroughly (baseline, then passed back each call). However, limit and plan_id are never mentioned, leaving two of three parameters without any semantic guidance.
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 — what changed in the plan since a given server_knowledge value — and names the entities returned (categories, months, transactions). It is clearly distinguishable from the list/get siblings because it is framed as an incremental delta rather than a full read.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use (after the user edits their budget in the app instead of re-reading everything), an explicit calling protocol (call with no arguments first for a baseline, then pass the value back), and an alternative it outperforms (re-reading a range costs one request per month vs. three here).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
history_listHistory — ListARead-only
[READ] List writes this server has made, newest first. Each entry says whether it can be reverted and how. Use this before history_revert or history_revert_to to choose an entry. Entries are recorded even when writes are later disabled, so history survives a restart.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| plan_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so safety is covered. The description adds genuine behavioral context beyond that: each entry reports revertability, and history is persisted across restarts even when writes are disabled. It does not describe volume or pagination behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the read-only marker and the core behavior, then usage, then a persistence caveat. No sentence is 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?
An output schema exists, so return values need not be explained, and the description covers ordering, revertability, usage routing, and persistence. It stops short of documenting parameter semantics or result volume, which is the only meaningful gap for this 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 0% and the description never mentions either parameter. The meaning of 'limit' (default 25) and especially 'plan_id' scoping is left entirely to inference, so the description fails to compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List writes this server has made'), plus the ordering ('newest first') and the [READ] tag. An agent can distinguish this from history_show and history_revert siblings without opening any schema.
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?
Explicitly says to use this before history_revert or history_revert_to in order to choose an entry, naming the alternatives and the condition that selects this tool. That is a complete when-to-use statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
history_showHistory — ShowARead-only
[READ] Show one history entry in full, including the before and after state. The before state is what a revert would restore.
| Name | Required | Description | Default |
|---|---|---|---|
| entry_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/destructive/openWorld, so the safety profile is covered. The description earns credit for adding semantic context beyond that: the entry contains before and after state, and the before state is what a revert would restore — a real behavioral insight for an agent reasoning about undo.
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, zero filler, with the read-only tag and the core scope front-loaded. Every sentence carries 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 shape needs no explanation, and the description covers what the entry contains and its revert relevance. The only real gap is omitting how the required entry_id is sourced.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the single entry_id parameter is undocumented in the schema. The description never mentions entry_id, its format, or where to obtain it, so it fails to compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Show) and resource (one history entry), plus the distinguishing content: full before/after state. It contrasts adequately with history_list via the 'one ... in full' framing, though it never names that 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?
Usage is implied — call it when you have an entry_id and need the complete entry — but there is no explicit when-to-use, no prerequisite (e.g., obtain entry_id from history_list first), 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.
money_movement_groups_listMoney movement groups — ListARead-only
[READ] List money movement groups for a plan. A group ties together the movements made in a single action; it carries no amount of its own. Join movements to a group on money_movement_group_id. Supports delta sync: pass last_knowledge_of_server — the server_knowledge value any earlier response returned — and YNAB sends only what changed since, which is how a long session stays current without re-reading everything. changes_since does the same across categories, months and transactions in one call.
| Name | Required | Description | Default |
|---|---|---|---|
| plan_id | No | ||
| last_knowledge_of_server | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=true, destructiveHint=false, openWorldHint=false), so the bar is lower, and the description still adds meaningful non-obvious behavior: groups carry no amount, movements join on money_movement_group_id, and last_knowledge_of_server must be fed the server_knowledge value from a prior response. It does not mention pagination or rate limits, but the delta-sync contract is the important disclosure here.
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?
Three sentences, front-loaded with the read tag and the core action, then the domain model, then the sync mechanics. Every sentence carries information. The closing clause about changes_since is slightly tangential for a list endpoint but earns its place as sibling routing.
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 spelled out, and the description covers the object semantics, the join key, and the incremental-read contract. The gaps are minor: what happens when plan_id is omitted (all plans vs. error) and whether results are paginated are not addressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and there are no descriptions on either property, so the description must compensate — and it does for the harder parameter, explaining exactly what last_knowledge_of_server expects ('the server_knowledge value any earlier response returned') and why. plan_id is only implied by the phrase 'for a plan', and its null default is never explained.
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 money movement groups for a plan') and then defines the domain object itself: 'A group ties together the movements made in a single action; it carries no amount of its own.' That definition cleanly separates it from money_movements_list and money_movement_groups_list_by_month, which an agent cannot infer from the name alone.
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?
It gives real guidance for the delta-sync path ('pass last_knowledge_of_server ... YNAB sends only what changed since') and names changes_since as the cross-entity alternative. But it never says when to pick this tool over money_movement_groups_list_by_month or money_movements_list, nor whether plan_id is required in practice, leaving the core routing decision implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
money_movement_groups_list_by_monthMoney movement groups — List by monthBRead-only
[READ] List money movement groups for a specific month. A group ties together the movements made in a single action; it carries no amount of its own. month: ISO date string for the first day of the month (e.g. '2024-01-01').
| Name | Required | Description | Default |
|---|---|---|---|
| month | Yes | ||
| plan_id | No | ||
| last_knowledge_of_server | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, destructiveHint=false and openWorldHint=false, so the '[READ]' prefix is largely redundant. The description does add genuine domain context — that a group is a container with no amount of its own — but says nothing about pagination or the incremental-sync behavior implied by last_knowledge_of_server.
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?
Three short sentences, front-loaded with the core action, then the domain clarification, then the parameter format. Efficient overall, though the '[READ]' tag duplicates the annotations and is minor 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?
An output schema exists, so return values need not be described. However, for a 3-parameter tool with no schema descriptions, the two optional parameters — plan scoping and the server-knowledge cursor — are undocumented, leaving real gaps for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden. It documents month well (ISO date string, first day of month, example), but plan_id and especially last_knowledge_of_server — a sync cursor whose semantics are non-obvious — are left completely unexplained.
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 with a clear scope qualifier ('List money movement groups for a specific month'), and the definition of what a group is distinguishes it conceptually from money_movements_list. It does not explicitly name the sibling money_movement_groups_list (all-months) as the alternative, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the 'by_month' scope and the required month parameter, but there is no explicit when-to-use/when-not-to-use guidance or reference to the unfiltered sibling. An agent must infer that this tool is for month-scoped retrieval versus money_movement_groups_list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
money_movements_listMoney movements — ListARead-only
[READ] List all money movements for a plan. A money movement is budgeted funds moved between categories within a month — it is not a transaction and has no payee or account. A null from_category_id or to_category_id means Ready to Assign. Amounts are in milliunits (1000 = $1.00). Supports delta sync: pass last_knowledge_of_server — the server_knowledge value any earlier response returned — and YNAB sends only what changed since, which is how a long session stays current without re-reading everything. changes_since does the same across categories, months and transactions in one call.
| Name | Required | Description | Default |
|---|---|---|---|
| plan_id | No | ||
| last_knowledge_of_server | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description goes well beyond that by disclosing null-semantics for from/to_category_id (Ready to Assign), the milliunits unit convention, and the stateful sync contract of last_knowledge_of_server — real behavioral context an agent needs to interpret results.
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?
Front-loaded with purpose and concept definition before the sync mechanics, and every sentence carries information. The final changes_since sentence is slightly tangential for a listing tool, but it is one sentence and it does route the agent correctly.
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; instead the description covers the domain concept, unit interpretation, null handling, and sync semantics. For a 2-parameter, zero-required, read-only list tool, that is everything an agent needs to call it 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 0% and the schema only supplies titles, so the description must carry the load. It does: last_knowledge_of_server is explained as the server_knowledge value from an earlier response, and plan_id is contextualized as the plan being listed. This is meaningful added semantics, though it doesn't state plan_id's type/format or what happens when it is omitted.
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 all money movements for a plan') and then defines the domain concept precisely: budgeted funds moved between categories within a month, explicitly not a transaction with no payee or account. That definition cleanly separates it from the many transactions_* and money_movement_groups_* 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?
Gives concrete when-to-use guidance for delta sync ('pass last_knowledge_of_server ... and YNAB sends only what changed'), which selects this tool for incremental refresh. It also names the alternative changes_since for cross-resource sync. It stops short of stating when to prefer money_movements_list_by_month or money_movement_groups_list, so it is clear context rather than full routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
money_movements_list_by_monthMoney movements — List by monthARead-only
[READ] List money movements (budgeted funds moved between categories) for a specific month. month: ISO date string for the first day of the month (e.g. '2024-01-01'). A null from_category_id or to_category_id means Ready to Assign. Amounts are in milliunits (1000 = $1.00).
| Name | Required | Description | Default |
|---|---|---|---|
| month | Yes | ||
| plan_id | No | ||
| last_knowledge_of_server | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the barrier is low; the description still adds real value with the '[READ]' marker, the milliunits convention (1000 = $1.00), and the rule that a null category id means Ready to Assign. It omits pagination/sync behavior tied to last_knowledge_of_server, keeping it from a 5.
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?
Three compact sentences, front-loaded with the operation, and each sentence adds distinct information (scope, month format, unit conventions). No filler or repetition of the title.
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, and the required month parameter is fully specified. The only gap is the two optional parameters (plan_id, last_knowledge_of_server), which an agent cannot interpret from either the schema or the description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 3 parameters, so the description must carry the load: it documents the required 'month' format thoroughly (ISO first day of month, with example) and explains category semantics, but plan_id and last_knowledge_of_server are never mentioned. The month coverage is good, the rest is undocumented in both places.
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+resource+scope ('List money movements ... for a specific month') and even defines the domain term ('budgeted funds moved between categories'), so an agent knows exactly what comes back. It does not explicitly distinguish itself from close siblings like money_movements_list or money_movement_groups_list_by_month, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use, when-not-to-use, or alternative routing guidance. The agent is left to infer from the name alone whether to prefer this over money_movements_list or the groups variant. The only contextual help is about parameter semantics, not tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
months_getMonths — GetARead-only
[READ] Get one month's categories with their budgeted, activity, and balance. month: ISO date for the first day of the month ('2024-01-01'), 'YYYY-MM', or 'current'. compact=true returns only id, group, name, budgeted, activity and balance per category — about a quarter of the size, and enough for any month-over-month review. Use the full form only when you need goal fields or notes. include_hidden=true adds hidden categories, which is where YNAB keeps the credit-card payment categories; deleted categories are never returned. To compare several months, use months_range instead (up to 36 months in one call). Amounts are in milliunits (1000 = $1.00).
| Name | Required | Description | Default |
|---|---|---|---|
| month | Yes | ||
| compact | No | ||
| plan_id | No | ||
| include_hidden | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered. The description nonetheless adds real behavioral context beyond the annotations: deleted categories are never returned, hidden categories are where credit-card payment categories live, and amounts are in milliunits (1000 = $1.00). It stops short of describing pagination or error behavior, but adds meaningful value.
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?
Front-loads the core action and payload, then packs format, compaction, hidden-category, and unit notes into tight clauses. Every sentence adds information, though the milliunits and hidden-category asides make it slightly dense for a single-resource getter.
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 structure needn't be re-explained, yet the description usefully covers units (milliunits) and what fields compact returns. Combined with the format guidance for 'month' and the sibling routing, an agent has everything needed to invoke this 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 coverage is 0%, so the description carries the full burden. It fully documents the required 'month' param (three accepted ISO/YYYY-MM/'current' forms), the compact flag's effect and size tradeoff, and include_hidden's semantics. The 'plan_id' parameter is never mentioned, which is the one clear gap for a 4-param tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Get') and resource ('one month's categories') with the exact payload contents (budgeted, activity, balance). It also names the sibling months_range and the condition that distinguishes them, so an agent can disambiguate without opening schemas.
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?
Explicit when-to-use guidance for each mode: compact=true for month-over-month review, full form only when goal fields or notes are needed, include_hidden=true specifically to surface credit-card payment categories. It also routes multi-month comparison to months_range (up to 36 months), naming the alternative directly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
months_listMonths — ListARead-only
[READ] List budget months with summary data (income, budgeted, activity, to_be_budgeted). Amounts are in milliunits (1000 = $1.00). Months in which nothing happened — no income and no activity — are left out by default, the way YNAB's own month picker leaves them out. YNAB keeps records for months before a plan really began, sometimes carrying a stray assignment and a large negative to_be_budgeted, and a review that starts from the first month in this list starts a year before the budget did. omitted_month_count says how many went; include_empty=true returns them. Supports delta sync: pass last_knowledge_of_server — the server_knowledge value any earlier response returned — and YNAB sends only what changed since, which is how a long session stays current without re-reading everything. changes_since does the same across categories, months and transactions in one call.
| Name | Required | Description | Default |
|---|---|---|---|
| plan_id | No | ||
| include_empty | No | ||
| last_knowledge_of_server | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, but the description adds substantial context: milliunits convention, the default omission of empty months, the omitted_month_count field, the caveat about pre-plan months carrying stray assignments and large negative to_be_budgeted, and the delta-sync mechanism via server_knowledge. This is well beyond 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?
Dense but front-loaded: the read nature and payload come first, followed by omission behavior and delta sync. The final changes_since sentence is slightly tangential but earns its place by routing to the correct alternative.
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 isn't required, yet the description still surfaces key response fields (omitted_month_count, server_knowledge). Combined with the omission caveat, an agent has everything needed to call and interpret this tool 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 0%, so the description carries the burden. It explains include_empty and last_knowledge_of_server meaningfully (including the server_knowledge source), but plan_id is never mentioned, leaving one of three parameters undocumented.
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?
'[READ] List budget months with summary data' gives a specific verb, resource, and payload fields. This clearly distinguishes it from months_get (single month) and months_range among the 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?
Explicitly documents when months are excluded by default, when to use include_empty, when to use last_knowledge_of_server for delta sync, and names changes_since as an alternative that spans categories/months/transactions. Provides concrete 'why' context for the omission behavior.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
months_rangeMonths — RangeARead-only
[READ] Budgeted, activity and balance for every category across a range of months, as one matrix. This is the tool for any month-over-month question: one call instead of one months_get per month, and a quarter of the size, because it returns six fields per category rather than every goal field YNAB tracks. from_month and to_month: 'YYYY-MM', an ISO date, or 'current'. to_month defaults to the current month. Narrow it with category_ids or group_ids (category_ids wins if both are given). fields: which of budgeted, activity and balance each cell carries — all three by default, and dropping the two you are not reading takes roughly two thirds off a forty-category range. include_hidden=true adds hidden categories, including the credit-card payment ones. The response carries as_of: a range is a snapshot, and one cached earlier in a session is not what the plan says now. Re-read it, or use changes_since, before acting on an old one. Amounts are in milliunits (1000 = $1.00). Costs one YNAB request per month in the range (limit 36 months); check overview_request_budget before a long range.
| Name | Required | Description | Default |
|---|---|---|---|
| fields | No | ||
| plan_id | No | ||
| to_month | No | ||
| group_ids | No | ||
| from_month | Yes | ||
| category_ids | No | ||
| include_hidden | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint/destructiveHint annotations, it discloses real operational traits: the as_of snapshot nature and caching hazard, one request per month consumed, and a 36-month cap. These are exactly the behavioral facts annotations cannot carry.
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?
The [READ] tag and core purpose are front-loaded, and nearly every sentence carries distinct information. It is a long single paragraph, so the cost/limit and milliu nit details could be split for scannability, costing a point on structure rather than content.
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 shape need not be explained, yet the description still adds the one piece the schema can't convey: that as_of makes the result a point-in-time snapshot. Combined with cost limits, milliunit units, and filter semantics, it is complete for a 7-param 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?
With 0% schema description coverage, the description carries the full burden and does: from_month/to_month accepted formats ('YYYY-MM', ISO date, 'current'), to_month default, category_ids vs group_ids precedence, the meaning of fields and its cost trade-off, and include_hidden behavior. Only plan_id goes undocumented.
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 opens with a specific verb+resource: '[READ] Budgeted, activity and balance for every category across a range of months, as one matrix.' It explicitly distinguishes itself from months_get ('one call instead of one months_get per month') and points to changes_since for staleness, so an agent can route without opening any schema.
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?
It names the use case ('any month-over-month question'), the alternative it replaces (per-month months_get), and the escalation path for stale data (changes_since), plus a prerequisite check (overview_request_budget before a long range). When-to-use is explicit rather than inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
overview_available_toolsOverview — Available toolsARead-only
[READ] List all available tools grouped by family, with classification and summary. Start here to understand what the server can do before running other tools. Also returns conventions worth knowing before the first call: how amounts are expressed, which reads cost a request per month, and what hidden categories are.
| 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?
Annotations already declare readOnlyHint=true, so safety is covered; the description goes beyond them by disclosing that the response carries conventions such as how amounts are expressed, which reads cost a request per month, and hidden categories. That is genuinely useful pre-call context, though return shape details are left to the output 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?
Three sentences, front-loaded with the [READ] marker and the primary action, then the routing advice, then the extra payload. Efficient, though the middle and last sentences could be tightened slightly.
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 enumerated, and the description supplies the routing rationale and the notable extra content the overview returns. Complete enough for an agent to decide to call it first, with only minor room for detail.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline for a no-param tool is 4. No param-level value could be added here.
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 all available tools grouped by family, with classification and summary') and its scope is unambiguous. As the meta/overview tool it is inherently differentiated from every domain sibling like payees_get or transactions_list.
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?
Explicitly directs the agent: 'Start here to understand what the server can do before running other tools.' That is clear when-to-use guidance, though it gives no when-not condition or named alternative (the schema itself has no competing sibling).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
overview_balance_identityOverview — Balance identityARead-only
[READ] Check that the plan adds up: category balances plus Ready to Assign should equal the on-budget account balances plus credit-card debt. It holds whether or not the budget is healthy, so a mismatch means the data is inconsistent — a stale read, a missing category, an account the plan is not counting — rather than that the budgeting is wrong. Run it first in a review: if it ties, the rest of the numbers can be trusted. Costs three requests.
| Name | Required | Description | Default |
|---|---|---|---|
| plan_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only/safe profile, but the description adds genuinely non-obvious behavioral context: the check is health-independent, so a failure signals data inconsistency (stale read, missing category, uncounted account), and it discloses cost ('Costs three requests'). That is real added value beyond the structured fields.
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?
Front-loads the [READ] tag and the purpose, then adds interpretation and cost in tight sentences. No sentence is filler; each adds a distinct piece of 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 needn't be explained, and annotations plus the description cover safety, cost, and interpretation. The only shortfall is the silent handling of plan_id, which an agent must guess.
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?
With one optional parameter at 0% schema description coverage, the description carries the burden but never mentions plan_id or what happens when it is omitted (default null). The name is fairly self-explanatory in a 'plan' domain, but the semantics of the default are left to inference.
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 precise verb (check) and resource (the plan's balance identity) and spells out the exact arithmetic relation it verifies (category balances + Ready to Assign = on-budget account balances + credit-card debt). This is specific enough to distinguish it from siblings like overview_cash_position or overview_budget_snapshot.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use guidance ('Run it first in a review') and, crucially, tells the agent how to interpret the result — a tie means downstream numbers can be trusted, a mismatch means inconsistent data rather than bad budgeting. This steers invocation order and interpretation clearly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
overview_budget_snapshotOverview — Budget snapshotARead-only
[READ] Single-call budget health snapshot. Returns current month income, spending, to-be-budgeted, age of money, account counts, and overspent categories. Good first call for any budget session. Also reports two things nothing else in YNAB surfaces: unfunded_card_debt, what the credit cards owe beyond what their payment categories hold, and trapped_funds, money assigned to the payment category of a closed or missing account. Costs three requests.
| Name | Required | Description | Default |
|---|---|---|---|
| plan_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=false, destructiveHint=false, so the safety profile is covered. The description adds real behavioral context beyond that: it is a 'single-call' aggregate and, crucially, 'Costs three requests,' a cost disclosure an agent needs before invoking. This is the kind of non-obvious trait the description should carry.
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?
Front-loaded with the '[READ] Single-call budget health snapshot' lead, then outputs, then unique fields, then cost. Every sentence earns its place, including the cost note, with no redundancy or 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?
An output schema exists, so return values needn't be explained in prose, and annotations cover the safety profile; the description still adds selection value by naming the aggregate contents and the unique fields. The only material gap is the unexplained plan_id, which keeps it from a full 5.
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 plan_id has 0% schema description coverage and is not mentioned anywhere in the description. With low coverage the description must compensate for the ambiguity (what plan_id means, whether it defaults to a primary plan), and it does not; the agent must infer behavior from the nullable default alone.
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+resource ('single-call budget health snapshot') and enumerates the concrete outputs (income, spending, to-be-budgeted, age of money, overspent categories), which lets an agent predict the payload. It also flags value nothing else surfaces (unfunded_card_debt, trapped_funds), aiding disambiguation. It stops short of naming which sibling overview_* tool it replaces, so it's clear but not fully differentiated.
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?
'Good first call for any budget session' gives explicit positive context for when to reach for it. It does not, however, name alternatives (overview_month_health, overview_balance_identity, overview_cash_position) or state when-not to use it, so an agent can't fully route between the sibling overview tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
overview_cash_positionOverview — Cash positionBRead-only
[READ] Summarize account balances. Returns on-budget total, off-budget total, net worth, and per-account detail. Cleared vs uncleared breakdown included for on-budget accounts.
| Name | Required | Description | Default |
|---|---|---|---|
| plan_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the '[READ]' tag is largely redundant. The description adds that the breakdown is cleared vs uncleared for on-budget accounts only, which is genuine behavioral context beyond the annotations, but says nothing about whether plan_id changes scope or about pagination/limits.
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?
Three short sentences, front-loaded with the operation and then the return contents. The '[READ]' prefix is redundant given the readOnlyHint annotation, but otherwise 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?
An output schema exists, so the enumeration of returned values is not strictly necessary and the description needn't explain returns. However, the one input parameter is left unexplained and there is no guidance on when to reach for this tool among the many overview siblings, leaving the definition minimally adequate rather than 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?
One optional parameter (plan_id) with 0% schema description coverage, and the description never mentions it. It does not explain what plan_id selects or what happens when it is omitted (default null), leaving the single parameter's semantics entirely undocumented.
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 ('Summarize') and resource ('account balances') and enumerates what it returns (on-budget total, off-budget total, net worth, per-account detail), so the agent knows exactly what this produces. It does not, however, explicitly distinguish itself from near siblings such as overview_balance_identity or overview_budget_snapshot, which is the only thing keeping it from a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to choose this over the many other overview_* tools (budget_snapshot, month_health, balance_identity). Usage is only implied by the name and the 'cash position' framing. No prerequisites or exclusions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
overview_month_healthOverview — Month healthARead-only
[READ] Summarize a budget month. Returns income, budgeted, activity, to-be-budgeted, overspent categories, and underfunded goals. Defaults to current month. Also reports the previous month's overspending, by group: it is settled before this month is budgeted, so a month can have less to assign than its income suggests for a reason nothing inside the month shows. Only cash overspending comes out of Ready to Assign — analysis_overspent_history separates that from overspending charged to a card. month: ISO date string for first day of month (e.g. '2024-01-01'). Costs two requests.
| Name | Required | Description | Default |
|---|---|---|---|
| month | No | ||
| plan_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, non-destructive, closed-world, so the safety profile is covered. The description goes further with non-obvious behavior: it costs two requests, it reports the previous month's overspending by group because it is settled before this month, and only cash overspending comes out of Ready to Assign. That is genuine context beyond the annotations.
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?
The purpose and returned fields are front-loaded in the first sentence, and the default behavior follows immediately. The middle explanation of previous-month overspending is a long, dense clause, but it conveys a real semantic trap rather than 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?
An output schema exists, so the description is not obliged to enumerate return values, yet it does. With annotations covering safety and cost/behavior quirks disclosed, the main remaining gap is the undocumented plan_id parameter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full parameter burden. It defines month precisely ('ISO date string for first day of month, e.g. 2024-01-01') but says nothing about plan_id, leaving one of two parameters undocumented in both places.
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?
[READ] Summarize a budget month' is a specific verb+resource, and the description enumerates the returned measures (income, budgeted, activity, to-be-budgeted, overspent categories, underfunded goals) plus the previous-month overspending report. It separates itself from analysis_overspent_history by name. It does not, however, distinguish itself from close overview siblings like overview_budget_snapshot, 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?
The only routing guidance is implicit: 'Defaults to current month' and the pointer to analysis_overspent_history when the cash-vs-card split of overspending matters. There is no statement of when to prefer this over overview_budget_snapshot, months_get, or months_range, so usage is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
overview_request_budgetOverview — Request budgetARead-only
[READ] How many API requests remain in the current rolling hour, in full. Every other tool already returns requests_used_this_hour and requests_remaining on its response, so call this one only for the rest: the limit, the window, and when an exhausted budget reopens. YNAB allows 200 per token per hour and this server budgets slightly below that. The quota belongs to the access token and is shared with your own YNAB apps, so the figure here is what this server spent, not necessarily what YNAB has left. This tool costs no API requests.
| 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?
Goes well beyond the readOnlyHint/destructiveHint annotations by disclosing that the tool costs no API requests, that the quota belongs to the access token and is shared with the user's own YNAB apps, and that the reported figure reflects this server's spend rather than YNAB's true remainder.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, each earning its place, with the direct answer ('how many requests remain') front-loaded before the caveats about scope and cost.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values needn't be described; the description supplies the quota semantics, the approximate limit, and the zero-cost trait that an agent needs to use the result 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?
There are zero parameters, so the schema carries no semantic burden and the description has nothing to add; baseline 4 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 (read) and resource (remaining API request budget in the current rolling hour) and distinguishes itself from every sibling by noting they already return requests_used_this_hour and requests_remaining.
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?
Explicitly scopes when to call it: 'call this one only for the rest: the limit, the window, and when an exhausted budget reopens', and tells the agent not to call it for data already present in other tools' responses.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
payee_locations_getPayee locations — GetBRead-only
[READ] Get a single payee location by ID (geographic lat/lon data). Low priority: rarely useful for AI budget workflows.
| Name | Required | Description | Default |
|---|---|---|---|
| plan_id | No | ||
| payee_location_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is fully covered. The description's '[READ]' tag merely repeats readOnlyHint and it adds no new behavioral context — no not-found/error behavior, no permission requirements, no note on whether it is scoped to plan_id.
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, front-loaded with the operation and the resource, with no redundant filler. The '[READ]' prefix is wasted space given readOnlyHint already conveys it, slightly costing efficiency.
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 core lookup is adequately conveyed. Still, the unaddressed plan_id parameter and lack of any not-found/scope behavior leave gaps for a tool whose schema provides zero description coverage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry parameter meaning, and it largely does not: it covers the required payee_location_id only implicitly ('by ID' and 'lat/lon data') while the optional plan_id parameter is left entirely unexplained in both schema and description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get a single payee location by ID') and clarifies the data is geographic lat/lon, which distinguishes it from the list siblings (payee_locations_list, payee_locations_list_for_payee). It does not name those siblings explicitly, so an agent still has to infer that 'single by ID' is the differentiator.
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 'Low priority: rarely useful for AI budget workflows' note is a genuine when-not signal that helps an agent deprioritize this tool. However, it never points to an alternative (e.g., use payee_locations_list_for_payee to enumerate) or states the condition under which this lookup *is* warranted.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
payee_locations_listPayee locations — ListBRead-only
[READ] List all payee locations (geographic lat/lon data from bank imports). Low priority: rarely useful for AI budget workflows.
| Name | Required | Description | Default |
|---|---|---|---|
| plan_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered, and the '[READ]' prefix only restates that. The description adds real value by explaining the data's origin (bank imports), but says nothing about result volume, pagination, or scope limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with the operation and its data meaning. The '[READ]' tag is redundant with readOnlyHint but costs only a few characters.
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 priority warning covers routing. The remaining gap is plan_id, undocumented in both schema and description, which leaves the agent guessing about scoping.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the single parameter (plan_id, nullable, defaulted to null) is never mentioned in the description. With no schema-level documentation, the description carries the burden here and fails to explain what plan_id scopes or what happens when it is omitted.
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+resource ('List all payee locations') and disambiguates with a parenthetical defining what a payee location is ('geographic lat/lon data from bank imports'). It does not explicitly distinguish itself from close siblings like payee_locations_get or payee_locations_list_for_payee, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly flags priority ('Low priority: rarely useful for AI budget workflows'), which steers the agent away from over-calling and is genuine when-to-use guidance. It does not name the alternative tool to use instead, so it isn't fully prescriptive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
payee_locations_list_for_payeePayee locations — List for payeeARead-only
[READ] List all locations for a specific payee (geographic lat/lon data). Low priority: rarely useful for AI budget workflows.
| Name | Required | Description | Default |
|---|---|---|---|
| plan_id | No | ||
| payee_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so safety is covered. The description adds only the '[READ]' tag, the lat/lon nature of the payload, and a priority hint — some value, but no detail on pagination, auth, or result 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?
Two short sentences, front-loaded with the action and scope, with the caveat trailing deliberately. Nothing is redundant or padded.
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 annotations carry the safety profile. The gap is the undocumented plan_id parameter, which an agent cannot resolve from description or schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry parameter meaning. 'Specific payee' loosely implies payee_id, but plan_id is never mentioned and no format or filtering semantics are given for either parameter.
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 all locations') scoped to 'a specific payee', with the parenthetical clarifying the data is geographic lat/lon. The scope phrase implicitly separates it from the sibling payee_locations_list, though that sibling is not named.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides an explicit negative-use signal ('Low priority: rarely useful for AI budget workflows'), which is genuine when-not-to-use guidance. It does not, however, route the agent to a better alternative for the task it is discouraging.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
payees_getPayees — GetCRead-only
[READ] Get a single payee by ID.
| Name | Required | Description | Default |
|---|---|---|---|
| plan_id | No | ||
| payee_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The '[READ]' prefix simply restates the readOnlyHint=true annotation, adding no new behavioral context. Nothing is said about what happens for an unknown payee_id, whether the optional plan_id changes the result scope, or any authorization requirements. With annotations covering the safety profile, the description was free to spend its words on behavior and chose not to.
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, front-loaded with the verb and resource; no padding. The redundant '[READ]' tag is the only wasted token, but the description is otherwise tight.
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 return shape need not be described, but with 0% schema coverage the description should at minimum explain plan_id and error behavior for a missing payee. Two parameters, one of them unexplained, leaves the agent guessing before invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden, yet it only implies payee_id ('by ID') and never mentions plan_id at all. The meaning of a nullable plan_id — whether it scopes the payee to a plan or defaults globally — is undocumented in both places.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get a single payee') and scopes it to one record versus a collection. It does not name payees_list as the alternative, so sibling differentiation is left 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 versus payees_list or payee_locations_list_for_payee, and no prerequisites (e.g. does payee_id need to come from a prior list call?). The agent must infer all of this from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
payees_listPayees — ListARead-only
[READ] List all payees for a plan. Supports delta sync: pass last_knowledge_of_server — the server_knowledge value any earlier response returned — and YNAB sends only what changed since, which is how a long session stays current without re-reading everything. changes_since does the same across categories, months and transactions in one call.
| Name | Required | Description | Default |
|---|---|---|---|
| plan_id | No | ||
| last_knowledge_of_server | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=false and destructiveHint=false, so safety is covered. The description adds genuinely non-obvious behavior: incremental/delta retrieval semantics and the meaning of the server_knowledge token, which an agent could not infer from 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?
Front-loaded with the core action and the delta-sync mechanic immediately after. The closing sentence on changes_since is somewhat tangential for a payees tool but earns its place as a routing hint; otherwise the text is tight.
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, and the description still usefully ties last_knowledge_of_server back to the server_knowledge value in responses. Only the plan_id default and behavior when omitted are left unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% with 2 parameters, so the description carries the burden. It compensates well for last_knowledge_of_server (origin of the value, effect on the response), but plan_id is never mentioned and its null default is unexplained. Partial compensation justifies the 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 and resource ('List all payees for a plan') with the [READ] marker, which is enough to distinguish it from payees_get, payee_locations_list, and transactions_list_by_payee. It does not explicitly name the sibling it is not, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains the condition for using the delta-sync parameter ('pass last_knowledge_of_server ... and YNAB sends only what changed since') and points at changes_since as the cross-resource alternative. It gives clear context but no explicit exclusions or a when-not-to-use statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pingServer — PingARead-only
[READ] Is this server up? Answers from the process alone: no YNAB request, no token check, no budget read. This exists for the agent that has been rate limited and scheduled itself to come back — the way to find out whether the server is still reachable must not be a call that spends the quota it is waiting on, or that fails for a second, unrelated reason. Returns the server version, whether write tools are registered, and the request budget.
| 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?
Annotations already declare readOnlyHint/openWorldHint/destructiveHint, but the description adds behavior those annotations cannot convey: zero API calls, no token validation, no budget read, and the deliberate quota-free design intent. It also previews the payload (version, whether write tools are registered, request budget), which is real disclosure beyond structured fields.
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?
Front-loaded with the [READ] tag and the core question, then rationale and return contents. The rate-limit rationale sentence is longer than strictly necessary, but it is the tool's raison d'être and each sentence carries 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?
For a zero-parameter ping with an output schema, the definition supplies everything an agent needs: what it does, why it exists, its cost profile, and a preview of the return. Nothing material 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?
There are zero parameters and 100% schema coverage, so the baseline is 4. The description correctly treats this as a no-argument call and spends no words on non-existent parameters.
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 — a health/ping check on the server — and immediately scopes it ('answers from the process alone'). It is clearly distinguishable from data-reading siblings like overview_request_budget or transactions_list because it explicitly performs no YNAB request, token check, or budget read.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete when-to-use scenario: an agent that has been rate limited and needs a reachability check that does not spend quota or fail for unrelated reasons. It effectively describes when-not-to-use (anything that touches the API/token). It stops short of naming a specific alternative sibling, so it is clear context rather than full routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
plans_getPlans — GetARead-only
[READ] Get a single plan with full account, category, and month data. Pass last_knowledge_of_server for delta sync — only changed data is returned. The response includes server_knowledge for use in the next delta request.
| Name | Required | Description | Default |
|---|---|---|---|
| plan_id | No | ||
| last_knowledge_of_server | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=true, destructiveHint=false, openWorldHint=false), so the description is free to add the delta-sync behavior — a genuinely useful trait not derivable from structured fields. It stops short of error behavior or what 'full data' resolves to when plan_id is null.
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?
Three tight sentences, front-loaded with the [READ] tag and the core action, then the optional delta-sync mechanism. Every sentence earns its place and none repeats the schema.
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 spelled out, and the delta-sync loop is fully explained. The remaining gap is the null/omitted plan_id case, which is left undefined for a tool where that parameter is not required.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description carries the burden. It explains last_knowledge_of_server well (delta sync semantics and the server_knowledge handshake), but says nothing about plan_id, which is optional with a null default — an agent cannot tell what omitting it does.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Get a single plan') plus the scope of returned data ('full account, category, and month data'), which implicitly separates it from plans_list. It never names plans_list or plans_get_settings explicitly, so sibling differentiation is inferred rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives one concrete usage condition: pass last_knowledge_of_server for delta sync. But it never says when to prefer this tool over plans_list or plans_get_settings, nor when plan_id should be omitted (its default is null). Usage context is implied but incomplete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
plans_get_settingsPlans — Get settingsARead-only
[READ] Get plan settings including currency format and date format. Note: this endpoint is intentionally narrow — it returns formatting preferences only, not budget data.
| Name | Required | Description | Default |
|---|---|---|---|
| plan_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the safety profile is covered. The description still adds real value by disclosing scope limits — it says the endpoint deliberately returns only formatting preferences, which prevents an agent from expecting budget data. It omits any note on permissions or failure modes, keeping it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the read verb and the payload description, followed by the scope caveat. No filler and no repetition of the title.
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, and the read-only nature is covered by annotations. The only real gap is the undocumented plan_id parameter and what happens when it is omitted, which leaves the agent guessing at the call shape.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and plan_id carries no documentation in the schema. The description never mentions plan_id, its optionality, or the effect of its null default, so it does not compensate for the coverage gap on the one parameter that exists.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get plan settings') and enumerates the returned content ('currency format and date format'). The explicit exclusion of budget data separates it from the sibling plans_get, which a reader can distinguish without opening either schema.
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 note that the endpoint is 'intentionally narrow' and returns formatting preferences rather than budget data implies when this tool is the right pick, but it never names an alternative or states a triggering condition. Usage is inferable rather than spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
plans_listPlans — ListBRead-only
[READ] List all YNAB plans (budgets) available to the authenticated user.
| 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?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is fully covered and the bracketed "[READ]" tag is largely redundant. The one piece of added context is the auth-scoped visibility ("available to the authenticated user"), which is modest value over the annotations.
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, so an agent can read it instantly. The only slight waste is the "[READ]" prefix, which merely restates the readOnlyHint annotation.
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 zero-parameter list tool with an output schema that documents the return shape, the description supplies identity and access scope adequately. It could note relationship to plans_get, but nothing essential to invoking it 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 zero parameters, so there is nothing for the description to clarify and the baseline of 4 applies. No parameter-level detail is needed or missing.
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 ("YNAB plans (budgets)") with a clear scope ("available to the authenticated user"). The plural "all" implicitly distinguishes it from the sibling plans_get, 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 description offers no when-to-use or when-not-to-use guidance and never mentions the sibling plans_get for retrieving a single plan. For a discovery-style list tool, a note like "use this first to obtain plan IDs" would be the natural place to route the agent, but none is present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reconcile_previewReconcile — PreviewARead-only
[READ] Does this account agree with its statement, and if not, what is in the way. This is what YNAB's reconcile screen does, and nothing else here answers it: the cleared balance as of a date, the statement balance you give it, the difference between them, and the four queues that explain a difference — transactions cleared but not yet reconciled, uncleared ones old enough to be suspect, hand-entered ones the bank never matched, and card authorisations that never posted. statement_balance: the closing balance from the statement, in milliunits (1000 = $1.00), negative for a credit card you owe money on. as_of_date: the statement's closing date (ISO, defaults to today). The cleared balance is computed as of that date, which is why it can differ from YNAB's own current figure. Costs two requests, and changes nothing — reconcile_apply is the write.
| Name | Required | Description | Default |
|---|---|---|---|
| plan_id | No | ||
| account_id | Yes | ||
| as_of_date | No | ||
| stale_after_days | No | ||
| statement_balance | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=true, destructiveHint=false), yet the description adds real incremental context: it costs two requests, it changes nothing, and the cleared balance is computed as of the given date so it can legitimately differ from YNAB's current figure. It also explains what the four output queues represent, which is behavioral substance the annotations cannot carry.
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?
Front-loaded with the question it answers and marked [READ]; the parameter notes and closing resource-cost line are compact and each earns its place. The opening sentence is somewhat run-on with its four-queue enumeration, but no sentence is 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?
An output schema exists, so return values need not be spelled out, and the description still goes further by characterizing what those outputs mean. Combined with the safety annotations, the alternative-tool pointer, and the parameter units, an agent has everything needed to select and call it 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?
With 0% schema description coverage the description must compensate, and it does for the two required/central params: statement_balance is documented with units and sign convention (milliunits, 1000 = $1.00, negative for money owed) and as_of_date with format and default. stale_after_days is only obliquely implied by "old enough to be suspect" and plan_id/account_id get no mention, so it is strong but not complete.
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+resource with scope: it answers whether an account agrees with its statement and enumerates exactly what it returns (cleared balance, statement balance, difference, four explanatory queues). It explicitly distinguishes itself from the sibling write path by naming reconcile_apply, so an agent can route without opening the schema.
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?
"This is what YNAB's reconcile screen does, and nothing else here answers it" gives clear when-to-use framing, and "reconcile_apply is the write" names the alternative for the mutation case. No explicit when-not or prerequisite conditions beyond that, so it falls short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scheduled_transactions_getScheduled transactions — GetARead-only
[READ] Get a single scheduled transaction by ID. Amount is in milliunits (1000 = $1.00).
| Name | Required | Description | Default |
|---|---|---|---|
| plan_id | No | ||
| scheduled_transaction_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so safety is covered. The description adds genuine value beyond them with the '[READ]' marker and the milliunits convention (1000 = $1.00), which prevents misreading returned amounts; it omits auth requirements and error behavior for a missing ID.
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, front-loaded with the operation and followed by the unit convention. 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 structure need not be described, and the milliunits note covers the one ambiguous output convention. However, the unexplained optional plan_id parameter leaves the definition short of complete for a 2-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 description coverage is 0% for two parameters, so the description must compensate. It clarifies scheduled_transaction_id implicitly ('by ID') but says nothing about the optional plan_id, leaving half the parameters undocumented in both schema and description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb+resource+scope ('Get a single scheduled transaction by ID'), which cleanly separates it from the sibling scheduled_transactions_list. An agent can pick the right tool without opening the schema.
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 only implied by 'by ID' — the description never states when to prefer this over scheduled_transactions_list or analysis_upcoming_scheduled_risks, nor any prerequisite such as needing an ID from the list call first. Adequate but with clear gaps.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scheduled_transactions_listScheduled transactions — ListARead-only
[READ] List all scheduled transactions for a plan. Includes date_next (next occurrence) for each. Amounts are in milliunits (1000 = $1.00). Supports delta sync: pass last_knowledge_of_server — the server_knowledge value any earlier response returned — and YNAB sends only what changed since, which is how a long session stays current without re-reading everything. changes_since does the same across categories, months and transactions in one call.
| Name | Required | Description | Default |
|---|---|---|---|
| plan_id | No | ||
| last_knowledge_of_server | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds real context beyond that: amounts are in milliunits (1000 = $1.00), each record carries date_next, and the server_knowledge delta-sync contract is explained. No rate limits or error semantics, but strong for a list 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?
Front-loaded with the operation and its [READ] marker, then date_next prefix, units, and delta-sync. Every sentence earns its place, though the closing sentence about changes_since is more about routing than about this tool and could be trimmed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 2-parameter list tool with an output schema (so return shape need not be described), the description covers the operation, the delta-sync contract, units, and an included field. The only hole is the undefined plan_id, which is minor given the surrounding plans_* tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must carry the burden, and it does for the non-obvious parameter: last_knowledge_of_server is defined as the server_knowledge value returned by an earlier response. plan_id is never mentioned, which keeps this from a 5.
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?
Opens with a specific verb and resource plus scope: "[READ] List all scheduled transactions for a plan," and flags the [READ] nature up front. It does not, however, differentiate itself from the closely-named sibling scheduled_transactions_get or from the broader changes_since, so the agent must infer the list-vs-single distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete when-to-use rule for delta sync ("pass last_knowledge_of_server … YNAB sends only what changed") and names changes_since as the broader cross-entity alternative. It stops short of an explicit when-not-to-use or a direct either/or against scheduled_transactions_get.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
transactions_getTransactions — GetARead-only
[READ] Get a single transaction by ID. Includes subtransactions for split transactions. Check transfer_account_id to identify transfer transactions. Amount is in milliunits (1000 = $1.00).
| Name | Required | Description | Default |
|---|---|---|---|
| plan_id | No | ||
| transaction_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only/non-destructive, so the bar is lower, yet the description still adds real domain context: split transactions return subtransactions, transfer_account_id flags transfers, and amounts are in milliunits. It doesn't cover not-found/error behavior, which would be the remaining useful addition.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short, front-loaded sentences with the read marker first and zero filler. Each sentence contributes distinct information an agent needs.
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, return-value documentation is unnecessary, and the description covers the notable edge cases (splits, transfers, units). The gap is the undocumented plan_id, but otherwise complete 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 0%, so the description must compensate, but it only indirectly gestures at transaction_id ('by ID') and says nothing at all about plan_id — its meaning, default, or whether it is required. The milliunits note describes values in the response, not the parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Get') and resource ('a single transaction by ID'), and the phrase 'single transaction' cleanly distinguishes it from the many transactions_list* siblings. An agent can pick this over transactions_list without opening any schema.
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 'by ID' framing clearly implies this is the tool to use when a transaction_id is already known, versus list/search tools for discovery. It never explicitly names alternatives or states when-not-to-use, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
transactions_listTransactions — ListARead-only
[READ] List transactions for a plan. since_date: ISO date string (e.g. '2024-01-01') — only transactions on or after this date. type: 'uncategorized' or 'unapproved' for filtered lists. Amounts are in milliunits (1000 = $1.00). Includes subtransactions for split transactions. Supports delta sync: pass last_knowledge_of_server — the server_knowledge value any earlier response returned — and YNAB sends only what changed since, which is how a long session stays current without re-reading everything. changes_since does the same across categories, months and transactions in one call.Returns a paginated envelope with items, count, has_more, and next_offset. limit defaults to 100 and cannot exceed 500. Filters applied before paging: cleared ('cleared', 'uncleared', 'reconciled'), approved (true/false), manual_only=true for transactions with no import_id (entered by hand), min_amount to keep only transactions whose absolute amount is at least that many milliunits. fields: name the columns you need and each item is projected down to them, which is where the size of a long list actually goes — fields=['id,date,amount,cleared,import_id,payee_name,memo'] is a fraction of the full row. id is always included, and an unknown name is refused with the list of valid ones. Fields that are null or empty are omitted from each item. A missing category_id therefore means the transaction is uncategorized, and a missing subtransactions list means it is not a split.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | ||
| limit | No | ||
| fields | No | ||
| offset | No | ||
| cleared | No | ||
| plan_id | No | ||
| approved | No | ||
| min_amount | No | ||
| since_date | No | ||
| manual_only | No | ||
| last_knowledge_of_server | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint and destructiveHint already declared, the description adds substantial behavioral context: milliunits, inclusion of subtransactions, pagination envelope, delta-sync mechanism, filter-before-paging, field projection, and the semantic implications of omitted null fields. This goes well beyond what annotations cover.
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?
The description is dense but every clause carries operational information, and the core purpose is front-loaded. It is a run-on block without structural breaks, which slightly reduces readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 11 optional parameters, delta sync, pagination, and an output schema, the description covers filters, paging, sync, field projection, and null-field semantics thoroughly. The main gap is not routing to the by-account/category/payee/month siblings, but the tool's own behavior is well specified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description bears the full burden and explains nearly every parameter with concrete semantics (ISO date format, filter values, milliunits, default/max limit, field projection behavior). Offset is inferable from next_offset and plan_id from 'for a plan', so the compensation is strong.
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 opens with a specific verb-resource pair ('List transactions for a plan') and explicitly contrasts itself with the delta-sync sibling changes_since. It does not, however, distinguish this general list from the many transactions_list_by_* variants, so sibling differentiation is incomplete.
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?
It gives clear guidance on delta sync (pass last_knowledge_of_server to get only changes) and names changes_since as the alternative for cross-entity deltas, plus type for filtered lists. It lacks explicit when-to-use guidance versus the transactions_list_by_account/category/payee/month siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
transactions_list_by_accountTransactions — List by accountARead-only
[READ] List transactions for a specific account. Amounts are in milliunits. A transfer to another on-budget account moves no category money — both accounts are already inside the budget — so a transfer in this list changed no category balance and no assignment. Check assignments separately, or use analysis_unassigned_transfers. Supports delta sync: pass last_knowledge_of_server — the server_knowledge value any earlier response returned — and YNAB sends only what changed since, which is how a long session stays current without re-reading everything. changes_since does the same across categories, months and transactions in one call.Returns a paginated envelope with items, count, has_more, and next_offset. limit defaults to 100 and cannot exceed 500. Filters applied before paging: cleared ('cleared', 'uncleared', 'reconciled'), approved (true/false), manual_only=true for transactions with no import_id (entered by hand), min_amount to keep only transactions whose absolute amount is at least that many milliunits. fields: name the columns you need and each item is projected down to them, which is where the size of a long list actually goes — fields=['id,date,amount,cleared,import_id,payee_name,memo'] is a fraction of the full row. id is always included, and an unknown name is refused with the list of valid ones. Fields that are null or empty are omitted from each item. A missing category_id therefore means the transaction is uncategorized, and a missing subtransactions list means it is not a split.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | ||
| limit | No | ||
| fields | No | ||
| offset | No | ||
| cleared | No | ||
| plan_id | No | ||
| approved | No | ||
| account_id | Yes | ||
| min_amount | No | ||
| since_date | No | ||
| manual_only | No | ||
| last_knowledge_of_server | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it read-only/non-destructive, and the description adds substantial context beyond that: milliunits as the amount unit, that transfers move no category money, delta-sync semantics, that filters are applied before paging, and that omitted null fields signal uncategorized/unsplit items. That is genuine behavioral insight an agent couldn't infer from the annotations.
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?
Front-loaded and dense, but a few sentences don't earn their place — the trailing 'changes_since does the same...' remark is tangential to this tool, and 'which is how a long session stays current without re-reading everything' is filler. The delta-sync sentence is also run-on.
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?
Output schema exists so return values needn't be spelled out, yet the description still explains the paginated envelope and field projection. With most of the 12 parameters covered, only the unexplained type/plan_id/since_date prevent full completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the whole burden and mostly delivers: it defines cleared values, approved, manual_only, min_amount (absolute value, milliunits), fields projection rules with id always included, limit default 100 / max 500, and last_knowledge_of_server. It leaves type, plan_id, and since_date unexplained, keeping it from a 5.
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?
Opens with '[READ] List transactions for a specific account,' a specific verb + resource + scope that sharply separates it from siblings like transactions_list_by_category, transactions_list_by_payee, and transactions_list_by_month.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives real routing guidance: transfers aren't visible as category changes so it names analysis_unassigned_transfers as an alternative, and it explains when to use delta sync (last_knowledge_of_server) versus a full read, cross-referencing changes_since. It doesn't explicitly state when to prefer plain transactions_list or the by_month sibling, so it falls short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
transactions_list_by_categoryTransactions — List by categoryARead-only
[READ] List transactions for a specific category. Amounts in milliunits. Returns a paginated envelope with items, count, has_more, and next_offset. limit defaults to 100 and cannot exceed 500. Filters applied before paging: cleared ('cleared', 'uncleared', 'reconciled'), approved (true/false), manual_only=true for transactions with no import_id (entered by hand), min_amount to keep only transactions whose absolute amount is at least that many milliunits. fields: name the columns you need and each item is projected down to them, which is where the size of a long list actually goes — fields=['id,date,amount,cleared,import_id,payee_name,memo'] is a fraction of the full row. id is always included, and an unknown name is refused with the list of valid ones. Fields that are null or empty are omitted from each item. A missing category_id therefore means the transaction is uncategorized, and a missing subtransactions list means it is not a split.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | ||
| limit | No | ||
| fields | No | ||
| offset | No | ||
| cleared | No | ||
| plan_id | No | ||
| approved | No | ||
| min_amount | No | ||
| since_date | No | ||
| category_id | Yes | ||
| manual_only | No | ||
| last_knowledge_of_server | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only/non-destructive, and the description adds substantial extra behavior: filters applied before paging, limit default 100 capped at 500, fields projection and its effect on payload size, id always retained, unknown field names rejected with the valid list, and null/empty fields omitted.
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?
Dense but mostly front-loaded, leading with the read/list/category framing before finer detail. It is long, and the null-omission corollaries at the end could be tightened, but nearly every sentence conveys actionable semantics.
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 needn't be described, yet the envelope shape is still summarized, and the paging/filter/projection model is well covered. The remaining gap is the four undocumented optional parameters, which an agent may need to use 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 coverage is 0%, so the description carries the burden and does well: it explains cleared's enum values, approved, manual_only (no import_id), min_amount as absolute milliunits, limit bounds, and the fields projection convention. However, type, plan_id, since_date, and last_knowledge_of_server remain undocumented, leaving four of twelve parameters unexplained.
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) plus resource (transactions) and the discriminating scope ('for a specific category'), which distinguishes it from the many sibling list variants (by_account, by_payee, by_month, plain list). The '[READ]' prefix signals the operation class immediately.
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 category scoping and the enumerated filters, but the description never says when to prefer this over transactions_list, transactions_list_by_account, or transactions_list_by_month. With many near-identical siblings, an explicit routing sentence is missing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
transactions_list_by_monthTransactions — List by monthARead-only
[READ] List transactions for a specific month. month: ISO date string for the first day of the month (e.g. '2024-01-01'). Amounts in milliunits. Returns a paginated envelope with items, count, has_more, and next_offset. limit defaults to 100 and cannot exceed 500. Filters applied before paging: cleared ('cleared', 'uncleared', 'reconciled'), approved (true/false), manual_only=true for transactions with no import_id (entered by hand), min_amount to keep only transactions whose absolute amount is at least that many milliunits. fields: name the columns you need and each item is projected down to them, which is where the size of a long list actually goes — fields=['id,date,amount,cleared,import_id,payee_name,memo'] is a fraction of the full row. id is always included, and an unknown name is refused with the list of valid ones. Fields that are null or empty are omitted from each item. A missing category_id therefore means the transaction is uncategorized, and a missing subtransactions list means it is not a split.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | ||
| limit | No | ||
| month | Yes | ||
| fields | No | ||
| offset | No | ||
| cleared | No | ||
| plan_id | No | ||
| approved | No | ||
| min_amount | No | ||
| since_date | No | ||
| manual_only | No | ||
| last_knowledge_of_server | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=true, destructiveHint=false), and the description goes well beyond them: filters are applied before paging, limit defaults to 100 and is capped at 500, field projection behavior, id always injected, unknown field names rejected with the valid list, and null/empty values omitted so a missing category_id means uncategorized. That last point materially changes how results must be interpreted.
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?
It opens with the core purpose and is dense with useful detail rather than filler, though the aside about field projection being 'where the size of a long list actually goes' is slightly discursive. A long single paragraph rather than chunked sections costs a point on structure, not on substance.
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 pagination envelope need not be re-explained, yet the description usefully names items/count/has_more/next_offset and the offset default. Combined with the annotations and the filter semantics, the definition is nearly self-sufficient for correct invocation; the handful of undocumented parameters (plan_id, since_date, type, last_knowledge_of_server) keep it short of 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?
With 0% schema coverage the description carries the full burden and does cover month format, limit ceiling, cleared enum values, approved, manual_only (defined as no import_id), min_amount units, and fields projection syntax. However, type, plan_id, since_date, offset, and last_knowledge_of_server remain completely undocumented despite being real filters/sync controls.
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?
[READ] List transactions for a specific month' gives a precise verb, resource, and scoping key, and the month parameter format is spelled out with an example. The month-scoping immediately separates it from transactions_list, transactions_list_by_account, _by_category, and _by_payee.
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 filtered-list nature implies its use case (a month's transactions, optionally narrowed by cleared/approved/manual/min_amount), but there is no explicit when-to-use statement or pointer to an alternative such as transactions_list for non-month ranges. Routing is left entirely to inference from the name and filters.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
transactions_list_by_payeeTransactions — List by payeeARead-only
[READ] List transactions for a specific payee. Amounts in milliunits. Returns a paginated envelope with items, count, has_more, and next_offset. limit defaults to 100 and cannot exceed 500. Filters applied before paging: cleared ('cleared', 'uncleared', 'reconciled'), approved (true/false), manual_only=true for transactions with no import_id (entered by hand), min_amount to keep only transactions whose absolute amount is at least that many milliunits. fields: name the columns you need and each item is projected down to them, which is where the size of a long list actually goes — fields=['id,date,amount,cleared,import_id,payee_name,memo'] is a fraction of the full row. id is always included, and an unknown name is refused with the list of valid ones. Fields that are null or empty are omitted from each item. A missing category_id therefore means the transaction is uncategorized, and a missing subtransactions list means it is not a split.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | ||
| limit | No | ||
| fields | No | ||
| offset | No | ||
| cleared | No | ||
| plan_id | No | ||
| approved | No | ||
| payee_id | Yes | ||
| min_amount | No | ||
| since_date | No | ||
| manual_only | No | ||
| last_knowledge_of_server | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/openWorldHint/destructiveHint, so the safety profile is covered; the description goes well beyond that with pagination envelope shape, the limit default of 100 and hard cap of 500, the 'filters applied before paging' ordering rule, and the null/empty-field omission semantics. It even resolves what a missing category_id or subtransactions list means.
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?
Front-loaded with the purpose, then the return envelope, then defaults and filters, then the projection mechanism — a sensible order. It is long and a couple of clauses (the milliunits aside, the fields example) sprawl, but nearly every sentence carries operational content.
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 12-parameter, 0%-coverage schema this is close to sufficient, and it explains the return envelope even though an output schema exists. The residual gap is the handful of undocumented filter parameters (plan_id, since_date, type, last_knowledge_of_server) that an agent would have to guess at.
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?
With 0% schema coverage across 12 parameters, the description carries the burden and does meaningfully document limit, cleared (with its enum values), approved, manual_only, min_amount, and fields plus the id-always-included rule. It leaves type, plan_id, since_date, and last_knowledge_of_server unexplained, so a few parameters remain opaque.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with an explicit verb+resource+scope: '[READ] List transactions for a specific payee.' The payee scoping distinguishes it cleanly from the sibling list tools (transactions_list_by_account, transactions_list_by_category, transactions_list_by_month), so an agent can route without opening schemas.
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 tells you what the filters mean but never states when to reach for this tool versus transactions_list, transactions_list_by_account, or the triage_* tools. Usage is implied by the payee scoping rather than spelled out, and no exclusions or prerequisites are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
transactions_match_statementTransactions — Match statementARead-only
[READ] Pair the rows of a bank export with an account's register, and name what is left over on each side. rows: the statement lines, as objects with date (ISO), amount, and optionally description. amounts_in: 'milliunits' (default, 1000 = $1.00) or 'dollars' if you are passing the CSV's own figures. Either way the sign is YNAB's: negative for money out. An export that writes debits as positive numbers must be negated first, or every row comes back unmatched. date_tolerance_days: how far a posting date may sit from YNAB's date and still match (default 3, which covers a weekend). Matching is on exact amount, one-to-one, closest date first — nothing fuzzy, because a wrong match hides the transaction you were looking for. Returns matched pairs, unmatched_on_statement (the bank saw it and YNAB has no record), and unmatched_in_ynab (the reverse — where duplicates, never-posted card authorisations and bounced payments show up), each labelled with what it looks like. Costs two requests.
| Name | Required | Description | Default |
|---|---|---|---|
| rows | Yes | ||
| plan_id | No | ||
| account_id | Yes | ||
| amounts_in | No | milliunits | |
| since_date | No | ||
| date_tolerance_days | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/non-destructive, so the bar is lower, yet the description adds substantial operational context: exact-amount one-to-one matching, closest-date-first ordering, the reasoning against fuzzy matching, the sign-convention trap that silently produces all-unmatched results, and the cost of two requests. This is well beyond what the annotations convey.
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?
Front-loaded with the read marker and purpose, and nearly every sentence carries load (sign trap, tolerance rationale, match order, cost). It is dense and long, though, and a couple of clauses could be tightened without losing meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, yet the description still helpfully characterizes the three result groups, and it covers the matching semantics and pitfalls that matter for correct invocation. The remaining gap is the undocumented account_id, plan_id, and since_date parameters, which an agent must infer from titles alone.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must carry the load. It explains rows (date ISO, amount, optional description), both amounts_in modes with the sign convention, and date_tolerance_days including the 'covers a weekend' rationale. account_id, plan_id, and since_date remain undocumented, so it does not fully compensate.
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+resource: pair bank statement rows against an account's register and label leftovers on each side. The unmatched_on_statement / unmatched_in_ynab framing plus the '[READ]' marker distinguishes it from siblings like transactions_list, reconcile_preview, and triage_unmatched_manual.
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?
Clearly frames the scenario (a bank export that needs pairing with YNAB's register) and gives conditions for its tricky options, e.g. when to use amounts_in='dollars' vs 'milliunits'. It does not explicitly name a sibling alternative or say when not to use this instead of reconcile_preview or triage_unmatched_manual, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
triage_pending_importsTriage — Pending importsARead-only
[READ] Card authorisations YNAB imported that never became real charges. A merchant's hold — a fuel pump, a hotel, a rideshare — arrives through direct import as a transaction with an import_id starting 'YNAB:P:'. When the real charge posts, usually at a different amount, it comes in as its own transaction and the hold is left behind: uncleared, permanent, and counted in the card's balance. Four of them were inflating one card by about $79 on the plan this was written for. triage_unmatched_manual cannot find these — it looks for entries with no import_id, and these have one. account_id narrows it to one account. older_than_days is how long a hold must have sat (default 7). since_date bounds how far back to read (default 6 months). Check each against the statement before deleting: a hold whose charge did post appears twice, and only the hold should go. Costs two requests.
| Name | Required | Description | Default |
|---|---|---|---|
| plan_id | No | ||
| account_id | No | ||
| since_date | No | ||
| older_than_days | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnlyHint/destructiveHint annotations by explaining the lifecycle that produces these leftovers (uncleared, permanent, counted in the card's balance), the identifiable marker prefix, a real-world impact example, and the cost profile ('Costs two requests').
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?
Front-loaded with the essential identifier and definition, then parameters, then the caveat — a sound order. The anecdotal detail about $79 across four holds is illustrative but the longest non-essential sentence.
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, return values need no explanation, and the description covers definition, distinguishing marker, sibling exclusion, parameter meanings, defaults, prerequisite verification, and request cost. Nothing an agent needs to call it correctly 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 0%, so the description carries the burden and it largely does: account_id scopes to one account, older_than_days is the hold-age threshold (default 7), since_date bounds the read window (default 6 months). plan_id is left unexplained, which is the only gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: card authorisations imported by YNAB that never became real charges, marked [READ] and identified by the 'YNAB:P:' import_id prefix. It explicitly distinguishes itself from the sibling triage_unmatched_manual and explains why that tool cannot find these entries.
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?
Names the alternative (triage_unmatched_manual) with the exact reason it fails here, and gives operational guidance: check each hold against the statement before deleting, since a posted charge appears twice and only the hold should be removed. Defaults for older_than_days and since_date are also given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
triage_reconciliationTriage — ReconciliationARead-only
[READ] Accounts ordered least-trustworthy first: never reconciled, then longest since. Each row carries cleared and uncleared balances, the bank-link state, and warnings — including a cash account whose cleared balance is negative, which means the bank shows an overdraft or the account holds transactions it should not. Reconciliation staleness is what decides whether the rest of a plan's numbers can be trusted, and no other tool reports it. stale_after_days: how long counts as stale (default 45). Costs one request.
| Name | Required | Description | Default |
|---|---|---|---|
| plan_id | No | ||
| stale_after_days | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=true, destructiveHint=false), so the bar is lower, yet the description adds real behavioral value: the sort order semantics, the shape of each row, the meaning of a negative cleared balance, and the cost ('costs one request') for budget-aware planning. It does not describe pagination or limits.
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?
Front-loaded with the read marker and the ordering rule, then payload details, then the rationale for staleness, then the parameter and cost note. Every sentence carries information an agent would otherwise have to guess; nothing is redundant.
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 needn't document return fields, and its coverage of row content, ordering, warnings, and cost is sufficient for correct invocation. The only real gap is the unexplained plan_id parameter, which matters for a tool whose output the agent must scope.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it only partially does: stale_after_days is explained (default 45, what 'stale' means), but plan_id is left entirely unexplained despite being nullable and likely controlling scope. One of two parameters remains opaque in both schema and description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Starts with an explicit [READ] marker and a precise verb+resource statement: accounts ordered least-trustworthy-first by reconciliation staleness. It also enumerates the row payload (cleared/uncleared balances, bank-link state, warnings), so an agent can distinguish it from the other triage_* and reconcile_* siblings without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear context for use ('reconciliation staleness is what decides whether the rest of a plan's numbers can be trusted') and asserts exclusive coverage ('no other tool reports it'), which implicitly steers the agent here over reconcile_preview or triage_summary. It stops short of stating explicit exclusions or naming the sibling to use for the adjacent questions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
triage_summaryTriage — SummaryARead-only
[READ] Combined triage summary: count of uncategorized and unapproved transactions. Use this to quickly assess whether the budget needs attention before diving deeper. uncategorized_count excludes what can never take a category — transactions on off-budget tracking accounts, and transfers between two on-budget accounts — so it is work, not noise. uncategorized_raw_count is what YNAB's own filter would have said.
| Name | Required | Description | Default |
|---|---|---|---|
| plan_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and non-destructive, so the safety profile is covered. The description goes beyond them by explaining the semantic distinction between uncategorized_count (excludes off-budget tracking accounts and on-budget transfers) and uncategorized_raw_count, which is genuinely useful behavioral context.
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?
Front-loaded with a [READ] tag and the core summary, followed by purpose and the count-definition nuance. Four sentences, none wasteful; the exclusion explanation is dense but 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 structure need not be described. For a read-only summary tool, the description supplies the key field semantics and usage context, leaving only the undocumented plan_id as a minor 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 0% and the description never mentions the sole plan_id parameter. It is a single, optional, self-evidently named plan identifier with a null default, so the omission is low-impact, but the description does not compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: a combined triage summary counting uncategorized and unapproved transactions. It implicitly distinguishes itself from siblings triage_uncategorized and triage_unapproved by framing itself as the combined roll-up, though it never names those siblings directly.
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?
"Use this to quickly assess whether the budget needs attention before diving deeper" gives clear context for when to reach for this tool over the detailed triage siblings. It implies the detail tools as alternatives but does not name them or state explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
triage_unapprovedTriage — UnapprovedARead-only
[READ] List all unapproved transactions, most-recent first. Imported transactions from bank connections typically start as unapproved. limit and offset page the result; count always describes the whole queue.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| offset | No | ||
| plan_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=false, and destructiveHint=false, so the safety profile is covered. The description adds genuinely new behavioral detail beyond that: the default ordering and the notable rule that 'count always describes the whole queue' rather than the current page.
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?
Three short sentences with no waste, front-loaded with the read tag, the resource, and the ordering before moving to pagination semantics. Every sentence carries 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 not be explained; the description appropriately covers ordering and pagination/count semantics instead. The only real gap is the unexplained plan_id parameter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the burden. It does explain that limit and offset paginate the result, which is helpful, but it never mentions plan_id, leaving one of three parameters entirely undocumented in both the schema and the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List all unapproved transactions') plus the default ordering ('most-recent first'), which is more than the title provides. It is distinguishable from the other triage_* siblings by its resource scope, though it does not explicitly name a contrasting 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?
The sentence about imported bank transactions typically starting as unapproved gives useful implied context for when this queue matters, but there is no explicit when-to-use vs alternative guidance and no mention of the sibling tools (triage_pending_imports, triage_uncategorized, etc.) that an agent must choose between.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
triage_uncategorizedTriage — UncategorizedARead-only
[READ] Transactions that genuinely need a category, most-recent first. Each entry includes payee, amount, account, and memo. Two kinds of transaction are excluded by default because they can never take a category: anything on an off-budget tracking account, and transfers between two on-budget accounts. On a real plan that turned a queue of 533 into the 14 that were actually work. count is the number needing attention; raw_count is what YNAB's filter returned before filtering, and excluded says what went. Set include_tracking_accounts or include_transfers to true to see them anyway. limit and offset page the result; count and raw_count always describe the whole queue.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| offset | No | ||
| plan_id | No | ||
| include_transfers | No | ||
| include_tracking_accounts | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, non-destructive), and the description adds substantial behavioral detail beyond them: the two automatic exclusion classes and why, the meaning of count vs raw_count vs excluded, and the fact that count/raw_count describe the whole queue regardless of paging. That is exactly the extra context annotations cannot carry.
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?
Front-loads the purpose and exclusion rules before the flag and paging details, so the critical routing information comes first. The '533 into 14' anecdote is illustrative of filtering impact but is the one sentence closest to 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?
An output schema exists, so return structure needn't be spelled out, and the description still explains the key derived fields (count, raw_count, excluded) that an agent needs to interpret results. For a 5-param, zero-required read tool this is 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 0%, so the description must compensate, and it explains four of five parameters: limit/offset paging semantics (with the non-obvious note that counts ignore paging), and include_transfers/include_tracking_accounts. Only plan_id is left undocumented, which is a minor gap given its obvious meaning.
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 ('Transactions that genuinely need a category') and immediately qualifies the scope with the two exclusion rules, which is exactly what separates it from sibling triage tools like triage_unapproved or triage_pending_imports. An agent can tell what queue this returns without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for when to reach for it (finding categorizable work) and explicitly describes the default exclusions plus the flags (include_tracking_accounts, include_transfers) that reverse them. It does not name alternative siblings such as bookkeeping_categorization_suggestions, so routing among triage/bookkeeping tools is left partly to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
triage_unmatched_manualTriage — Unmatched manualARead-only
[READ] Hand-entered transactions on bank-linked accounts that never cleared. On an account YNAB imports from, a manual entry is a promise that a real transaction is coming. One still uncleared weeks later means the bank never matched it: a duplicate of something already imported, a payment that did not go through, or a typo. Their net amount is how far YNAB stands from the bank for these entries alone — on the plan this was written for, ten of them on one checking account summed to $9,469. account_id narrows it to one account. older_than_days is how long an entry must have sat (default 30). since_date bounds how far back to read (default 18 months).
| Name | Required | Description | Default |
|---|---|---|---|
| plan_id | No | ||
| account_id | No | ||
| since_date | No | ||
| older_than_days | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=false, and destructiveHint=false, so the safety profile is covered. The description adds real behavioral context beyond that: the domain meaning of the entries, that the net amount represents the account's drift from the bank for these entries alone, and the default windows (30 days, 18 months). It does not discuss output shape, but an output schema exists.
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?
Front-loaded with a [READ] marker and opening statement of what it returns. The prose is dense but every sentence earns its place by explaining domain semantics; the illustrative '$9,469' example is the only slightly expendable detail.
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 read-only triage tool with an output schema, the description supplies enough: what it finds, why such entries exist, what the aggregate means, and the filtering semantics of three parameters. The only missing piece an agent would want is the plan_id parameter's meaning.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the burden, and it does for three of four parameters: account_id narrows to one account, older_than_days is the minimum age (default 30), and since_date bounds the read window (default 18 months). plan_id is never explained, leaving one gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource: identifying hand-entered (manual) transactions on bank-linked accounts that never cleared. It defines the scope precisely ('On an account YNAB imports from...') and the concept that distinguishes it from the other triage_* siblings, which examine pending imports, uncategorized, unapproved, and reconciliation issues.
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?
It implies usage by explaining what an unmatched manual entry means (duplicate, failed payment, or typo) and why the aggregate net amount matters, but it never explicitly says when to prefer this over triage_pending_imports, triage_reconciliation, or transactions_get, nor does it state any exclusion conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
user_getUser — GetARead-only
[READ] Get the authenticated YNAB user. Returns the user ID.
| 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?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is fully covered by structured data. The '[READ]' tag and 'Returns the user ID' line add minor reinforcement but little new behavioral context beyond what annotations and the presence of an output schema provide.
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 read-only marker leads, followed by the resource and the return payload.
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 zero-param, read-only tool with full annotation coverage and an output schema, the description supplies everything an agent needs to select and call it. Nothing material 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 zero parameters, so the baseline of 4 applies; there is no parameter semantics for the description to clarify or omit.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Get') and resource ('the authenticated YNAB user') and scopes it to the authenticated principal, which is the key disambiguation. It is the only user-scoped tool among the siblings, so no further differentiation is needed.
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 or when-not-to-use statement, but for a zero-parameter singleton tool the usage context is self-evident from the description. Guidance is implied rather than stated, which fits a 3.
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.
62 tool updates
v0.4.0- First observed
accounts_get - First observed
accounts_list - First observed
analysis_assignment_patterns - First observed
analysis_copied_forward_months - First observed
analysis_credit_funding - First observed
analysis_flow_trace - First observed
analysis_group_parity - First observed
analysis_overspent_categories - First observed
analysis_overspent_history - First observed
analysis_recurring_charges - First observed
analysis_target_funding_gaps - First observed
analysis_unassigned_transfers - First observed
analysis_upcoming_scheduled_risks - First observed
bookkeeping_categorization_suggestions - First observed
bookkeeping_memo_annotation_suggestions - First observed
bookkeeping_transaction_history - First observed
categories_get - First observed
categories_get_for_month - First observed
categories_list - First observed
category_groups_summary_by_month - First observed
changes_since - First observed
history_list - First observed
history_show - First observed
money_movement_groups_list - First observed
money_movement_groups_list_by_month - First observed
money_movements_list - First observed
money_movements_list_by_month - First observed
months_get - First observed
months_list - First observed
months_range - First observed
overview_available_tools - First observed
overview_balance_identity - First observed
overview_budget_snapshot - First observed
overview_cash_position - First observed
overview_month_health - First observed
overview_request_budget - First observed
payee_locations_get - First observed
payee_locations_list - First observed
payee_locations_list_for_payee - First observed
payees_get - First observed
payees_list - First observed
ping - First observed
plans_get - First observed
plans_get_settings - First observed
plans_list - First observed
reconcile_preview - First observed
scheduled_transactions_get - First observed
scheduled_transactions_list - First observed
transactions_get - First observed
transactions_list - First observed
transactions_list_by_account - First observed
transactions_list_by_category - First observed
transactions_list_by_month - First observed
transactions_list_by_payee - First observed
transactions_match_statement - First observed
triage_pending_imports - First observed
triage_reconciliation - First observed
triage_summary - First observed
triage_unapproved - First observed
triage_uncategorized - First observed
triage_unmatched_manual - First observed
user_get
TDQS
Scored across 62 tools
Several tools have overlapping purposes, such as overview_budget_snapshot vs overview_month_health for month summaries and analysis_overspent_history vs analysis_overspent_categories for overspending. The extensive descriptions and cross-references help, but an agent still faces many similar analytical tools that could cause misselection.
Tool names use consistent snake_case with family prefixes (analysis_, overview_, triage_, bookkeeping_) and resource_list/get patterns. Minor outliers like ping and changes_since are negligible, making the naming mostly predictable across the set.
With 62 tools, the server is far above the typical 3–15 range and exceeds the 25+ threshold that signals too many. While many tools serve distinct niche analyses, the sheer volume increases selection complexity and cognitive load for an agent.
The surface is entirely read-only; there are no create, update, or delete tools, yet descriptions reference write tools like transactions_update and reconcile_apply that are absent. This leaves core budget management workflows incomplete and creates dead ends for an agent.
Maintenance
Related MCP Connectors
- ManiloOAuthapp.manilo
Log, query, and edit expenses, budgets, and accounts in Manilo from any MCP-compatible AI assistant.
- Era ContextOAuthapp.era
Personal finance, bank account, and shared memory connector for Claude, ChatGPT, Gemini Spark & more
Personal finance for AI agents — onboard, import statements, categorize & budget over MCP.
Log, query, and edit expenses, budgets, and accounts in Ledgy from any MCP-compatible AI assistant.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceA Model Context Protocol (MCP) server for interacting with YNAB (You Need A Budget). Provides tools for accessing budget data through MCP-enabled clients like Claude Desktop.4MIT
- AlicenseAqualityBmaintenanceEnables AI assistants to interact with YNAB budgets, performing read-only queries by default and optional write operations like creating transactions and managing categories through natural language.39223 npm33MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to connect to your YNAB account and read budget data, including accounts, categories, payees, and transactions, through a hosted MCP server.7 npm2MIT
- AlicenseAqualityBmaintenanceProvides a read-only interface to YNAB budget data, allowing AI assistants to inspect budgets, accounts, categories, transactions, and more. Includes an experimental guarded write workflow for category assignments.106 npmMIT