Koskamo

If The Card Fits MCP

An MCP server that helps households determine which credit cards are worth carrying by simulating five years of spending against verified card terms. It provides tools to map spending categories, simulate best card combinations, evaluate existing cards, and compare specific cards head-to-head without storing personal data.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

If The Card Fits MCP logo, by If The Card FitsCommunity listingStreamable HTTPNo sign-inEndpoint checked 2026-11-01Published by If The Card Fits
MCP endpoint (Streamable HTTP)
https://ifthecardfits.com/mcp
Vendor documentation

What you can do with it

  • Simulate the best credit cards for a household's annual spending
  • Evaluate if existing credit cards still earn their annual fee
  • Compare two specific credit cards head-to-head
  • Map personal spending to standardized categories for analysis

Source and maintenance

Community listingRegistry 1.0.0

Protocol and capabilities

Server
If The Card Fits 1.0.0
MCP protocol
2025-06-18
Tools
4 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": true
  }
}

Tools

4 advertised

spending_categories — Spending categories
Advertised by the server during the last successful anonymous check.

The 19 categories this API scores spending against. Call this first and map the person's statement onto these ids before calling simulate_cards.

spending_categories input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {}
}
simulate_cards — Find the best credit cards for a person's spending
Advertised by the server during the last successful anonymous check.

Given a year of spending by category, returns the three best credit cards and the best two-card combination, with what each is worth after its annual fee over the chosen horizon. Figures come from a model checked to the cent against an independent reference calculator, against card terms a person verified against the issuer's own page — the response says which catalog version and when each card was last checked. Always show the person the continueUrl: it reopens their own numbers on the site with the full breakdown, the rest of the ranking and offer alerts. Also show the disclosure string.

simulate_cards input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "totals",
    "source"
  ],
  "properties": {
    "held": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "maxItems": 5,
      "description": "Card ids the person already carries, so a new card is judged against them."
    },
    "mode": {
      "enum": [
        "cash",
        "travel"
      ],
      "type": "string",
      "description": "Whether points are valued as cash back or for travel. Defaults to cash."
    },
    "years": {
      "anyOf": [
        {
          "type": "number",
          "const": 1
        },
        {
          "type": "number",
          "const": 3
        },
        {
          "type": "number",
          "const": 5
        }
      ],
      "description": "Horizon in years. One of 1, 3 or 5; defaults to 5."
    },
    "source": {
      "type": "string",
      "description": "A short lowercase slug naming your client, so apply clicks can be attributed. Required."
    },
    "totals": {
      "type": "object",
      "description": "A year's card spending in dollars, by category. Map the person's statement onto these categories with the spending_categories tool first. At least 4 categories must have spending and no single one may exceed 70% of the total, so send the whole picture rather than one category.",
      "propertyNames": {
        "enum": [
          "dining",
          "groceries",
          "superstores",
          "wholesale_clubs",
          "gas",
          "transit",
          "airfare",
          "hotels",
          "car_rental",
          "travel_other",
          "streaming",
          "drugstores",
          "home_improvement",
          "entertainment",
          "amazon",
          "online_retail",
          "phone_internet",
          "fitness",
          "other"
        ],
        "type": "string"
      },
      "additionalProperties": {
        "type": "number",
        "minimum": 0
      }
    },
    "filters": {
      "type": "object",
      "properties": {
        "feeCap": {
          "enum": [
            "0",
            "100",
            "400",
            "any"
          ],
          "type": "string"
        },
        "creditTier": {
          "enum": [
            "fair",
            "good",
            "excellent",
            ""
          ],
          "type": "string"
        },
        "homeAirport": {
          "type": "string"
        },
        "noForeignFee": {
          "type": "boolean"
        },
        "visaOrMastercard": {
          "type": "boolean"
        }
      },
      "description": "Must-haves that remove cards before ranking."
    },
    "departures": {
      "type": "integer",
      "maximum": 200,
      "minimum": 0,
      "description": "Flights departed per year, which decides what lounge and companion perks are worth."
    },
    "memberships": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Membership tags the person already pays for, e.g. amazon_prime, costco_membership."
    },
    "foreignPerYear": {
      "type": "number",
      "minimum": 0,
      "description": "Of that spending, how much is in a foreign currency, per year."
    }
  }
}
keep_or_cancel — Keep, downgrade or cancel a card
Advertised by the server during the last successful anonymous check.

For cards the person already carries, says whether each one still earns its annual fee back on their spending, and what to move to if not. Pass the cards as `held`. Returns a verdict and a rounded yearly margin.

