GotCashback

Compare cashback rates across cashback portals and find discounted gift cards for stores in 30+ countries (hosted, streamable HTTP).

Documentation

GotCashback MCP server

Endpoint: https://mcp.gotcashback.com (Streamable HTTP) · Docs: https://www.gotcashback.com/mcp-server/ · Registry name: com.gotcashback/gotcashback · Version: 1.1.1

GotCashback is a cashback comparison service, not a cashback portal. It compares the current cashback rates published by 113 cashback portals across 42 countries (40 in the United States) for online and in-store retailers, and finds discounted gift cards from multiple sellers. Rates are refreshed several times a day. Founded in 2020; operated by MNP Enterprises, LLC.

The coverage numbers above are as of October 2026; the live figures are at https://api.gotcashback.com/v1/coverage and in the server card.

All comparison tools work without an account. Signing in with a GotCashback account (OAuth 2.1, dynamic client registration, PKCE) unlocks the account tools: profile, favorite stores, and cashback / gift card alerts.

Every store, cashback rate, gift card and portal sign-up bonus in a result carries a tracked GotCashback link (url, plus gift_cards_url where relevant). Cashback is only credited, gift card discounts only apply, and sign-up bonuses are only granted when the purchase starts from that link.

This repository holds the public metadata for the hosted server: server.json for the Official MCP Registry and this documentation. The server itself is closed-source and operated by GotCashback. See CHANGELOG.md for what changed.

Connect

Claude.ai / Claude Desktop — Settings → Connectors → Add custom connector → URL https://mcp.gotcashback.com. Enable it in a conversation; Claude calls the tools automatically. You are asked to sign in the first time you use an account tool.

Claude Code

claude mcp add --transport http gotcashback https://mcp.gotcashback.com

Run /mcp inside Claude Code to check the connection and to sign in for the account tools.

ChatGPT — Settings → Connectors → add a custom connector with the server URL https://mcp.gotcashback.com, authentication OAuth. Availability of custom connectors varies by plan.

VS Code (GitHub Copilot agent mode) — run MCP: Add Server from the command palette, or add to .vscode/mcp.json:

{
  "servers": {
    "gotcashback": {
      "type": "http",
      "url": "https://mcp.gotcashback.com"
    }
  }
}

Cursor, Windsurf and other clients — most accept a JSON entry pointing at the remote server (for Cursor: ~/.cursor/mcp.json):

{
  "mcpServers": {
    "gotcashback": {
      "url": "https://mcp.gotcashback.com"
    }
  }
}

Nothing is installed or hosted on your side: it is a remote server, and every user connects to the same URL.

Example prompts

  • "What's the best cashback rate for Best Buy right now?"
  • "Are there any discounted gift cards for Target?"
  • "What's the best cashback rate for Walmart in Canada?"
  • "Compare gift card discounts for Home Depot."
  • "Which cashback portals are available in the UK?"
  • "Where can I buy Adidas products with the best cashback?"
  • "Where can I buy dog food with the biggest discount?"
  • "Which UK cashback portals pay via PayPal, and which one has the lowest minimum payout?"
  • "Does TopCashback offer a sign-up bonus, and how often does it pay out?"
  • "Alert me when Nike's cashback rate reaches 10%." (account tool, prompts for sign-in)
  • "Add Best Buy to my favorite stores." (account tool, prompts for sign-in)

How an assistant picks a tool

The server's initialize instructions tell connected assistants which tool answers which question, so a plain question goes straight to the right lookup without any preliminary listing.

User asks…Tool
Cashback for a named store ("best cashback for Walmart", "Best Buy in-store cashback", "compare Expedia cashback portals")get_cashback_rates_by_store_name
Discounted gift cards for a named store ("best Gap gift card discount")get_gift_cards_by_store_name
Where to buy a brand's products with the most savings ("best cashback on Adidas products")get_best_deals_by_brand
Where to buy a type of product with the most savings ("cheapest dog food with cashback")get_best_deals_by_category
A portal's sign-up bonus, minimum payout, payment schedule or payout methodsget_portals_by_name / get_portals
Which stores offer cashback in a countryget_stores_by_country
Which countries are coveredget_countries
Favorites and alerts ("add Best Buy to my favorites", "alert me when Nike hits 10%")toggle_favorite_store / set_store_alert
User intent
 ├─ Cashback rates or gift card discounts?
 │    ├─ Cashback  ──► store name known? ──► get_cashback_rates_by_store_name
 │    │                store_id known?   ──► get_cashback_rates_by_store_id
 │    └─ Gift card ──► store name known? ──► get_gift_cards_by_store_name
 │                     store_id known?   ──► get_gift_cards_by_store_id
 ├─ A brand's products / a product category, not a store? ──► get_best_deals_by_brand / get_best_deals_by_category
 ├─ About a portal itself (bonus, payout, methods)?        ──► get_portals_by_name / get_portals
 ├─ Browse stores in a country?                            ──► get_stores_by_country
 └─ Country specified? ──► add country_code (lowercase ISO; 'gb' for the UK). Otherwise omit it.
                       ──► Return the offers, compare them, and show every tracked link.

