Skip to main content
Glama

SwitchWize MCP

Best Move This Week

best_move_this_week
Read-onlyIdempotent

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.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
walletYesCard ids the user holds, in the form issuer:slug, e.g. ["chase:sapphire-preferred", "amex:gold-card"].
categoriesNoOptional spend categories to rank held cards for; defaults to all nine.
usedBenefitsNoOptional log of period credits already used this month; excluded from picks and counted toward renewal value. Omit to treat every credit as unused.
savingsBalanceNoOptional cash balance, to include the savings-rate move beside the card moves.
currentSavingsApyNoOptional current savings APY, used with savingsBalance.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
asOfNoISO timestamp of the underlying data this response reflects.
toolYes
errorNo
cardMovesNo
attributionNo
generatedAtYesISO timestamp this response was computed at.
savingsMoveNo
verified_atNo
unheldOffersNo
schemaVersionYes
methodologyUrlNo
freshnessStatusNo
transferBonusesNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • addedOutput schema / properties / error / properties / retryable
      Added value: +{
      +  "type": "boolean"
      +}
  2. Changed2 schema fields changed
    • addedOutput schema / properties
      Added 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"
      +    ]
      +  }
      +}
    • addedOutput schema / required
      Added value: +[
      +  "schemaVersion",
      +  "tool",
      +  "generatedAt"
      +]
  3. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "additionalProperties": true,
      +  "type": "object"
      +}
  4. Added

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds meaningful behavioral context: it ranks actions, treats welcome offers as 'at a 12-month high on cards not held,' and clarifies that the savings move is optional. It does not detail output shape, but an output schema exists, so that burden is reduced.

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

Conciseness5/5

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

A single, dense sentence that front-loads the core action ('rank this week's dollar-valued actions') and then lists the covered categories in order of importance. No filler, no repetition of schema details, and every clause earns its place.

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

Completeness4/5

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

For a complex aggregator with 5 parameters and an output schema, the description covers the main decision dimensions: which card to use per category, welcome offers, transfer bonuses, and optional savings. It does not explicitly mention that usedBenefits is for renewal-value tracking, but the schema covers that. The only notable omission is not stating that the tool is read-only and safe to call repeatedly, though annotations already convey that.

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

Parameters3/5

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 all five parameters thoroughly. The description adds the semantic link that savingsBalance and currentSavingsApy together enable the optional savings-rate move, and that usedBenefits affects renewal value. This is useful but modest; the schema carries most of the weight, so baseline 3 is appropriate.

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

Purpose5/5

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

The description names a specific verb ('rank'), a specific resource ('this week's dollar-valued actions'), and enumerates the exact action types covered (held-card category picks, welcome offers, transfer bonuses, savings-rate move). It clearly distinguishes itself from siblings like get_card_offers or get_transfer_bonuses, which are narrower data-retrieval tools.

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

Usage Guidelines4/5

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

The description implies the tool is the weekly decision aggregator: it combines card usage, welcome offers, transfer bonuses, and optionally savings. It does not explicitly state when NOT to use it or name alternatives, but the sibling list and the description's scope make the use case clear. A small gap: no explicit exclusion like 'for a single card's offers, use get_card_offers instead.'

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.