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 methods | get_portals_by_name / get_portals |
| Which stores offer cashback in a country | get_stores_by_country |
| Which countries are covered | get_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.
| Tool | Title | Parameters | Returns (structuredContent) |
|---|---|---|---|
get_cashback_rates_by_store_name | Cashback rates by store name | store_name (required), country_code | { stores: Store[] } with cashback_rates |
get_cashback_rates_by_store_id | Cashback rates by store ID | store_id (required) | { store: Store } with cashback_rates |
get_gift_cards_by_store_name | Gift card discounts by store name | store_name (required), country_code | { stores: StoreGiftCards[] } |
get_gift_cards_by_store_id | Gift card discounts by store ID | store_id (required) | { gift_cards: GiftCard[] } |
get_best_deals_by_brand | Best deals for a brand | brand_name (required), country_code | { matches: DealsMatch[] } (up to 5 brands) |
get_best_deals_by_category | Best deals for a category | category_name (required), country_code | { matches: DealsMatch[] } (up to 5 categories) |
get_stores_by_name | Search stores by name | store_name (required), country_code | { stores: Store[] } (identity only, no rates) |
get_stores_by_country | List stores in a country | country_code (required) | { stores: Store[] } (no rates; can be hundreds of stores) |
get_portals | List cashback portals | country_code | { portals: Portal[] } with payout terms |
get_portals_by_name | Search portals by name | portal_name (required), country_code | { portals: Portal[] } |
get_portal_by_id | Portal by ID | portal_id (required) | { portal: Portal } |
get_countries | Supported 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.
| Tool | Title | Parameters | Scope | Annotations |
|---|---|---|---|---|
get_my_profile | My profile | — | profile | read-only |
get_my_favorite_stores | My favorite stores | — | favorites | read-only |
toggle_favorite_store | Add or remove a favorite store | store_id, favorite (both required) | favorites | write, non-destructive |
get_my_alerts | My alerts | — | alerts | read-only |
set_store_alert | Set a store alert | store_id, alert_type, threshold_percent (all required) | alerts | write, non-destructive |
remove_store_alert | Remove a store alert | store_id, alert_type (both required) | alerts | write, 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 forget_stores_by_country). Lowercase ISO 3166-1 alpha-2:us,ca,de,au,fr, … The United Kingdom isgb, notuk. 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 theidfrom 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—cashbackorgift_card.threshold_percent— greater than 0 and at most 100 (10 means 10%).favorite—trueto add,falseto 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(percentorfixedamount),rate,upto(true = "up to X%", varies by category),location(onlineorin-store),url(tracked click-through that activates the cashback). - Gift card:
seller,type(Digital/Physical),value_type(1 = fixedvalue/price, 2 = rangesvalue_from…value_to/price_from…price_to),discount_percent(off face value),count,url(tracked purchase link). The store wrapper addsgift_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 bybest_cashback_rate.ratethenbest_gift_card_discount_percent, each withurlandgift_cards_url. - Country:
code(pass ascountry_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(andgift_cards_urlwhen 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 ownurl; 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_typeiscashback(the store's best cashback rate) orgift_card(the store's best gift card discount);threshold_percentis 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_alertsays 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 theAuthorizationheader). - 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_accessreceive 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_methodmay benone(public clients),client_secret_postorclient_secret_basic(confidential clients); the server metadata also listsprivate_key_jwt. Up to 10 redirect URIs:httpsURIs,httpon loopback hosts (localhost,127.0.0.1,[::1]) for local agents such as Claude Code, or private-use schemes such ascom.example.app:/callbackfor 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-Authenticatechallenge 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
| Scope | Grants |
|---|---|
profile | Read your GotCashback profile (name, email, avatar) |
favorites | Read and change your favorite stores |
alerts | Read, create and remove your cashback and gift card alerts |
offline_access | Refresh tokens so the connection stays signed in |
Endpoints
| URL | What it is |
|---|---|
| https://mcp.gotcashback.com | MCP endpoint: Streamable HTTP, JSON-RPC over POST, stateless (no session affinity needed) |
| https://mcp.gotcashback.com/.well-known/mcp/server-card.json | MCP server card: server, transport, capabilities and authentication (also served by www.gotcashback.com) |
| https://mcp.gotcashback.com/.well-known/oauth-protected-resource | OAuth protected resource metadata |
| https://www.gotcashback.com/.well-known/oauth-authorization-server | Authorization server metadata |
| https://www.gotcashback.com/connect/register | Dynamic client registration |
| https://mcp.gotcashback.com/health | Health check |
| https://www.gotcashback.com/auth.md | Agent authentication policy |
| https://www.gotcashback.com/llms.txt | Agent-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.comwith 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
- Human documentation: https://www.gotcashback.com/mcp-server/
- Changelog: CHANGELOG.md
- Cashback widget for websites: https://www.gotcashback.com/widget/
- Telegram bot: https://t.me/GotCashbackBot
- Privacy policy: https://www.gotcashback.com/Privacy/ · Terms: https://www.gotcashback.com/Terms/
- Support: support@gotcashback.com