The by-name tools search directly. Assistants should never call get_stores_by_name, get_stores_by_country or get_countries first to find a store or its id, and should use the *_by_store_id tools only when a store_id is already in hand from an earlier result.

Tools

The server exposes tools only (no resources or prompts). Every tool declares title, readOnlyHint, idempotentHint, destructiveHint and openWorldHint; the comparison tools also publish an outputSchema and return typed structuredContent.

Comparison tools (no sign-in)

All read-only, idempotent and anonymous.

ToolTitleParametersReturns (structuredContent)
get_cashback_rates_by_store_nameCashback rates by store namestore_name (required), country_code{ stores: Store[] } with cashback_rates
get_cashback_rates_by_store_idCashback rates by store IDstore_id (required){ store: Store } with cashback_rates
get_gift_cards_by_store_nameGift card discounts by store namestore_name (required), country_code{ stores: StoreGiftCards[] }
get_gift_cards_by_store_idGift card discounts by store IDstore_id (required){ gift_cards: GiftCard[] }
get_best_deals_by_brandBest deals for a brandbrand_name (required), country_code{ matches: DealsMatch[] } (up to 5 brands)
get_best_deals_by_categoryBest deals for a categorycategory_name (required), country_code{ matches: DealsMatch[] } (up to 5 categories)
get_stores_by_nameSearch stores by namestore_name (required), country_code{ stores: Store[] } (identity only, no rates)
get_stores_by_countryList stores in a countrycountry_code (required){ stores: Store[] } (no rates; can be hundreds of stores)
get_portalsList cashback portalscountry_code{ portals: Portal[] } with payout terms
get_portals_by_nameSearch portals by nameportal_name (required), country_code{ portals: Portal[] }
get_portal_by_idPortal by IDportal_id (required){ portal: Portal }
get_countriesSupported countries—{ countries: Country[] }

Account tools (OAuth 2.1 sign-in)

An anonymous call to any of these returns HTTP 401 with a WWW-Authenticate challenge pointing at /.well-known/oauth-protected-resource, which spec-compliant clients turn into a sign-in prompt. The comparison tools keep working without signing in.

ToolTitleParametersScopeAnnotations
get_my_profileMy profile—profileread-only
get_my_favorite_storesMy favorite stores—favoritesread-only
toggle_favorite_storeAdd or remove a favorite storestore_id, favorite (both required)favoriteswrite, non-destructive
get_my_alertsMy alerts—alertsread-only
set_store_alertSet a store alertstore_id, alert_type, threshold_percent (all required)alertswrite, non-destructive
remove_store_alertRemove a store alertstore_id, alert_type (both required)alertswrite, destructive

The reads return { profile: UserProfile }, { stores: FavoriteStore[] } and { alerts: Alert[] }; the writes return a confirmation sentence. alert_type is the same string on the way in and on the way out (cashback or gift_card), so a value read from get_my_alerts goes straight into set_store_alert or remove_store_alert.

Parameters

  • store_name — the retailer or brand name as a shopper says it: Walmart, Nike, Best Buy, Expedia. Case-insensitive match at word boundaries against store names and known alternate names, best match first. Plain name only (no "cashback", "gift card", or country words).
  • store_id — GotCashback's numeric id from any earlier result. Only for the *_by_store_id, favorite and alert tools.
  • country_code — optional (required only for get_stores_by_country). Lowercase ISO 3166-1 alpha-2: us, ca, de, au, fr, … The United Kingdom is gb, not uk. Omit it to search every supported country; the same retailer appears once per country with country-specific rates.
  • portal_name / portal_id — a portal name (Rakuten, TopCashback) or the id from a portal result.
  • brand_name / category_name — a product brand (Adidas) or category (dog food); multi-word phrases fall back to matching individual words.
  • alert_type — cashback or gift_card. threshold_percent — greater than 0 and at most 100 (10 means 10%). favorite — true to add, false to remove.

Response fields

Every property carries a description in the tool's outputSchema; the essentials:

  • Store: store_id, name, country_code, url (GotCashback store page), domain, has_gift_cards + gift_cards_url (by-country lists), cashback_rates[] (cashback tools).
  • Cashback rate: portal (who offers it), type (percent or fixedamount), rate, upto (true = "up to X%", varies by category), location (online or in-store), url (tracked click-through that activates the cashback).
  • Gift card: seller, type (Digital / Physical), value_type (1 = fixed value/price, 2 = ranges value_from…value_to / price_from…price_to), discount_percent (off face value), count, url (tracked purchase link). The store wrapper adds gift_cards_url.
  • Portal: id, name, country_code, url, sign_up_bonus { amount, url }, minimum_payout + minimum_payout_currency, payment_frequency, payment_methods[].
  • Deals: name (matched brand/category), stores[] ranked by best_cashback_rate.rate then best_gift_card_discount_percent, each with url and gift_cards_url.
  • Country: code (pass as country_code), name, localized_name.
  • Alert: alert_id, store_id, store_name, country_code + country_name, alert_type (cashback / gift_card), threshold_percent, active, created_on, last_notified_on + last_notified_value (absent until the alert first fires).
  • Favorite store: store_id, name, country_code, country_name.
  • User profile: user_id, first_name, email, avatar.

