Skip to main content
Glama

ynab_compare_transactions

Read-onlyIdempotent

Compare bank CSV transactions against YNAB entries to find missing or mismatched transactions. Use the report to reconcile accounts and resolve discrepancies.

Instructions

Compare bank CSV transactions with YNAB transactions to find missing or mismatched entries.

Args:

  • budget_id (string, optional): Budget UUID. Omit to use the default budget.

  • account_id (string, required): Account UUID to compare against.

  • csv_file_path or csv_data (string, required): Bank export file path or inline CSV text.

  • statement_start_date (string, optional): Filter comparison window start date (YYYY-MM-DD).

  • statement_date (string, optional): Filter comparison window end date (YYYY-MM-DD).

Returns: comparison report with matched, unmatched_bank, unmatched_ynab transactions.

Input Schema

NameRequiredDescriptionDefault
debugNo
csv_dataNo
budget_idNo
account_idYes
csv_formatNo
csv_file_pathNo
statement_dateNo
amount_toleranceNo
auto_detect_formatNo
date_tolerance_daysNo
statement_start_dateNo
enable_chronology_bonusNo

Output Schema

NameRequiredDescriptionDefault
matchesYes
summaryYes
missing_in_bankYes
missing_in_ynabYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed6 schema fields changedv0.32.0
    • removedInput schema / properties / statement_date / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "const": "",
      -    "type": "string"
      -  }
      -]
    • addedInput schema / properties / statement_date / format
      Added value: +"date"
    • addedInput schema / properties / statement_date / type
      Added value: +"string"
    • removedInput schema / properties / statement_start_date / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "const": "",
      -    "type": "string"
      -  }
      -]
    • addedInput schema / properties / statement_start_date / format
      Added value: +"date"
    • addedInput schema / properties / statement_start_date / type
      Added value: +"string"
  2. Changed4 schema fields changedv0.31.0
    • addedInput schema / properties / statement_date / anyOf
      Added value: +[
      +  {
      +    "type": "string"
      +  },
      +  {
      +    "const": "",
      +    "type": "string"
      +  }
      +]
    • removedInput schema / properties / statement_date / type
      Removed value: -"string"
    • addedInput schema / properties / statement_start_date / anyOf
      Added value: +[
      +  {
      +    "type": "string"
      +  },
      +  {
      +    "const": "",
      +    "type": "string"
      +  }
      +]
    • removedInput schema / properties / statement_start_date / type
      Removed value: -"string"
  3. Changed16 schema fields changedv0.29.1
    • removedInput schema / properties / csv_format / properties / amount_column / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "number"
      -  }
      -]
    • addedInput schema / properties / csv_format / properties / amount_column / type
      Added value: +[
      +  "string",
      +  "number"
      +]
    • removedInput schema / properties / csv_format / properties / credit_column / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "number"
      -  }
      -]
    • addedInput schema / properties / csv_format / properties / credit_column / type
      Added value: +[
      +  "string",
      +  "number"
      +]
    • removedInput schema / properties / csv_format / properties / date_column / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "number"
      -  }
      -]
    • addedInput schema / properties / csv_format / properties / date_column / type
      Added value: +[
      +  "string",
      +  "number"
      +]
    • removedInput schema / properties / csv_format / properties / debit_column / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "number"
      -  }
      -]
    • addedInput schema / properties / csv_format / properties / debit_column / type
      Added value: +[
      +  "string",
      +  "number"
      +]
    • removedInput schema / properties / csv_format / properties / description_column / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "number"
      -  }
      -]
    • addedInput schema / properties / csv_format / properties / description_column / type
      Added value: +[
      +  "string",
      +  "number"
      +]
    • removedOutput schema / properties / matches / items / properties / ynab_payee / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / matches / items / properties / ynab_payee / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / missing_in_bank / items / properties / memo / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / missing_in_bank / items / properties / memo / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / missing_in_bank / items / properties / payee_name / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / missing_in_bank / items / properties / payee_name / type
      Added value: +[
      +  "string",
      +  "null"
      +]
  4. Addedv0.26.9

TDQS

C2.9/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is covered and the description only needs to add context. It adds a summary of the return report (matched, unmatched_bank, unmatched_ynab) but says nothing about the matching algorithm, how tolerances affect results, or what happens on CSV parse failure — and the return summary is partly redundant with the existing 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.

Conciseness4/5

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

The description is front-loaded with a single purpose sentence followed by a clean Args/Returns structure, so the important information is first. It is appropriately short for its content, though the Args block is a partial restatement of the schema rather than a replacement for it.

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

Completeness2/5

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

This is a relatively complex tool (12 parameters, a nested csv_format object, tolerance and date-window controls) and the description covers only the surface. An output schema exists so return values need no explanation, but the omission of tolerance/detection parameters leaves an agent unable to invoke it correctly for anything but the default path.

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

Parameters2/5

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 the Args block documents only 6 of 12 parameters. The behaviorally important knobs — amount_tolerance, date_tolerance_days, enable_chronology_bonus, auto_detect_format, the nested csv_format object, and debug — are unexplained, and a user would not know that tolerances change what counts as a 'match'. It also labels 'csv_file_path or csv_data' as required while the schema requires only account_id, which misstates the contract.

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

Purpose4/5

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

The first sentence names a specific verb and two resources ('Compare bank CSV transactions with YNAB transactions') plus the outcome ('find missing or mismatched entries'), which is far more informative than a restated title. It does not, however, distinguish itself from the closest sibling, ynab_reconcile_account, which an agent could plausibly pick instead.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

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

There is no explicit when-to-use or when-not-to-use guidance and no named alternative. Given that ynab_reconcile_account and ynab_list_transactions sit in the same sibling set, the agent is left to infer the routing decision entirely from the one-line purpose statement.

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