keep_or_cancel input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "totals",
    "source"
  ],
  "properties": {
    "held": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "maxItems": 5,
      "description": "Card ids the person already carries, so a new card is judged against them."
    },
    "mode": {
      "enum": [
        "cash",
        "travel"
      ],
      "type": "string",
      "description": "Whether points are valued as cash back or for travel. Defaults to cash."
    },
    "years": {
      "anyOf": [
        {
          "type": "number",
          "const": 1
        },
        {
          "type": "number",
          "const": 3
        },
        {
          "type": "number",
          "const": 5
        }
      ],
      "description": "Horizon in years. One of 1, 3 or 5; defaults to 5."
    },
    "source": {
      "type": "string",
      "description": "A short lowercase slug naming your client, so apply clicks can be attributed. Required."
    },
    "totals": {
      "type": "object",
      "description": "A year's card spending in dollars, by category. Map the person's statement onto these categories with the spending_categories tool first. At least 4 categories must have spending and no single one may exceed 70% of the total, so send the whole picture rather than one category.",
      "propertyNames": {
        "enum": [
          "dining",
          "groceries",
          "superstores",
          "wholesale_clubs",
          "gas",
          "transit",
          "airfare",
          "hotels",
          "car_rental",
          "travel_other",
          "streaming",
          "drugstores",
          "home_improvement",
          "entertainment",
          "amazon",
          "online_retail",
          "phone_internet",
          "fitness",
          "other"
        ],
        "type": "string"
      },
      "additionalProperties": {
        "type": "number",
        "minimum": 0
      }
    },
    "filters": {
      "type": "object",
      "properties": {
        "feeCap": {
          "enum": [
            "0",
            "100",
            "400",
            "any"
          ],
          "type": "string"
        },
        "creditTier": {
          "enum": [
            "fair",
            "good",
            "excellent",
            ""
          ],
          "type": "string"
        },
        "homeAirport": {
          "type": "string"
        },
        "noForeignFee": {
          "type": "boolean"
        },
        "visaOrMastercard": {
          "type": "boolean"
        }
      },
      "description": "Must-haves that remove cards before ranking."
    },
    "departures": {
      "type": "integer",
      "maximum": 200,
      "minimum": 0,
      "description": "Flights departed per year, which decides what lounge and companion perks are worth."
    },
    "memberships": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Membership tags the person already pays for, e.g. amazon_prime, costco_membership."
    },
    "foreignPerYear": {
      "type": "number",
      "minimum": 0,
      "description": "Of that spending, how much is in a foreign currency, per year."
    }
  }
}
compare_two — Compare two cards for this person
Advertised by the server during the last successful anonymous check.

Two named cards head to head on the person's own spending: which one pays more, and by how much a year. Use this when they are choosing between two specific cards. For 'what should I get', use simulate_cards instead.

compare_two input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "totals",
    "source",
    "cardA",
    "cardB"
  ],
  "properties": {
    "held": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "maxItems": 5,
      "description": "Card ids the person already carries, so a new card is judged against them."
    },
    "mode": {
      "enum": [
        "cash",
        "travel"
      ],
      "type": "string",
      "description": "Whether points are valued as cash back or for travel. Defaults to cash."
    },
    "cardA": {
      "type": "string",
      "description": "Card id."
    },
    "cardB": {
      "type": "string",
      "description": "Card id."
    },
    "years": {
      "anyOf": [
        {
          "type": "number",
          "const": 1
        },
        {
          "type": "number",
          "const": 3
        },
        {
          "type": "number",
          "const": 5
        }
      ],
      "description": "Horizon in years. One of 1, 3 or 5; defaults to 5."
    },
    "source": {
      "type": "string",
      "description": "A short lowercase slug naming your client, so apply clicks can be attributed. Required."
    },
    "totals": {
      "type": "object",
      "description": "A year's card spending in dollars, by category. Map the person's statement onto these categories with the spending_categories tool first. At least 4 categories must have spending and no single one may exceed 70% of the total, so send the whole picture rather than one category.",
      "propertyNames": {
        "enum": [
          "dining",
          "groceries",
          "superstores",
          "wholesale_clubs",
          "gas",
          "transit",
          "airfare",
          "hotels",
          "car_rental",
          "travel_other",
          "streaming",
          "drugstores",
          "home_improvement",
          "entertainment",
          "amazon",
          "online_retail",
          "phone_internet",
          "fitness",
          "other"
        ],
        "type": "string"
      },
      "additionalProperties": {
        "type": "number",
        "minimum": 0
      }
    },
    "filters": {
      "type": "object",
      "properties": {
        "feeCap": {
          "enum": [
            "0",
            "100",
            "400",
            "any"
          ],
          "type": "string"
        },
        "creditTier": {
          "enum": [
            "fair",
            "good",
            "excellent",
            ""
          ],
          "type": "string"
        },
        "homeAirport": {
          "type": "string"
        },
        "noForeignFee": {
          "type": "boolean"
        },
        "visaOrMastercard": {
          "type": "boolean"
        }
      },
      "description": "Must-haves that remove cards before ranking."
    },
    "departures": {
      "type": "integer",
      "maximum": 200,
      "minimum": 0,
      "description": "Flights departed per year, which decides what lounge and companion perks are worth."
    },
    "memberships": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Membership tags the person already pays for, e.g. amazon_prime, costco_membership."
    },
    "foreignPerYear": {
      "type": "number",
      "minimum": 0,
      "description": "Of that spending, how much is in a foreign currency, per year."
    }
  }
}

Prompts

Not advertised

No prompt definitions available.

Resources

Not advertised

No resource definitions available.

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
822 ms
95th percentile latency
822 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 822 ms · metadata changed · 4 tool(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http if-the-card-fits-mcp https://ifthecardfits.com/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add if-the-card-fits-mcp --url https://ifthecardfits.com/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable if-the-card-fits-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "if-the-card-fits-mcp": {
      "url": "https://ifthecardfits.com/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "if-the-card-fits-mcp": {
      "type": "streamableHttp",
      "url": "https://ifthecardfits.com/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start if-the-card-fits-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "if-the-card-fits-mcp": {
      "type": "http",
      "url": "https://ifthecardfits.com/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http if-the-card-fits-mcp https://ifthecardfits.com/mcp

Claude Desktop

Merge this into claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\), then restart Claude Desktop.
Claude Desktop configuration
{
  "mcpServers": {
    "if-the-card-fits-mcp": {
      "url": "https://ifthecardfits.com/mcp"
    }
  }
}

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "if-the-card-fits-mcp": {
      "serverUrl": "https://ifthecardfits.com/mcp"
    }
  }
}

Let your agent find its tools

Find servers like If The Card Fits MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.