SwitchWize MCP
Server Details
Sixteen read-only US rate, savings-gap, Fed, card and CD tools with sources and freshness.
- Status
- Healthy
- Uptime
- 99.7% over 49 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- switchwize/switchwize-mcp
- GitHub Stars
- 1
- Server Listing
- SwitchWize MCP
TDQS
Scored across 16 tools
Most tools have distinct purposes, but there is real overlap: get_top_hysa_rates largely restates the savings slice of get_top_rates, and get_bank_gap_index vs get_index_dataset both surface index summaries. best_move_this_week aggregates functionality already exposed by get_card_offers, get_transfer_bonuses and rate tools, which can make selection non-obvious.
Nearly all tools follow a clean get_<noun> pattern (get_card_offers, get_top_rates, get_reality_score), which is highly predictable. Only best_move_this_week and compare_switch_savings deviate with leading verbs, a minor inconsistency rather than a systemic problem.
16 tools is a slightly heavy but sensible surface for a multi-domain financial-intelligence server spanning cards, savings, CDs, indexes and bonuses. Each tool maps to a plausible query type, though the near-duplicate rate/index tools suggest a small amount of bloat.
Coverage is strong across the inferred domain: card offers, downgrades, changes, reward valuations, transfer bonuses, savings/CD rates, gap analysis, rollover rules and freshness are all present. Gaps are minor (e.g. no personalized alert/watch tool or bank-account comparison beyond APY), but core lifecycle workflows are addressable.
Available Tools
16 toolsbest_move_this_weekBest Move This WeekARead-onlyIdempotentInspect
Given the credit cards a user holds, rank this week's dollar-valued actions: which held card to use per spend category, welcome offers at a 12-month high on cards not held, active transfer bonuses, and (optionally) the savings-rate move beside the card move.
| Name | Required | Description | Default |
|---|---|---|---|
| wallet | Yes | Card ids the user holds, in the form issuer:slug, e.g. ["chase:sapphire-preferred", "amex:gold-card"]. | |
| categories | No | Optional spend categories to rank held cards for; defaults to all nine. | |
| usedBenefits | No | Optional log of period credits already used this month; excluded from picks and counted toward renewal value. Omit to treat every credit as unused. | |
| savingsBalance | No | Optional cash balance, to include the savings-rate move beside the card moves. | |
| currentSavingsApy | No | Optional current savings APY, used with savingsBalance. |
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | No | ISO timestamp of the underlying data this response reflects. |
| tool | Yes | |
| error | No | |
| cardMoves | No | |
| attribution | No | |
| generatedAt | Yes | ISO timestamp this response was computed at. |
| savingsMove | No | |
| verified_at | No | |
| unheldOffers | No | |
| schemaVersion | Yes | |
| methodologyUrl | No | |
| freshnessStatus | No | |
| transferBonuses | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a safe, idempotent, open-world read, so the bar is lower. The description still adds real behavioral substance: the 12-month-high threshold for welcome offers, the restriction to cards not held, and that the savings move is contingent/optional. It does not disclose cost, latency, or freshness of 'this week's' data, which is the remaining gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence that front-loads the input premise and then lists the ranked outputs in priority order. Nothing is wasted; the parenthetical for the optional savings move keeps the conditional out of the main clause.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Because an output schema exists, return values needn't be explained, and the description covers the input premise and the dimensions being ranked. It is slightly thin on how 'this week' is bounded and on what happens when wallet cards have no offers, but nothing critical for invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents wallet format, category defaults, usedBenefits semantics, and savings fields, making 3 the baseline. The description adds only light framing — 'per spend category' for categories and '(optionally)... beside the card move' for the savings pair — which is marginal beyond the schema text.
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 verb ('rank'), a specific resource ('this week's dollar-valued actions'), and enumerates the four action classes it produces (held-card category picks, 12-month-high welcome offers on unheld cards, transfer bonuses, optional savings move). No sibling tool does this synthesis, so an agent can separate it from get_card_offers or get_transfer_bonuses without opening 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?
Usage context is clear: it operates 'Given the credit cards a user holds,' which frames the required wallet input and implies a personalized, portfolio-wide aggregation rather than a single-dataset lookup. It stops short of explicit exclusions or naming alternatives (e.g. 'use get_card_offers if you only want offers'), so it is clear context without routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compare_switch_savingsCompare Savings RatesBRead-onlyIdempotentInspect
Compare a user's current APY with SwitchWize's current top savings APY for a balance.
| Name | Required | Description | Default |
|---|---|---|---|
| balance | No | ||
| currentApy | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | No | ISO timestamp of the underlying data this response reflects. |
| tool | Yes | |
| error | No | |
| balance | No | |
| annualGap | No | |
| currentApy | No | |
| attribution | No | |
| generatedAt | Yes | ISO timestamp this response was computed at. |
| verified_at | No | |
| comparisonApy | No | |
| schemaVersion | Yes | |
| methodologyUrl | No | |
| currentInterest | No | |
| freshnessStatus | No | |
| breakEvenFraming | No | |
| comparisonInterest | No | |
| recommendationStatus | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is covered. The description adds that the comparison is against a live 'current' top APY for a given balance, but says nothing about rate freshness, data source, or response shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence with the comparison target and scoping input front-loaded. No waste, though it is perhaps over-compressed for a tool with two non-obvious parameters.
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 read-only annotations cover safety. Still missing is any note on which rate source backs the 'top APY' and whether the optional balance changes the result, which the agent needs to invoke confidently in this sibling-heavy cluster.
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: it names both parameters implicitly ('current APY', 'balance') and gives each meaning. However, it adds no units or format detail (e.g. APY as a percent number vs decimal, balance currency), which matters given the schema's max of 25 on currentApy.
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 both resources (the user's current APY vs SwitchWize's top savings APY) scoped by balance. An agent can tell what it does, though it does not explicitly distinguish itself from rate-list siblings like get_top_hysa_rates or get_bank_gap.
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, no prerequisites, and no mention of alternatives in a crowded sibling set (get_top_hysa_rates, get_bank_gap, best_move_this_week). Usage must be inferred entirely from the single purpose sentence.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_bank_gapBank Savings GapARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| bank | No | Optional bank name for user-facing context. | |
| balance | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | No | ISO timestamp of the underlying data this response reflects. |
| bank | No | |
| tool | Yes | |
| error | No | |
| balance | No | |
| bankApy | No | |
| annualGap | No | |
| bankCount | No | Number of tracked banks in the comparison set, not the number averaged into comparisonApy. |
| attribution | No | |
| baselineApy | No | Named bank APY, or national savings benchmark when no bank is supplied. Percentage units. |
| generatedAt | Yes | ISO timestamp this response was computed at. |
| verified_at | No | |
| comparisonApy | No | Average of the top three tracked savings rates (or all available rates if fewer than three). Not an average across bankCount banks. Percentage units. |
| schemaVersion | Yes | |
| methodologyUrl | No | |
| freshnessStatus | No |
TDQS
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.
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.
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.
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.
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.
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.
get_bank_gap_indexBank Gap IndexARead-onlyIdempotentInspect
Return the current SwitchWize Bank Gap Index headline value, latest release, and methodology URL.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | No | ISO timestamp of the underlying data this response reflects. |
| tool | Yes | |
| error | No | |
| label | No | |
| month | No | |
| index_id | No | |
| gapPoints | No | |
| topAvgApy | No | |
| datasetUrl | No | |
| attribution | No | |
| generatedAt | Yes | ISO timestamp this response was computed at. |
| verified_at | No | |
| banksTracked | No | |
| headlineValue | No | |
| schemaVersion | Yes | |
| methodologyUrl | No | |
| nationalAvgApy | No | |
| freshnessStatus | No | |
| releaseArchiveUrl | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true, fully covering the safety profile for a zero-parameter lookup. The description adds only that the result is the headline value plus release and methodology URL, which is modest added context but nothing beyond the annotated read-only, idempotent nature.
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 that names the resource first and enumerates the returned fields without filler. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read with an output schema present, the description needs only to frame the resource, which it does. The one real gap is that it never clarifies its relationship to the near-identical sibling get_bank_gap, so an agent could still pick the wrong one.
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 no parameter semantics to convey; per the rubric this is the baseline of 4. Nothing in the schema needs compensating for in 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 ('Return the current SwitchWize Bank Gap Index headline value, latest release, and methodology URL'), so the agent knows exactly what it produces. It does not, however, distinguish itself from the closely named sibling get_bank_gap, leaving ambiguity about which is the right tool for the gap index.
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 reference to alternatives such as get_bank_gap or get_index_dataset. The agent must infer the selection criteria purely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_card_changesCard ChangesBRead-onlyIdempotentInspect
Return recent verified credit-card fee and APR changes, most recent first. Each event is a diff between two confirmed snapshots of the same card.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| sinceDays | No | Only changes observed within this many days. |
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | No | ISO timestamp of the underlying data this response reflects. |
| tool | Yes | |
| count | No | |
| error | No | |
| changes | No | |
| sinceDays | No | |
| datasetUrl | No | |
| attribution | No | |
| generatedAt | Yes | ISO timestamp this response was computed at. |
| verified_at | No | |
| schemaVersion | Yes | |
| methodologyUrl | No | |
| freshnessStatus | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, open world), so the description is not obligated to restate it. Instead it adds genuinely useful behavior: results are 'verified' and ordered 'most recent first', and each event is a diff between two confirmed snapshots, which tells the agent the data model and that entries represent changes rather than current values. It does not mention pagination or coverage limits, keeping it at 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?
Two dense sentences with no filler; the core purpose is front-loaded and the diff semantics are appended as a clarifying second sentence. Every clause 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, and the description supplies the ordering and diff semantics that matter most for interpreting results. The only gap is the unexplained 'limit' parameter, which is minor given the output schema covers 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 coverage is only 50%: 'sinceDays' is documented in the schema, but 'limit' has no description beyond its min/max bounds. The description mentions 'recent' but adds no meaning about how limit or sinceDays behave, so it fails to compensate for the uncovered 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?
The description names a specific verb and resource ('Return recent verified credit-card fee and APR changes'), which is clearly distinct from siblings like get_card_offers or get_rate_freshness. It further sharpens the purpose by defining each event as a diff between two confirmed snapshots, so an agent knows this is a change-feed rather than an offer or rate listing. It stops short of explicitly naming the sibling it displaces, so 4 rather than 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 explicit when-to-use, when-not-to-use, or alternative-tool guidance. 'Recent' hints at a recency use case, but the agent must infer when to pick this over get_card_offers, get_rate_freshness, or the rate/offer siblings. No prerequisites or exclusions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_card_downgrade_pathCard Downgrade PathARead-onlyIdempotentInspect
Return verified credit-card product-change (downgrade) paths and the issuer's fee-refund window: which no-fee or lower-fee card a given card can be product-changed to, and how long after the annual fee posts a refund is available on cancellation. Optionally filtered to one card id (issuer:slug); returns every verified path and window when omitted.
| Name | Required | Description | Default |
|---|---|---|---|
| cardId | No | Optional card id (issuer:slug), e.g. chase:sapphire-reserve or capital-one:venture-x-rewards. Omit to return every verified downgrade path and fee-refund window. |
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | No | ISO timestamp of the underlying data this response reflects. |
| tool | Yes | |
| count | No | |
| error | No | |
| cardId | No | |
| datasetUrl | No | |
| attribution | No | |
| generatedAt | Yes | ISO timestamp this response was computed at. |
| verified_at | No | |
| schemaVersion | Yes | |
| downgradePaths | No | |
| methodologyUrl | No | |
| feeRefundWindow | No | |
| freshnessStatus | No | |
| feeRefundWindows | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint, so the safety profile is fully covered elsewhere. The description adds the useful qualifier 'verified' (curated data, not raw scrape) and clarifies that the refund window is tied to when the annual fee posts. It says nothing about freshness, pagination, or auth needs, so this is adequate but not rich.
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 return payload and followed by the optional filter. The parenthetical expansion of 'product-change' earns its place by disambiguating the term, and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the return shape needn't be described, and the tool has only one optional parameter whose schema is complete. The definition covers what is returned, the default behavior when the filter is omitted, and the data's verified nature – 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 100% and the single cardId parameter is fully documented in the schema, including the issuer:slug format and examples. The description's mention of the same filter and the omit-to-return-all behavior largely restates the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb (Return) plus a precisely scoped resource: verified credit-card product-change (downgrade) paths and the issuer's fee-refund window. It even defines the concept inline ('which no-fee or lower-fee card a given card can be product-changed to'), so an agent knows exactly what it gets. It never names the adjacent siblings (get_card_changes, get_card_offers), so it stops short of explicit differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The second sentence gives filtering guidance ('Optionally filtered to one card id... returns every verified path and window when omitted'), which tells the agent how to scope the call. However, there is no tool-level when-to-use versus alternatives, and no indication of when get_card_changes would be the better choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_card_offersCard OffersARead-onlyIdempotentInspect
Return current credit-card welcome-bonus offers (non-targeted, confidence-gated), each with a verified timestamp, source URL, and the card's own 12-month best.
| Name | Required | Description | Default |
|---|---|---|---|
| card | No | Optional card id (issuer:slug), slug, or name to filter to one card, e.g. chase:sapphire-preferred or Sapphire Preferred. | |
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | No | ISO timestamp of the underlying data this response reflects. |
| tool | Yes | |
| count | No | |
| error | No | |
| offers | No | |
| datasetUrl | No | |
| attribution | No | |
| generatedAt | Yes | ISO timestamp this response was computed at. |
| verified_at | No | |
| totalTracked | No | |
| schemaVersion | Yes | |
| methodologyUrl | No | |
| freshnessStatus | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnly, idempotent, openWorld, non-destructive), so the bar is lower; the description still adds real context by disclosing that results are confidence-gated, non-targeted, and carry a verified timestamp plus source URL. This tells the agent about data trustworthiness, which the annotations do not. It does not discuss pagination or staleness 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?
A single sentence that is front-loaded with the core action and packs scope, filtering behavior, and payload shape without a wasted clause. Nothing here 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?
For a read-only listing tool with an output schema, the description is nearly sufficient: return values need not be spelled out but are summarized anyway, and scope qualifiers are given. The remaining hole is the undocumented 'limit' parameter, which the description and schema both leave silent.
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 only 50%: the 'card' parameter is documented in the schema, but 'limit' has no description anywhere. The description mentions no parameters at all, so it fails to compensate for the coverage gap, particularly the missing semantics of the result cap and its interaction with the 200 maximum.
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?
Specific verb+resource: returning current credit-card welcome-bonus offers, with scoping qualifiers (non-targeted, confidence-gated) and the per-card payload. An agent can distinguish this from siblings like get_transfer_bonuses or get_reward_valuations by resource. It stops short of naming any sibling, 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?
Usage is implied: fetch it when you need live welcome-bonus offers. The 'non-targeted' qualifier hints at a scope boundary (targeted offers presumably live elsewhere), but there is no explicit when-to-use or when-not-to-use guidance and no alternative tool is named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_cd_rollover_rulesCD Rollover RulesARead-onlyIdempotentInspect
Return verified CD rollover rules for one bank, or every bank SwitchWize has verified: what happens automatically at maturity if the customer does nothing, the grace period, how to stop the rollover, and the early-withdrawal penalty. Each fact is sourced directly from the bank's own disclosure; an unverified field is omitted, never guessed.
| Name | Required | Description | Default |
|---|---|---|---|
| institutionId | No | Optional institution_registry id, e.g. chase, american-express, wells-fargo. Omit to return every bank SwitchWize has verified. |
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | No | ISO timestamp of the underlying data this response reflects. |
| tool | Yes | |
| count | No | |
| error | No | |
| sourceUrl | No | |
| datasetUrl | No | |
| attribution | No | |
| generatedAt | Yes | ISO timestamp this response was computed at. |
| verified_at | No | |
| institutions | No | |
| institutionId | No | |
| schemaVersion | Yes | |
| methodologyUrl | No | |
| freshnessStatus | No | |
| gracePeriodDays | No | |
| autoRenewDefault | No | |
| autoRenewDescription | No | |
| earlyWithdrawalPenalty | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, open world). The description adds genuinely new behavioral context: data provenance from the bank's own disclosure and the rule that unverified fields are omitted rather than guessed, which tells the agent to expect partial objects and not to treat missing fields as errors.
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, tightly front-loaded: the first gives the operation and scope, the second gives the data-quality guarantee. No filler, no restatement of the tool name, and the most decision-relevant information (scope) comes first.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value explanation is unnecessary. Within that constraint the description supplies everything an agent needs: what is returned, for which entity, the sourcing guarantee, and the omission semantics for unverified data.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single institutionId parameter is fully documented in the schema, including the omit-for-all-banks behavior. The description restates that scope but adds no format, id-validation, or edge-case detail beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Return verified CD rollover rules') plus the exact scope: one bank or every verified bank. It also enumerates the returned facts (maturity behavior, grace period, stop-rollover method, early-withdrawal penalty), which cleanly separates it from the rate-, card-, and bonus-oriented 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?
The scope branch is explicit — pass an institution for one bank, omit it for all verified banks — which tells the agent how to invoke it in either case. It doesn't state when to prefer a sibling tool over this one, but the sibling set covers unrelated domains (rates, cards, bonuses), so ambiguity is low.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_fed_hike_pass_throughFed Hike Pass-ThroughARead-onlyIdempotentInspect
Return how much of the latest Federal Reserve rate hike each tracked savings account has passed through to savers so far: rate before the hike, rate now, change in basis points, pass-through share, and days until the bank moved. One source per bank; each row carries its source type and observation dates. Optionally filtered to one institution id.
| Name | Required | Description | Default |
|---|---|---|---|
| institutionId | No | Optional institution_registry id, e.g. tab, ally, marcus. Omit to return every savings account measured against the latest Fed hike. |
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | No | ISO timestamp of the underlying data this response reflects. |
| move | No | |
| tool | Yes | |
| count | No | |
| error | No | |
| summary | No | |
| excluded | No | |
| datasetUrl | No | |
| attribution | No | |
| generatedAt | Yes | ISO timestamp this response was computed at. |
| institution | No | |
| verified_at | No | |
| institutions | No | |
| schemaVersion | Yes | |
| methodologyUrl | No | |
| freshnessStatus | No | |
| daysSinceAnnouncement | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry the safety profile (readOnlyHint=true, idempotentHint=true, openWorldHint=true, destructiveHint=false), lowering the bar. The description still adds real behavioral context beyond them: 'one source per bank,' per-row source type, and observation dates, which tell the agent how to interpret provenance and freshness of each row.
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 dense sentences: the first front-loads what is computed and the exact output fields, the second covers dataset structure and the optional filter. No filler, no repetition, and the most important information leads.
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, single-optional-param tool with an output schema and full annotation coverage, the description supplies what's needed: the computation being reported, row granularity, provenance, and the filter. The only marginal gap is that it doesn't touch freshness/staleness expectations, but get_rate_freshness exists as a sibling for that concern.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single optional institutionId is fully documented in the schema (including example ids like tab, ally, marcus). The description merely restates that the filter is optional and scopes it to 'one institution id,' adding no format or behavior detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb+resource (return Fed-hike pass-through per savings account) and enumerates the exact metrics returned: rate before, rate now, basis-point change, pass-through share, days to move. That framing cleanly separates it from siblings like get_top_hysa_rates or get_bank_gap, which measure levels and gaps rather than pass-through of a specific hike.
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: the description notes the result can be 'optionally filtered to one institution id,' which hints at the unfiltered-aggregate vs single-bank modes. It never states when to reach for this instead of get_bank_gap, get_reality_score, or best_move_this_week, nor any precondition for calling it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_index_datasetIndex DatasetCRead-onlyIdempotentInspect
Return a SwitchWize index dataset summary and recent series.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| indexId | Yes | Index id, e.g. bank-gap-index, cd-spread, mma-spread, checking-gap. |
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | No | ISO timestamp of the underlying data this response reflects. |
| tool | Yes | |
| error | No | |
| label | No | |
| series | No | |
| index_id | No | |
| attribution | No | |
| generatedAt | Yes | ISO timestamp this response was computed at. |
| verified_at | No | |
| schemaVersion | Yes | |
| methodologyUrl | No | |
| freshnessStatus | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint, so the safety and idempotency profile is covered. The description adds that it returns a 'summary and recent series,' which hints at output shape but doesn't specify pagination, rate limits, or what 'recent' means. With annotations already conveying core behavior, this is adequate but not rich.
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's a single, efficient sentence with no fluff, though it could be slightly more front-loaded by leading with the action and result. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values needn't be explained. However, for a tool with siblings that serve similar purposes, the description lacks the routing information needed to pick this tool correctly. The parameter gap (undocumented 'limit') also leaves an incompleteness.
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 50%. The indexId parameter has a description with examples in the schema; the limit parameter has no description in the schema or in the description text. The description doesn't compensate for the missing limit documentation. Baseline 3 is appropriate when schema partially covers 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?
The description states a verb and resource: 'Return a SwitchWize index dataset summary and recent series.' This is clear enough to understand the tool's output, but it doesn't distinguish it from siblings like get_bank_gap_index or get_bank_gap. An agent could confuse this generic 'index dataset' tool with those specific index 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?
No when-to-use guidance is provided. It doesn't mention alternatives, conditions, or exclusions. With many similar-sounding sibling tools, this omission is significant.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_rate_freshnessData FreshnessARead-onlyIdempotentInspect
Return public data source freshness status and affected routes. savings is an alias for hysa; money-market is an alias for mma. Also supports cds, checking, macro, bank-gap-index, and indices. Omit category for all supported sources. Unknown categories return an error; a source with no observations is explicitly unavailable. Source collection freshness does not establish that a ranked deposit release is approved or current.
| Name | Required | Description | Default |
|---|---|---|---|
| category | No | Optional freshness category. savings maps to hysa; money-market maps to mma. Also supports cds, checking, macro, bank-gap-index, and indices. Omit for all supported sources. Unknown values return an error; a known source without observations is unavailable. |
Output Schema
| Name | Required | Description |
|---|---|---|
| tool | Yes | |
| error | No | |
| sources | No | |
| attribution | No | |
| generatedAt | Yes | ISO timestamp this response was computed at. |
| schemaVersion | Yes | |
| affectedRoutes | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly, idempotent, non-destructive, open-world. The description adds genuine behavioral context beyond them: unknown categories raise an error, sources with no observations are reported as unavailable rather than empty, and freshness is a collection signal not an approval signal. That last caveat is a meaningful semantic distinction the 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?
The core purpose and the alias rules are front-loaded, and each sentence carries information. It is slightly padded by re-enumerating categories and aliases that the schema already lists, which is duplication rather than new value.
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-required-parameter read tool with a full output schema, the definition covers purpose, aliasing, error behavior, empty-source semantics, and the approval caveat—enough to call it correctly. 'Affected routes' is mentioned without elaboration, but the output schema carries that 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?
Schema coverage is 100% and the single parameter's enum description already documents the savings→hysa and money-market→mma aliases, the full category list, the omit-for-all behavior, and the error/unavailable semantics. The description largely restates that text, adding little beyond the schema.
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: 'Return public data source freshness status and affected routes.' No sibling tool covers freshness, so the agent can immediately distinguish this from rate-listing tools like get_top_rates or get_bank_gap.
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 invocation guidance—omit category for all sources, unknown categories error, known-but-empty sources are explicitly unavailable—plus a boundary caveat that source freshness does not imply an approved/current ranked deposit release. It stops short of naming when to prefer a sibling tool (e.g., call this before trusting get_top_hysa_rates), so it lacks explicit alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_reality_scoreCard Reality ScoreARead-onlyIdempotentInspect
Estimate the modeled annual value of a supported premium credit card for a consumer segment. Supply a card slug or name and optionally a segment ID; the default is occasional-traveler. Return segment assumptions, score, rewards, credits, perks, fee, interest, friction, net value, caveats, sources, verification date, freshness and methodology. Gross recovered value is rewards + credits + perks. breakageMultiplier is gross recovered value / advertised value, NOT divided by annual fee. feeRecoveryMultiplier is max(0, gross recovered value - interest drag - rewards friction discount) / annual fee, before subtracting the fee. Friction applies to raw rewards only. Reality Score is 100 * net realized value / advertised value. Ratios are rounded. These are scenario estimates, not personalized advice or guaranteed benefits. Preserve stale or unavailable labels; do not infer that all terms share the observation date. Unknown cards or segments return a structured error with suggestions.
| Name | Required | Description | Default |
|---|---|---|---|
| card | Yes | Card slug or name, e.g. platinum-card or Chase Sapphire Reserve. | |
| segment | No | Optional segment id, e.g. occasional-traveler, small-business-owner, balance-carrier. |
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | No | ISO timestamp of the underlying data this response reflects. |
| tool | Yes | |
| error | No | |
| result | No | |
| segment | No | |
| index_id | No | |
| datasetUrl | No | |
| attribution | No | |
| generatedAt | Yes | ISO timestamp this response was computed at. |
| verified_at | No | |
| schemaVersion | Yes | |
| methodologyUrl | No | |
| freshnessStatus | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, openWorld), but the description adds real behavioral context: it defines every derived ratio (breakageMultiplier, feeRecoveryMultiplier, friction, Reality Score), warns that these are scenario estimates, and instructs how to handle stale/unavailable labels. It also discloses that unknown cards/segments return a structured error with suggestions. This goes well beyond the annotations, though some overlap 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?
The purpose and required inputs are front-loaded correctly, but the middle of the description is a dense run of formula definitions (breakageMultiplier, feeRecoveryMultiplier, friction, Reality Score) that partly restates what the output schema can carry. Several sentences do real work, but the block is longer than needed for a 2-parameter read tool.
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 estimation tool with a full output schema and complete annotations, the description covers the remaining gaps: default segment, error behavior, the meaning of every computed ratio, caveats about scenario estimates, and stale-label handling. An agent has everything it needs to call 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 description coverage is 100%, so the schema already documents both parameters (card and segment) with examples. The description adds only the default value for segment (occasional-traveler), which is not in the schema, and restates card-or-name input. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence gives a specific verb+resource+scope: "Estimate the modeled annual value of a supported premium credit card for a consumer segment." It clearly defines the Reality Score concept. However, it never distinguishes itself from the closest siblings (get_reward_valuations, get_card_offers, get_card_downgrade_path), so an agent must infer which card-value tool to pick.
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 states invocation basics ("Supply a card slug or name and optionally a segment ID; the default is occasional-traveler") and notes error behavior for unknown inputs, but gives no when-to-use vs when-not guidance and names no alternative among the many sibling card tools. Usage is implied rather than directed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_reward_valuationsReward ValuationsBRead-onlyIdempotentInspect
Return SwitchWize points/miles valuations (cents per point) per reward currency, with sample size and provisional/published status.
| Name | Required | Description | Default |
|---|---|---|---|
| currency | No | Optional reward currency id or name, e.g. chase-ultimate-rewards or Membership Rewards. |
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | No | ISO timestamp of the underlying data this response reflects. |
| tool | Yes | |
| count | No | |
| error | No | |
| datasetUrl | No | |
| valuations | No | |
| attribution | No | |
| generatedAt | Yes | ISO timestamp this response was computed at. |
| verified_at | No | |
| schemaVersion | Yes | |
| methodologyUrl | No | |
| freshnessStatus | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so safety behavior is covered. The description adds useful context beyond the schema by disclosing that results carry sample size and a provisional/published status, but it omits any behavioral notes about freshness, coverage, or defaults.
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; the core action leads and the detail clauses follow. Slightly dense but every clause 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?
With an output schema present, return values need not be described, and annotations cover the safety profile. The description covers purpose, unit, and result metadata; the only gap is not stating what happens when 'currency' is omitted (all currencies), which is minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the single optional 'currency' parameter is already fully documented. The phrase 'per reward currency' reinforces that results are currency-scoped, but adds no syntax or format detail beyond the schema, which is the expected baseline.
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 ('Return SwitchWize points/miles valuations (cents per point) per reward currency') and even names the unit. It is clear what the tool retrieves, though it does not explicitly differentiate itself from siblings like get_transfer_bonuses or get_index_dataset, which an agent must infer from the domain.
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 statement of prerequisites, and no routing to alternative siblings. The agent must infer usage entirely from the tool name and description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_top_hysa_ratesHigh-Yield Savings RatesARead-onlyIdempotentInspect
Return top high-yield savings rates with freshness and attribution. Answers only from the editor-approved snapshot; before its first release it returns no ranked rates and says so (approval_status: not_yet_approved). approvedOnly makes the requirement explicit. detail=full adds every listed account marked verified or tracked, best picks, movers, history and a headline summary.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| detail | No | summary (default) adds list_counts. full (savings) adds the complete shared build: accounts (verified and tracked, each marked), best_picks, movers, history and summary. rates stays verified-only either way. | |
| approvedOnly | No | Require an editor-approved HYSA snapshot. The default tool already answers only from the approved release; before its first release it returns no ranked rates (approval_status: not_yet_approved). |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| asOf | No | |
| tool | No | |
| count | No | |
| error | No | |
| rates | No | |
| terms | No | |
| source | No | |
| category | No | |
| rate_type | No | |
| releaseId | No | |
| dataStatus | No | |
| attribution | No | |
| emptyReason | No | |
| generatedAt | Yes | |
| releaseSize | No | |
| releaseStatus | No | |
| schemaVersion | Yes | |
| sourceDetails | No | |
| methodologyUrl | No | |
| freshnessStatus | No | |
| attributionDetails | No | |
| supportedCategories | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare it read-only, idempotent, and non-destructive, but the description adds real behavioral context beyond them: the sourcing restriction to an editor-approved snapshot and the explicit degraded state (no ranked rates, approval_status: not_yet_approved) before first release. It also enumerates what detail=full surface area includes. Refresh/rate-limit behavior is still unstated.
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 front-loaded sentences that lead with purpose and then qualify behavior; little waste. The approvedOnly sentence is somewhat redundant with the preceding snapshot sentence, costing a point.
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, yet the description still clarifies the meaningful state (approval_status: not_yet_approved) and the detail modes. Combined with the read-only annotations this is nearly complete; only the undocumented limit parameter remains a 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 67% and both documented parameters (detail, approvedOnly) are essentially restated rather than clarified — the approvedOnly sentence largely duplicates the schema's own text. The limit parameter has no description in either place, so 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?
The description gives a specific verb+resource ('Return top high-yield savings rates') plus the freshness/attribution wrapper, which is more precise than the bare title. It does not, however, differentiate itself from the close sibling get_top_rates, leaving the agent to infer the HYSA-specific scope.
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 states a meaningful operating condition — answers only from the editor-approved snapshot and returns no ranked rates with approval_status: not_yet_approved before first release. That is output-state guidance rather than when-to-use-this-vs-alternatives guidance; no sibling such as get_top_rates or compare_switch_savings is named as an alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_top_ratesTop RatesARead-onlyIdempotentInspect
Return top SwitchWize rates with freshness and attribution. Savings, CDs, checking and money market answer only from their editor-approved snapshot. A category with no approved release yet returns no ranked rates and says so (approval_status: not_yet_approved) rather than serving unverified observations; approvedOnly makes that requirement explicit. Approved responses include product terms and field evidence; stale or unavailable releases return no ranked rates. detail=full (savings) adds the complete shared build: every listed account marked verified or tracked, best picks, movers, history and a headline summary.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| detail | No | summary (default) adds list_counts. full (savings) adds the complete shared build: accounts (verified and tracked, each marked), best_picks, movers, history and summary. rates stays verified-only either way. | |
| category | Yes | U.S. deposit category: savings (alias hysa), cds, money-market (alias mma), or checking. | |
| approvedOnly | No | Require an editor-approved deposit snapshot. Savings, CDs, checking and money market always answer from their own approved release; a category with no release yet returns no ranked rates (approval_status: not_yet_approved), as do stale or unavailable releases. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| asOf | No | |
| tool | No | |
| count | No | |
| error | No | |
| rates | No | |
| terms | No | |
| source | No | |
| category | No | |
| rate_type | No | |
| releaseId | No | |
| dataStatus | No | |
| attribution | No | |
| emptyReason | No | |
| generatedAt | Yes | |
| releaseSize | No | |
| releaseStatus | No | |
| schemaVersion | Yes | |
| sourceDetails | No | |
| methodologyUrl | No | |
| freshnessStatus | No | |
| attributionDetails | No | |
| supportedCategories | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnly/idempotent annotations by disclosing degradation behavior: missing approval returns no ranked rates with approval_status: not_yet_approved, and stale or unavailable releases also return no ranked rates rather than unverified data. It also states that approved payloads carry product terms and field evidence. It does not mention rate limits or payload size, 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?
Purpose is front-loaded in the first sentence, but the description then repeats the approval/not_yet_approved story twice (general rule, then again via approvedOnly, then again via stale releases). The final sentence about detail=full duplicates the schema's own detail description almost verbatim.
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 shape need not be explained, and the description covers the important failure modes for a four-parameter read tool. The remaining gap is that it never positions itself against get_top_hysa_rates, leaving potential mis-selection 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 coverage is 75%, so the schema already carries most parameter meaning; the description mainly restates the approvedOnly and detail semantics that the schema also documents. The limit parameter (1-25) is undocumented in both places, and the description adds no formatting or ordering guidance for it.
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 ('Return top SwitchWize rates') plus the scoping dimensions (freshness, attribution, deposit category). It does not differentiate itself from the overlapping sibling get_top_hysa_rates, which covers the hysa alias of the same category enum, so an agent cannot resolve the overlap from the description 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?
The description implies usage via its guarantee language ('Savings, CDs, checking and money market answer only from their editor-approved snapshot') and notes when approvedOnly is required, but it never says when to pick this tool over get_top_hysa_rates or get_rate_freshness. Use cases are 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.
get_transfer_bonusesTransfer BonusesBRead-onlyIdempotentInspect
Return current point-transfer bonuses across tracked bank-to-partner routes, each with a verified timestamp, source URL, and best-ever-for-route when real history exists.
| Name | Required | Description | Default |
|---|---|---|---|
| program | No | Optional program id or name to filter routes by source or destination, e.g. chase-ultimate-rewards or Flying Blue. |
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | No | ISO timestamp of the underlying data this response reflects. |
| tool | Yes | |
| count | No | |
| error | No | |
| routes | No | |
| datasetUrl | No | |
| attribution | No | |
| generatedAt | Yes | ISO timestamp this response was computed at. |
| verified_at | No | |
| schemaVersion | Yes | |
| methodologyUrl | No | |
| freshnessStatus | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, and open-world, so the safety profile is covered. The description adds one genuinely useful behavioral trait: 'best-ever-for-route when real history exists,' disclosing that a field is conditionally populated. Everything else it mentions (timestamp, source URL) restates return values already covered by 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?
A single front-loaded sentence with no filler; the core action leads and the output details follow. Slightly dense and could be split, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only tool with one optional parameter, a full schema, and an output schema, the description covers purpose and return provenance adequately. The only real gap is routing guidance against the many sibling tools in this rate/deal family.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the single optional 'program' parameter is fully documented as filtering by source or destination with examples. The description adds nothing about filtering semantics, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Return current point-transfer bonuses') and scopes it to 'tracked bank-to-partner routes,' which clearly separates it from rate, card-offer, and valuation siblings. It does not name a sibling, but the domain is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use or when-not-to-use guidance, no mention of alternatives (e.g. get_card_offers, best_move_this_week), and no prerequisites. The usage context is only implied by the resource name.
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.
2 tool updates
- Changed
get_top_hysa_rates3 fields changed- added
Output schema / properties / releaseIdAdded value: +{ + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / releaseSizeAdded value: +{ + "type": "number" +} - added
Output schema / properties / releaseStatusAdded value: +{ + "enum": [ + "observed", + "unavailable" + ], + "type": "string" +}
- Changed
get_top_rates3 fields changed- added
Output schema / properties / releaseIdAdded value: +{ + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / releaseSizeAdded value: +{ + "type": "number" +} - added
Output schema / properties / releaseStatusAdded value: +{ + "enum": [ + "observed", + "unavailable" + ], + "type": "string" +}
1 tool update
- Changed
get_reality_score1 field changed- added
Output schema / properties / result / propertiesAdded value: +{ + "advertisedValue": { + "type": "number" + }, + "annualFee": { + "type": "number" + }, + "breakageMultiplier": { + "description": "Gross recovered value (rewards + credits + perks) / advertised value, rounded to two decimals. Annual fee is not this denominator.", + "type": "number" + }, + "feeRecoveryMultiplier": { + "description": "max(0, gross recovered value - interest drag - rewards friction discount) / annual fee, rounded to two decimals; before subtracting the annual fee.", + "type": "number" + }, + "interestDrag": { + "type": "number" + }, + "realityScore": { + "description": "100 * net realized value / advertised value, rounded to an integer.", + "type": "number" + }, + "realizedPerks": { + "type": "number" + }, + "realizedRewards": { + "type": "number" + }, + "realizedStatementCredits": { + "type": "number" + }, + "realizedValue": { + "description": "Rewards + credits + perks minus annual fee, interest drag and rewards friction discount.", + "type": "number" + }, + "redemptionFrictionDiscount": { + "description": "Discount applied to raw rewards, not to credits or perks.", + "type": "number" + } +}
16 tool updates
- Changed
best_move_this_week3 fields changed- removed
Output schema / properties / error / properties / suggestions / items / additionalPropertiesRemoved value: -true - added
Output schema / properties / error / properties / suggestions / items / anyOfAdded value: +[ + { + "type": "string" + }, + { + "additionalProperties": true, + "type": "object" + } +] - removed
Output schema / properties / error / properties / suggestions / items / typeRemoved value: -"object"
- Changed
compare_switch_savings7 fields changed- changed
Output schema / properties / annualGap / typePrevious value: -"number"New value: +[ + "number", + "null" +] - changed
Output schema / properties / comparisonApy / typePrevious value: -"number"New value: +[ + "number", + "null" +] - changed
Output schema / properties / comparisonInterest / typePrevious value: -"number"New value: +[ + "number", + "null" +] - removed
Output schema / properties / error / properties / suggestions / items / additionalPropertiesRemoved value: -true - added
Output schema / properties / error / properties / suggestions / items / anyOfAdded value: +[ + { + "type": "string" + }, + { + "additionalProperties": true, + "type": "object" + } +] - removed
Output schema / properties / error / properties / suggestions / items / typeRemoved value: -"object" - added
Output schema / properties / recommendationStatusAdded value: +{ + "enum": [ + "comparison_available", + "data_unavailable" + ], + "type": "string" +}
- Changed
get_bank_gap6 fields changed- added
Output schema / properties / bankCount / descriptionAdded value: +"Number of tracked banks in the comparison set, not the number averaged into comparisonApy." - added
Output schema / properties / baselineApy / descriptionAdded value: +"Named bank APY, or national savings benchmark when no bank is supplied. Percentage units." - added
Output schema / properties / comparisonApy / descriptionAdded value: +"Average of the top three tracked savings rates (or all available rates if fewer than three). Not an average across bankCount banks. Percentage units." - removed
Output schema / properties / error / properties / suggestions / items / additionalPropertiesRemoved value: -true - added
Output schema / properties / error / properties / suggestions / items / anyOfAdded value: +[ + { + "type": "string" + }, + { + "additionalProperties": true, + "type": "object" + } +] - removed
Output schema / properties / error / properties / suggestions / items / typeRemoved value: -"object"
- Changed
get_bank_gap_index3 fields changed- removed
Output schema / properties / error / properties / suggestions / items / additionalPropertiesRemoved value: -true - added
Output schema / properties / error / properties / suggestions / items / anyOfAdded value: +[ + { + "type": "string" + }, + { + "additionalProperties": true, + "type": "object" + } +] - removed
Output schema / properties / error / properties / suggestions / items / typeRemoved value: -"object"
- Changed
get_card_changes3 fields changed- removed
Output schema / properties / error / properties / suggestions / items / additionalPropertiesRemoved value: -true - added
Output schema / properties / error / properties / suggestions / items / anyOfAdded value: +[ + { + "type": "string" + }, + { + "additionalProperties": true, + "type": "object" + } +] - removed
Output schema / properties / error / properties / suggestions / items / typeRemoved value: -"object"
- Changed
get_card_downgrade_path3 fields changed- removed
Output schema / properties / error / properties / suggestions / items / additionalPropertiesRemoved value: -true - added
Output schema / properties / error / properties / suggestions / items / anyOfAdded value: +[ + { + "type": "string" + }, + { + "additionalProperties": true, + "type": "object" + } +] - removed
Output schema / properties / error / properties / suggestions / items / typeRemoved value: -"object"
- Changed
get_card_offers3 fields changed- removed
Output schema / properties / error / properties / suggestions / items / additionalPropertiesRemoved value: -true - added
Output schema / properties / error / properties / suggestions / items / anyOfAdded value: +[ + { + "type": "string" + }, + { + "additionalProperties": true, + "type": "object" + } +] - removed
Output schema / properties / error / properties / suggestions / items / typeRemoved value: -"object"
- Changed
get_cd_rollover_rules3 fields changed- removed
Output schema / properties / error / properties / suggestions / items / additionalPropertiesRemoved value: -true - added
Output schema / properties / error / properties / suggestions / items / anyOfAdded value: +[ + { + "type": "string" + }, + { + "additionalProperties": true, + "type": "object" + } +] - removed
Output schema / properties / error / properties / suggestions / items / typeRemoved value: -"object"
- Changed
get_fed_hike_pass_through3 fields changed- removed
Output schema / properties / error / properties / suggestions / items / additionalPropertiesRemoved value: -true - added
Output schema / properties / error / properties / suggestions / items / anyOfAdded value: +[ + { + "type": "string" + }, + { + "additionalProperties": true, + "type": "object" + } +] - removed
Output schema / properties / error / properties / suggestions / items / typeRemoved value: -"object"
- Changed
get_index_dataset3 fields changed- removed
Output schema / properties / error / properties / suggestions / items / additionalPropertiesRemoved value: -true - added
Output schema / properties / error / properties / suggestions / items / anyOfAdded value: +[ + { + "type": "string" + }, + { + "additionalProperties": true, + "type": "object" + } +] - removed
Output schema / properties / error / properties / suggestions / items / typeRemoved value: -"object"
- Changed
get_rate_freshness3 fields changed- removed
Output schema / properties / error / properties / suggestions / items / additionalPropertiesRemoved value: -true - added
Output schema / properties / error / properties / suggestions / items / anyOfAdded value: +[ + { + "type": "string" + }, + { + "additionalProperties": true, + "type": "object" + } +] - removed
Output schema / properties / error / properties / suggestions / items / typeRemoved value: -"object"
- Changed
get_reality_score3 fields changed- removed
Output schema / properties / error / properties / suggestions / items / additionalPropertiesRemoved value: -true - added
Output schema / properties / error / properties / suggestions / items / anyOfAdded value: +[ + { + "type": "string" + }, + { + "additionalProperties": true, + "type": "object" + } +] - removed
Output schema / properties / error / properties / suggestions / items / typeRemoved value: -"object"
- Changed
get_reward_valuations3 fields changed- removed
Output schema / properties / error / properties / suggestions / items / additionalPropertiesRemoved value: -true - added
Output schema / properties / error / properties / suggestions / items / anyOfAdded value: +[ + { + "type": "string" + }, + { + "additionalProperties": true, + "type": "object" + } +] - removed
Output schema / properties / error / properties / suggestions / items / typeRemoved value: -"object"
- Changed
get_top_hysa_rates7 fields changed- added
Input schema / properties / detailAdded value: +{ + "description": "summary (default) adds list_counts. full (savings) adds the complete shared build: accounts (verified and tracked, each marked), best_picks, movers, history and summary. rates stays verified-only either way.", + "enum": [ + "summary", + "full" + ], + "type": "string" +} - added
Output schema / anyOfAdded value: +[ + { + "properties": { + "attribution": { + "type": "string" + } + }, + "required": [ + "category", + "count", + "freshnessStatus", + "rates" + ] + }, + { + "properties": { + "attribution": { + "additionalProperties": true, + "type": "object" + } + }, + "required": [ + "tool", + "error", + "attribution" + ] + } +] - added
Output schema / properties / attribution / anyOfAdded value: +[ + { + "type": "string" + }, + { + "additionalProperties": true, + "type": "object" + } +] - removed
Output schema / properties / attribution / typeRemoved value: -"string" - added
Output schema / properties / errorAdded value: +{ + "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" +} - added
Output schema / properties / toolAdded value: +{ + "type": "string" +} - changed
Output schema / requiredPrevious value: -[ - "schemaVersion", - "category", - "count", - "generatedAt", - "freshnessStatus", - "rates" -]New value: +[ + "schemaVersion", + "generatedAt" +]
- Changed
get_top_rates7 fields changed- added
Input schema / properties / detailAdded value: +{ + "description": "summary (default) adds list_counts. full (savings) adds the complete shared build: accounts (verified and tracked, each marked), best_picks, movers, history and summary. rates stays verified-only either way.", + "enum": [ + "summary", + "full" + ], + "type": "string" +} - added
Output schema / anyOfAdded value: +[ + { + "properties": { + "attribution": { + "type": "string" + } + }, + "required": [ + "category", + "count", + "freshnessStatus", + "rates" + ] + }, + { + "properties": { + "attribution": { + "additionalProperties": true, + "type": "object" + } + }, + "required": [ + "tool", + "error", + "attribution" + ] + } +] - added
Output schema / properties / attribution / anyOfAdded value: +[ + { + "type": "string" + }, + { + "additionalProperties": true, + "type": "object" + } +] - removed
Output schema / properties / attribution / typeRemoved value: -"string" - added
Output schema / properties / errorAdded value: +{ + "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" +} - added
Output schema / properties / toolAdded value: +{ + "type": "string" +} - changed
Output schema / requiredPrevious value: -[ - "schemaVersion", - "category", - "count", - "generatedAt", - "freshnessStatus", - "rates" -]New value: +[ + "schemaVersion", + "generatedAt" +]
- Changed
get_transfer_bonuses3 fields changed- removed
Output schema / properties / error / properties / suggestions / items / additionalPropertiesRemoved value: -true - added
Output schema / properties / error / properties / suggestions / items / anyOfAdded value: +[ + { + "type": "string" + }, + { + "additionalProperties": true, + "type": "object" + } +] - removed
Output schema / properties / error / properties / suggestions / items / typeRemoved value: -"object"
2 tool updates
- Changed
get_top_hysa_rates2 fields changed- added
Input schema / properties / approvedOnlyAdded value: +{ + "description": "Require an editor-approved HYSA snapshot. The default tool already answers only from the approved release; before its first release it returns no ranked rates (approval_status: not_yet_approved).", + "type": "boolean" +} - added
Output schema / properties / dataStatusAdded value: +{ + "enum": [ + "available", + "no_observations", + "no_eligible_rates", + "source_error", + "unavailable", + "stale", + "conflicted" + ], + "type": "string" +}
- Changed
get_top_rates2 fields changed- added
Input schema / properties / approvedOnlyAdded value: +{ + "description": "Require an editor-approved deposit snapshot. Savings, CDs, checking and money market always answer from their own approved release; a category with no release yet returns no ranked rates (approval_status: not_yet_approved), as do stale or unavailable releases.", + "type": "boolean" +} - added
Output schema / properties / dataStatusAdded value: +{ + "enum": [ + "available", + "no_observations", + "no_eligible_rates", + "source_error", + "unavailable", + "stale", + "conflicted" + ], + "type": "string" +}
1 tool update
- Added
get_fed_hike_pass_through
13 tool updates
- Changed
best_move_this_week1 field changed- added
Output schema / properties / error / properties / retryableAdded value: +{ + "type": "boolean" +}
- Changed
compare_switch_savings1 field changed- added
Output schema / properties / error / properties / retryableAdded value: +{ + "type": "boolean" +}
- Changed
get_bank_gap1 field changed- added
Output schema / properties / error / properties / retryableAdded value: +{ + "type": "boolean" +}
- Changed
get_bank_gap_index1 field changed- added
Output schema / properties / error / properties / retryableAdded value: +{ + "type": "boolean" +}
- Changed
get_card_changes1 field changed- added
Output schema / properties / error / properties / retryableAdded value: +{ + "type": "boolean" +}
- Changed
get_card_downgrade_path1 field changed- added
Output schema / properties / error / properties / retryableAdded value: +{ + "type": "boolean" +}
- Changed
get_card_offers1 field changed- added
Output schema / properties / error / properties / retryableAdded value: +{ + "type": "boolean" +}
- Changed
get_cd_rollover_rules1 field changed- added
Output schema / properties / error / properties / retryableAdded value: +{ + "type": "boolean" +}
- Changed
get_index_dataset1 field changed- added
Output schema / properties / error / properties / retryableAdded value: +{ + "type": "boolean" +}
- Changed
get_rate_freshness1 field changed- added
Output schema / properties / error / properties / retryableAdded value: +{ + "type": "boolean" +}
- Changed
get_reality_score1 field changed- added
Output schema / properties / error / properties / retryableAdded value: +{ + "type": "boolean" +}
- Changed
get_reward_valuations1 field changed- added
Output schema / properties / error / properties / retryableAdded value: +{ + "type": "boolean" +}
- Changed
get_transfer_bonuses1 field changed- added
Output schema / properties / error / properties / retryableAdded value: +{ + "type": "boolean" +}
15 tool updates
- Changed
best_move_this_week2 fields changed- added
Output schema / propertiesAdded value: +{ + "asOf": { + "description": "ISO timestamp of the underlying data this response reflects.", + "type": [ + "string", + "null" + ] + }, + "attribution": { + "additionalProperties": true, + "type": "object" + }, + "cardMoves": { + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "error": { + "additionalProperties": false, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + }, + "suggestions": { + "items": { + "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" + }, + "savingsMove": { + "additionalProperties": true, + "type": [ + "object", + "null" + ] + }, + "schemaVersion": { + "type": "string" + }, + "tool": { + "type": "string" + }, + "transferBonuses": { + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "unheldOffers": { + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "verified_at": { + "type": [ + "string", + "null" + ] + } +} - added
Output schema / requiredAdded value: +[ + "schemaVersion", + "tool", + "generatedAt" +]
- Changed
compare_switch_savings2 fields changed- added
Output schema / propertiesAdded value: +{ + "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" + }, + "breakEvenFraming": { + "type": "string" + }, + "comparisonApy": { + "type": "number" + }, + "comparisonInterest": { + "type": "number" + }, + "currentApy": { + "type": "number" + }, + "currentInterest": { + "type": "number" + }, + "error": { + "additionalProperties": false, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + }, + "suggestions": { + "items": { + "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" + ] + } +} - added
Output schema / requiredAdded value: +[ + "schemaVersion", + "tool", + "generatedAt" +]
- Changed
get_bank_gap2 fields changed- added
Output schema / propertiesAdded value: +{ + "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": { + "type": "number" + }, + "baselineApy": { + "type": "number" + }, + "comparisonApy": { + "type": "number" + }, + "error": { + "additionalProperties": false, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + }, + "suggestions": { + "items": { + "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" + ] + } +} - added
Output schema / requiredAdded value: +[ + "schemaVersion", + "tool", + "generatedAt" +]
- Changed
get_bank_gap_index2 fields changed- added
Output schema / propertiesAdded value: +{ + "asOf": { + "description": "ISO timestamp of the underlying data this response reflects.", + "type": [ + "string", + "null" + ] + }, + "attribution": { + "additionalProperties": true, + "type": "object" + }, + "banksTracked": { + "type": [ + "number", + "null" + ] + }, + "datasetUrl": { + "type": "string" + }, + "error": { + "additionalProperties": false, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + }, + "suggestions": { + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + }, + "freshnessStatus": { + "enum": [ + "fresh", + "aging", + "stale", + "unavailable" + ], + "type": "string" + }, + "gapPoints": { + "type": [ + "number", + "null" + ] + }, + "generatedAt": { + "description": "ISO timestamp this response was computed at.", + "type": "string" + }, + "headlineValue": { + "type": [ + "number", + "null" + ] + }, + "index_id": { + "type": "string" + }, + "label": { + "type": "string" + }, + "methodologyUrl": { + "type": "string" + }, + "month": { + "type": [ + "string", + "null" + ] + }, + "nationalAvgApy": { + "type": [ + "number", + "null" + ] + }, + "releaseArchiveUrl": { + "type": "string" + }, + "schemaVersion": { + "type": "string" + }, + "tool": { + "type": "string" + }, + "topAvgApy": { + "type": [ + "number", + "null" + ] + }, + "verified_at": { + "type": [ + "string", + "null" + ] + } +} - added
Output schema / requiredAdded value: +[ + "schemaVersion", + "tool", + "generatedAt" +]
- Changed
get_card_changes2 fields changed- added
Output schema / propertiesAdded value: +{ + "asOf": { + "description": "ISO timestamp of the underlying data this response reflects.", + "type": [ + "string", + "null" + ] + }, + "attribution": { + "additionalProperties": true, + "type": "object" + }, + "changes": { + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "count": { + "type": "number" + }, + "datasetUrl": { + "type": "string" + }, + "error": { + "additionalProperties": false, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + }, + "suggestions": { + "items": { + "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" + }, + "sinceDays": { + "type": [ + "number", + "null" + ] + }, + "tool": { + "type": "string" + }, + "verified_at": { + "type": [ + "string", + "null" + ] + } +} - added
Output schema / requiredAdded value: +[ + "schemaVersion", + "tool", + "generatedAt" +]
- Changed
get_card_downgrade_path2 fields changed- added
Output schema / propertiesAdded value: +{ + "asOf": { + "description": "ISO timestamp of the underlying data this response reflects.", + "type": [ + "string", + "null" + ] + }, + "attribution": { + "additionalProperties": true, + "type": "object" + }, + "cardId": { + "type": "string" + }, + "count": { + "type": "number" + }, + "datasetUrl": { + "type": "string" + }, + "downgradePaths": { + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "error": { + "additionalProperties": false, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + }, + "suggestions": { + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + }, + "feeRefundWindow": { + "additionalProperties": true, + "type": [ + "object", + "null" + ] + }, + "feeRefundWindows": { + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "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" + ] + } +} - added
Output schema / requiredAdded value: +[ + "schemaVersion", + "tool", + "generatedAt" +]
- Changed
get_card_offers2 fields changed- added
Output schema / propertiesAdded value: +{ + "asOf": { + "description": "ISO timestamp of the underlying data this response reflects.", + "type": [ + "string", + "null" + ] + }, + "attribution": { + "additionalProperties": true, + "type": "object" + }, + "count": { + "type": "number" + }, + "datasetUrl": { + "type": "string" + }, + "error": { + "additionalProperties": false, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + }, + "suggestions": { + "items": { + "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" + }, + "offers": { + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "schemaVersion": { + "type": "string" + }, + "tool": { + "type": "string" + }, + "totalTracked": { + "type": "number" + }, + "verified_at": { + "type": [ + "string", + "null" + ] + } +} - added
Output schema / requiredAdded value: +[ + "schemaVersion", + "tool", + "generatedAt" +]
- Changed
get_cd_rollover_rules2 fields changed- added
Output schema / propertiesAdded value: +{ + "asOf": { + "description": "ISO timestamp of the underlying data this response reflects.", + "type": [ + "string", + "null" + ] + }, + "attribution": { + "additionalProperties": true, + "type": "object" + }, + "autoRenewDefault": { + "type": [ + "boolean", + "null" + ] + }, + "autoRenewDescription": { + "type": "string" + }, + "count": { + "type": "number" + }, + "datasetUrl": { + "type": "string" + }, + "earlyWithdrawalPenalty": { + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "error": { + "additionalProperties": false, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + }, + "suggestions": { + "items": { + "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" + }, + "gracePeriodDays": { + "type": [ + "number", + "null" + ] + }, + "institutionId": { + "type": "string" + }, + "institutions": { + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "methodologyUrl": { + "type": "string" + }, + "schemaVersion": { + "type": "string" + }, + "sourceUrl": { + "type": [ + "string", + "null" + ] + }, + "tool": { + "type": "string" + }, + "verified_at": { + "type": [ + "string", + "null" + ] + } +} - added
Output schema / requiredAdded value: +[ + "schemaVersion", + "tool", + "generatedAt" +]
- Changed
get_index_dataset2 fields changed- added
Output schema / propertiesAdded value: +{ + "asOf": { + "description": "ISO timestamp of the underlying data this response reflects.", + "type": [ + "string", + "null" + ] + }, + "attribution": { + "additionalProperties": true, + "type": "object" + }, + "error": { + "additionalProperties": false, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + }, + "suggestions": { + "items": { + "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" + }, + "index_id": { + "type": "string" + }, + "label": { + "type": "string" + }, + "methodologyUrl": { + "type": "string" + }, + "schemaVersion": { + "type": "string" + }, + "series": { + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "tool": { + "type": "string" + }, + "verified_at": { + "type": [ + "string", + "null" + ] + } +} - added
Output schema / requiredAdded value: +[ + "schemaVersion", + "tool", + "generatedAt" +]
- Changed
get_rate_freshness2 fields changed- added
Output schema / propertiesAdded value: +{ + "affectedRoutes": { + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "attribution": { + "additionalProperties": true, + "type": "object" + }, + "error": { + "additionalProperties": false, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + }, + "suggestions": { + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + }, + "generatedAt": { + "description": "ISO timestamp this response was computed at.", + "type": "string" + }, + "schemaVersion": { + "type": "string" + }, + "sources": { + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "tool": { + "type": "string" + } +} - added
Output schema / requiredAdded value: +[ + "schemaVersion", + "tool", + "generatedAt" +]
- Changed
get_reality_score2 fields changed- added
Output schema / propertiesAdded value: +{ + "asOf": { + "description": "ISO timestamp of the underlying data this response reflects.", + "type": [ + "string", + "null" + ] + }, + "attribution": { + "additionalProperties": true, + "type": "object" + }, + "datasetUrl": { + "type": "string" + }, + "error": { + "additionalProperties": false, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + }, + "suggestions": { + "items": { + "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" + }, + "index_id": { + "type": "string" + }, + "methodologyUrl": { + "type": "string" + }, + "result": { + "additionalProperties": true, + "type": [ + "object", + "null" + ] + }, + "schemaVersion": { + "type": "string" + }, + "segment": { + "additionalProperties": true, + "type": "object" + }, + "tool": { + "type": "string" + }, + "verified_at": { + "type": [ + "string", + "null" + ] + } +} - added
Output schema / requiredAdded value: +[ + "schemaVersion", + "tool", + "generatedAt" +]
- Changed
get_reward_valuations2 fields changed- added
Output schema / propertiesAdded value: +{ + "asOf": { + "description": "ISO timestamp of the underlying data this response reflects.", + "type": [ + "string", + "null" + ] + }, + "attribution": { + "additionalProperties": true, + "type": "object" + }, + "count": { + "type": "number" + }, + "datasetUrl": { + "type": "string" + }, + "error": { + "additionalProperties": false, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + }, + "suggestions": { + "items": { + "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" + }, + "valuations": { + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "verified_at": { + "type": [ + "string", + "null" + ] + } +} - added
Output schema / requiredAdded value: +[ + "schemaVersion", + "tool", + "generatedAt" +]
- Changed
get_top_hysa_rates2 fields changed- added
Output schema / propertiesAdded value: +{ + "asOf": { + "type": [ + "string", + "null" + ] + }, + "attribution": { + "type": "string" + }, + "attributionDetails": { + "additionalProperties": true, + "type": "object" + }, + "category": { + "type": "string" + }, + "count": { + "type": "number" + }, + "emptyReason": { + "type": [ + "string", + "null" + ] + }, + "freshnessStatus": { + "enum": [ + "fresh", + "aging", + "stale", + "unavailable" + ], + "type": "string" + }, + "generatedAt": { + "type": "string" + }, + "id": { + "type": "string" + }, + "methodologyUrl": { + "type": "string" + }, + "rate_type": { + "enum": [ + "APY", + "APR" + ], + "type": "string" + }, + "rates": { + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "schemaVersion": { + "type": "string" + }, + "source": { + "type": "string" + }, + "sourceDetails": { + "additionalProperties": true, + "type": "object" + }, + "supportedCategories": { + "items": { + "type": "string" + }, + "type": "array" + }, + "terms": { + "type": "string" + } +} - added
Output schema / requiredAdded value: +[ + "schemaVersion", + "category", + "count", + "generatedAt", + "freshnessStatus", + "rates" +]
- Changed
get_top_rates2 fields changed- added
Output schema / propertiesAdded value: +{ + "asOf": { + "type": [ + "string", + "null" + ] + }, + "attribution": { + "type": "string" + }, + "attributionDetails": { + "additionalProperties": true, + "type": "object" + }, + "category": { + "type": "string" + }, + "count": { + "type": "number" + }, + "emptyReason": { + "type": [ + "string", + "null" + ] + }, + "freshnessStatus": { + "enum": [ + "fresh", + "aging", + "stale", + "unavailable" + ], + "type": "string" + }, + "generatedAt": { + "type": "string" + }, + "id": { + "type": "string" + }, + "methodologyUrl": { + "type": "string" + }, + "rate_type": { + "enum": [ + "APY", + "APR" + ], + "type": "string" + }, + "rates": { + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "schemaVersion": { + "type": "string" + }, + "source": { + "type": "string" + }, + "sourceDetails": { + "additionalProperties": true, + "type": "object" + }, + "supportedCategories": { + "items": { + "type": "string" + }, + "type": "array" + }, + "terms": { + "type": "string" + } +} - added
Output schema / requiredAdded value: +[ + "schemaVersion", + "category", + "count", + "generatedAt", + "freshnessStatus", + "rates" +]
- Changed
get_transfer_bonuses2 fields changed- added
Output schema / propertiesAdded value: +{ + "asOf": { + "description": "ISO timestamp of the underlying data this response reflects.", + "type": [ + "string", + "null" + ] + }, + "attribution": { + "additionalProperties": true, + "type": "object" + }, + "count": { + "type": "number" + }, + "datasetUrl": { + "type": "string" + }, + "error": { + "additionalProperties": false, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + }, + "suggestions": { + "items": { + "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" + }, + "routes": { + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "schemaVersion": { + "type": "string" + }, + "tool": { + "type": "string" + }, + "verified_at": { + "type": [ + "string", + "null" + ] + } +} - added
Output schema / requiredAdded value: +[ + "schemaVersion", + "tool", + "generatedAt" +]
15 tool updates
- Changed
best_move_this_week1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "type": "object" +}
- Changed
compare_switch_savings1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "type": "object" +}
- Changed
get_bank_gap1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "type": "object" +}
- Changed
get_bank_gap_index1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "type": "object" +}
- Changed
get_card_changes1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "type": "object" +}
- Changed
get_card_downgrade_path1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "type": "object" +}
- Changed
get_card_offers1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "type": "object" +}
- Changed
get_cd_rollover_rules1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "type": "object" +}
- Changed
get_index_dataset1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "type": "object" +}
- Changed
get_rate_freshness1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "type": "object" +}
- Changed
get_reality_score1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "type": "object" +}
- Changed
get_reward_valuations1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "type": "object" +}
- Changed
get_top_hysa_rates1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "type": "object" +}
- Changed
get_top_rates1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "type": "object" +}
- Changed
get_transfer_bonuses1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "type": "object" +}
2 tool updates
- Added
get_card_downgrade_path - Added
get_cd_rollover_rules
5 tool updates
- Added
best_move_this_week - Added
get_card_changes - Added
get_card_offers - Added
get_reward_valuations - Added
get_transfer_bonuses
8 tool updates
- First observed
compare_switch_savings - First observed
get_bank_gap - First observed
get_bank_gap_index - First observed
get_index_dataset - First observed
get_rate_freshness - First observed
get_reality_score - First observed
get_top_hysa_rates - First observed
get_top_rates
Related MCP Connectors
Live US savings, CD, mortgage & HELOC rates with source + timestamp on every figure.
Live US mortgage, auto, HELOC, personal & deposit rates with evidence, plus who can join each lender
Public CD, money-market and Treasury records with data dates, source links and illustrative ladders.
Source-linked US credit-union deposit rates and membership context. Request a key via our site.
Related MCP Servers
- FlicenseNot gradedqualityCmaintenanceUS Macro Economic Intelligence MCP — 8 tools for Fed rates, inflation, yield curve, labor market, GDP via FRED. Part of ToolOracle.-
- AlicenseNot gradedqualityBmaintenance24 MCP tools for SEC financials, FRED economics, US Census demographics, and World Bank data via Streamable HTTP.MIT
- FlicenseNot gradedqualityBmaintenance24 free personal-finance and macro tools (mortgage, paycheck, tax, FRED, BLS) for LLM agents. Zero API keys, stdio transport, source-cited from IRS, Federal Reserve, BLS, Treasury, and Freddie Mac.-
- FlicenseNot gradedqualityDmaintenanceMacro economic intelligence MCP — 13 tools powered by 86 FRED series + ECB data covering Fed rates, inflation (CPI/PCE), yield curve, GDP, recession probability, and regime classification. Every response ES256K signed.1-
Glama MCP Gateway
Add one secure layer between your agents and this server.