The comparison tools carry the API's raw JSON in their text block and the same data, wrapped in the object above, as structuredContent. A lookup by an unknown id returns an isError result ("Store with id N not found."); an API outage returns an isError result asking the client to retry with the same arguments; an empty search is a normal result with an empty list.

Tracked links and presentation rules

The initialize response carries instructions that clients inject into the model's context:

  • List every returned portal's rate, not only the best one, as a table with the portal, rate, online/in-store and a link column, then call out the best online and the best in-store rate. Do the same for gift cards (every seller).
  • Always show each result's url (and gift_cards_url when present) as a clickable link. These are tracked GotCashback redirects; cashback and gift card discounts are only credited when the user clicks through them. Never show rates, stores or gift card prices without their links.
  • Use the portal's payout terms (sign_up_bonus, minimum_payout, payment_frequency, payment_methods) to answer how and when a portal pays, and link a sign-up bonus through its own url; the bonus is only credited via that link.

If an assistant quotes a rate without a link, ask it for the link.

Alerts

Alerts are the same ones you manage under Account → Alerts on the website.

  • alert_type is cashback (the store's best cashback rate) or gift_card (the store's best gift card discount); threshold_percent is greater than 0 and at most 100.
  • A cashback alert fires on the store's best flat rate from a cash-paying portal: "up to" tiered rates and airline-miles, credit-card and points portals are ignored, so the threshold is one you can actually earn.
  • Re-saving an existing alert updates its threshold and re-arms it.
  • Each account can have at most 10 active alerts; set_store_alert says so when the limit is reached.
  • Notifications are sent by email.

Authentication

  • Protected resource metadata: https://mcp.gotcashback.com/.well-known/oauth-protected-resource (scopes profile, favorites, alerts, offline_access; bearer tokens in the Authorization header).
  • Authorization server: https://www.gotcashback.com/ — metadata at https://www.gotcashback.com/.well-known/oauth-authorization-server (also served as /.well-known/openid-configuration).
  • Flow: authorization code with PKCE (S256 required) plus refresh tokens. Clients that request offline_access receive refresh tokens, so the connection stays signed in. Access tokens are valid for 30 days and refresh tokens for 90 days.
  • Dynamic client registration (RFC 7591): POST https://www.gotcashback.com/connect/register, anonymous and rate-limited. token_endpoint_auth_method may be none (public clients), client_secret_post or client_secret_basic (confidential clients); the server metadata also lists private_key_jwt. Up to 10 redirect URIs: https URIs, http on loopback hosts (localhost, 127.0.0.1, [::1]) for local agents such as Claude Code, or private-use schemes such as com.example.app:/callback for native apps. Every registered client is granted all scopes.
  • End-user sign-in is GotCashback's own social login, the same as on the website. No registration or API key is needed for the comparison tools.
  • Calling an account tool without a bearer token returns HTTP 401 with a WWW-Authenticate challenge that references the protected resource metadata; clients open the sign-in page, the user approves the requested scopes, and the tool call completes.
  • To disconnect, remove the connector from your client. If a tool later reports a missing scope, remove and re-add the connector so the client requests authorization afresh.
  • Policy for agents: https://www.gotcashback.com/auth.md
ScopeGrants
profileRead your GotCashback profile (name, email, avatar)
favoritesRead and change your favorite stores
alertsRead, create and remove your cashback and gift card alerts
offline_accessRefresh tokens so the connection stays signed in

Endpoints

URLWhat it is
https://mcp.gotcashback.comMCP endpoint: Streamable HTTP, JSON-RPC over POST, stateless (no session affinity needed)
https://mcp.gotcashback.com/.well-known/mcp/server-card.jsonMCP server card: server, transport, capabilities and authentication (also served by www.gotcashback.com)
https://mcp.gotcashback.com/.well-known/oauth-protected-resourceOAuth protected resource metadata
https://www.gotcashback.com/.well-known/oauth-authorization-serverAuthorization server metadata
https://www.gotcashback.com/connect/registerDynamic client registration
https://mcp.gotcashback.com/healthHealth check
https://www.gotcashback.com/auth.mdAgent authentication policy
https://www.gotcashback.com/llms.txtAgent-readable site index (every store, gift card, brand, category and portal page has a Markdown mirror)
https://api.gotcashback.com/swagger/The free REST API behind the tools (OpenAPI, no key required)

CORS is open to any origin, so browser-based agents can connect directly; the Mcp-Session-Id and WWW-Authenticate response headers are exposed.

List the tools without a client:

curl -s -X POST https://mcp.gotcashback.com/ \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

Troubleshooting

  • If a connection fails, check that the URL is exactly https://mcp.gotcashback.com with no trailing path.
  • If an account tool keeps asking you to sign in, remove and re-add the connector.
  • Rates are refreshed by scheduled jobs several times a day, not in real time; treat any rate older than a day as stale and ask again.

Links