Skip to main content
Glama
switchwize

SwitchWize MCP

Official

Bank Savings Gap

get_bank_gap
Read-onlyIdempotent

Estimate annual savings interest forgone for a supplied balance and optional bank, comparing its APY with tracked savings rates and returning the annual gap.

Instructions

Estimate annual savings interest forgone for a supplied balance and optional bank name. comparisonApy is the average of the top three tracked savings rates, not an average across all banks; bankCount is the size of the tracked set. baselineApy is the named bank's APY, or the national savings benchmark when no bank is supplied. Return annualGap, APYs, observation date, freshness and methodology. This is a hypothetical estimate, not guaranteed savings or an account recommendation; verify eligibility, fees and current provider terms.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
bankNoOptional bank name for user-facing context.
balanceNo

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
asOfNoISO timestamp of the underlying data this response reflects.
bankNo
toolYes
errorNo
balanceNo
bankApyNo
annualGapNo
bankCountNoNumber of tracked banks in the comparison set, not the number averaged into comparisonApy.
attributionNo
baselineApyNoNamed bank APY, or national savings benchmark when no bank is supplied. Percentage units.
generatedAtYesISO timestamp this response was computed at.
verified_atNo
comparisonApyNoAverage of the top three tracked savings rates (or all available rates if fewer than three). Not an average across bankCount banks. Percentage units.
schemaVersionYes
methodologyUrlNo
freshnessStatusNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changedv0.3.0
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "additionalProperties": true,
      +  "properties": {
      +    "annualGap": {
      +      "type": "number"
      +    },
      +    "asOf": {
      +      "description": "ISO timestamp of the underlying data this response reflects.",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "attribution": {
      +      "additionalProperties": true,
      +      "type": "object"
      +    },
      +    "balance": {
      +      "type": "number"
      +    },
      +    "bank": {
      +      "type": [
      +        "object",
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "bankApy": {
      +      "type": [
      +        "number",
      +        "null"
      +      ]
      +    },
      +    "bankCount": {
      +      "description": "Number of tracked banks in the comparison set, not the number averaged into comparisonApy.",
      +      "type": "number"
      +    },
      +    "baselineApy": {
      +      "description": "Named bank APY, or national savings benchmark when no bank is supplied. Percentage units.",
      +      "type": "number"
      +    },
      +    "comparisonApy": {
      +      "description": "Average of the top three tracked savings rates (or all available rates if fewer than three). Not an average across bankCount banks. Percentage units.",
      +      "type": "number"
      +    },
      +    "error": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "code": {
      +          "type": "string"
      +        },
      +        "message": {
      +          "type": "string"
      +        },
      +        "retryable": {
      +          "type": "boolean"
      +        },
      +        "suggestions": {
      +          "items": {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "additionalProperties": true,
      +                "type": "object"
      +              }
      +            ]
      +          },
      +          "type": "array"
      +        }
      +      },
      +      "required": [
      +        "code",
      +        "message"
      +      ],
      +      "type": "object"
      +    },
      +    "freshnessStatus": {
      +      "enum": [
      +        "fresh",
      +        "aging",
      +        "stale",
      +        "unavailable"
      +      ],
      +      "type": "string"
      +    },
      +    "generatedAt": {
      +      "description": "ISO timestamp this response was computed at.",
      +      "type": "string"
      +    },
      +    "methodologyUrl": {
      +      "type": "string"
      +    },
      +    "schemaVersion": {
      +      "type": "string"
      +    },
      +    "tool": {
      +      "type": "string"
      +    },
      +    "verified_at": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    }
      +  },
      +  "required": [
      +    "schemaVersion",
      +    "tool",
      +    "generatedAt"
      +  ],
      +  "type": "object"
      +}
  2. First observedv0.1.0

TDQS

A3.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered. The description adds genuinely non-structured context: comparisonApy is the average of the top three tracked rates rather than a market-wide average, bankCount bounds that set, and the result is explicitly a hypothetical estimate requiring the user to verify eligibility, fees and provider terms. That methodology disclosure is exactly the kind of value 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.

Conciseness4/5

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

The purpose is front-loaded in the first clause, followed by methodology and then caveats — a sensible ordering. Four sentences is defensible, but the enumeration of return fields ('annualGap, APYs, observation date, freshness and methodology') duplicates the output schema and is the one sentence that does not earn its place.

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

Completeness4/5

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

With an output schema present, describing return values was optional, and the annotations already carry the safety profile, so the description's remaining job is purpose, metric semantics and caveats — all present. The one real hole is routing: an agent cannot tell from this text when to prefer it over get_bank_gap_index or compare_switch_savings.

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 description coverage is only 50% — the bank parameter is documented, balance is not. The description compensates by clarifying that bank is optional and, more importantly, that omitting it swaps baselineApy from the named bank's APY to the national savings benchmark, which is real semantic meaning the schema does not convey. It still says nothing about balance units, though the number type plus the 10,000,000 maximum makes dollars the obvious reading.

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

Purpose4/5

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

States a specific verb and resource: 'Estimate annual savings interest forgone for a supplied balance and optional bank name,' which tells the agent exactly what question the tool answers. It defines the headline metric (annual savings interest forgone) concretely enough to separate it from rate-listing siblings like get_top_hysa_rates. It does not, however, address the closely named sibling get_bank_gap_index, so full 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.

Usage Guidelines2/5

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

The description never says when to reach for this tool rather than get_bank_gap_index, compare_switch_savings, or get_top_rates; only a caveat ('hypothetical estimate, not an account recommendation') is given. The 'optional bank name' phrasing implies a no-bank vs named-bank use case, but that is inference rather than stated guidance. No exclusions, prerequisites, or alternatives are named.

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