Skip to main content
Glama
LandonSchropp

ynab-mcp-server

Detect Recurring

ynab_detect_recurring
Read-only

Detect recurring subscriptions, bills, and memberships in YNAB transaction history by payee, amount, and interval, then report cadence, yearly cost, next expected date, and whether charges stopped.

Instructions

Finds recurring outflows (subscriptions, bills, memberships) in transaction history by payee, similar amount and regular spacing, whether or not they are scheduled in YNAB. For the scheduled transactions set up in YNAB, use ynab_list_scheduled_transactions. Gives each one's cadence, typical amount, yearly cost at the latest amount, next expected date, whether it seems to have stopped, and already_scheduled (a scheduled transaction has the same payee name; amounts are not compared). This is a heuristic: check the results before acting on them. Splits are counted through their subtransactions. Transfers are excluded, so loan and mortgage payments (transfers to a loan account) and credit card payments are not reported. Inflows are excluded too, and refunds are not netted against charges. Reads the whole window from YNAB in one request, which is slow for a long sinceDate on a busy plan. Yearly charges need a sinceDate far enough back to show minOccurrences of them.

Input Schema

NameRequiredDescriptionDefault
planIdNoThe plan ID (optional, defaults to YNAB_PLAN_ID; budgetId is a deprecated alias)
budgetIdNoDeprecated alias of planId (still accepted)
sinceDateNoStart of the history to scan, inclusive (ISO format: 2025-01-01). Defaults to 365 days ago.
minOccurrencesNoOn how many different dates one payee must charge a similar amount to make a pattern (default: 3)
amountTolerancePctNoHow far above the smallest charge in a group another charge may be and still count, in percent with up to 3 decimal places (default: 10)

Schema Changelog

Changes observed during successful MCP inspections.

  1. First observedv0.7.1

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare readOnly/destructive, but the description adds substantial context beyond them: the result is heuristic, splits are counted through subtransactions, transfers and inflows are excluded, refunds are not netted, and already_scheduled only matches on payee name without comparing amounts. It also discloses a real performance trait ('reads the whole window from YNAB in one request, which is slow for a long sinceDate on a busy plan'), which an agent needs to pick sane arguments.

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

Conciseness4/5

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

Purpose and the sibling alternative are front-loaded, then return fields, then caveats and performance. Nearly every sentence carries actionable information, though the exclusion/refund/netting sentences could be tightened into one clause without losing content.

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

Completeness5/5

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

There is no output schema, and the description fully enumerates the return fields (cadence, typical amount, yearly cost at latest amount, next expected date, stopped flag, already_scheduled). Combined with the heuristic warning, exclusion rules, and cost-of-call note, an agent has everything needed to call and interpret it.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds genuine meaning by tying sinceDate to minOccurrences ('Yearly charges need a sinceDate far enough back to show minOccurrences of them') and explaining the exclusion filter that determines what the scan sees. It does not, however, add anything about amountTolerancePct's grouping semantics beyond the schema.

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

Purpose5/5

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

States a specific verb and resource ('Finds recurring outflows ... in transaction history') plus the matching criteria (payee, similar amount, regular spacing) and scope (whether or not they are scheduled in YNAB). It explicitly distinguishes itself from the nearest sibling, ynab_list_scheduled_transactions, so an agent can choose 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.

Usage Guidelines5/5

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

Names the alternative and the condition that selects it ('For the scheduled transactions set up in YNAB, use ynab_list_scheduled_transactions'), and adds a when-not caveat ('This is a heuristic: check the results before acting on them'). It also gives a concrete usage precondition: a sinceDate far enough back for yearly charges to reach minOccurrences.

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