Home / MCP API

SkimGuard MCP server · for developers

Card-skimmer data, answerable by any AI.

SkimGuard runs a Model Context Protocol server. Point Claude, ChatGPT, Grok or any MCP client at it, and your assistant can answer "is the Shell on Riverside safe to pay at?" from real check data instead of guessing. Search by place name; no Google Place ID needed.

Run the quick testSee the tools

POST https://mcp.skimguard.io/mcp · No key for the public tier · Read-only · Streamable HTTP

What it is

One address. Every MCP client.

MCP is the open standard for giving an AI assistant real tools. SkimGuard's server offers our check data as tools an assistant can call mid-conversation: status for a place by name or Place ID, nearby activity, risk on the road ahead, Bluetooth manufacturer lookup, and network-wide totals. It's one stateless HTTPS address, with nothing to install or run yourself.

Free public tier

The safety lookups need no key at all. Anonymous callers get 30 requests a minute against the same live data everything else uses.

Read-only

No tool changes anything you or your users own. One small exception on our side: asking about a Place ID we've never seen adds it to our own list of public places, so future checks near it attach to it. You still get a plain "no data" answer.

Private by design

Checks at homes are never published. Every public lookup is checked against our list of public places first, so a home address can't be pulled out.

Tiers enforced by design

Every tool is listed, but tools above your tier are locked. Calling one returns 401 when you're anonymous (so a hosted assistant can offer to sign you in) or 403 insufficient_scope when your tier is too low. Never data.

⚠️
SkimGuard finds skimmers that send a wireless signal. A clear result is not a guarantee. Every tool returns that note with its answer, so assistants repeat it too.

Quick test

Try it now, with no sign-up.

Paste the address into your MCP client, or run the curl calls below. The public tier needs no key, so both work on a machine that has never heard of SkimGuard.

1. Add it by address (Claude, ChatGPT and other hosted assistants)

Open your assistant's connectors or MCP settings, add a custom or remote server, and paste this address. Leave authentication set to none. If asked for a transport, pick HTTP or Streamable HTTP, not SSE or stdio.

Server address
https://mcp.skimguard.io/mcp
🔑
Paid tiers in hosted assistants: just sign in. Hosted connectors can't send a custom header, and they don't need to: SkimGuard supports OAuth 2.1. Ask for something from your own account ("how are my locations doing?"), approve the sign-in, and your Business, Partner or Data Licensee tools appear. The free tools keep working either way. Clients that support headers (Claude Desktop, Claude Code, Cursor) can use an X-MCP-Key instead.

2. Or add it to a config file (Claude Desktop, Claude Code, Cursor)

ClientConfig file
Claude Desktop · macOS~/Library/Application Support/Claude/claude_desktop_config.json
Claude Desktop · Windows%APPDATA%\Claude\claude_desktop_config.json
Claude Desktop · Linux~/.config/Claude/claude_desktop_config.json
Claude Code.mcp.json in the project root (or claude mcp add)
Cursor.cursor/mcp.json in the project, or ~/.cursor/mcp.json for all projects
Other MCP clientsAny file with an mcpServers block
mcpServers config · no key
{ "mcpServers": { "skimguard": { "url": "https://mcp.skimguard.io/mcp" } } }

Have a paid key? Add it as a header. The server also accepts a Firebase ID token as Authorization: Bearer <token> when you call from a signed-in SkimGuard portal session.

mcpServers config · with a key
{ "mcpServers": { "skimguard": { "url": "https://mcp.skimguard.io/mcp", "headers": { "X-MCP-Key": "YOUR_KEY_HERE" } } } }

3. Or just curl it

The server speaks JSON-RPC 2.0 over MCP Streamable HTTP. It's stateless, so there's no initialize step. The Accept header must list both application/json and text/event-stream, or you'll get a 406.

List the tools you can use
curl -s https://mcp.skimguard.io/mcp \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

Start here: skimguard_search_locations needs only a place name. It finds the place and reports its status in one call. Adding latitude and longitude is optional but gives much better matches for common brand names.

Find a place by name
curl -s https://mcp.skimguard.io/mcp \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{
    "name":"skimguard_search_locations",
    "arguments":{"query":"Shell gas station Riverside Austin TX",
      "latitude":30.2453,"longitude":-97.7431,
      "limit":5,"days":30,"response_format":"markdown"}}}'
Network-wide totals for the last 30 days
curl -s https://mcp.skimguard.io/mcp \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -d '{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{
    "name":"skimguard_coverage_stats",
    "arguments":{"days":30,"response_format":"markdown"}}}'
Status for one place, by Google Place ID
curl -s https://mcp.skimguard.io/mcp \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -d '{"jsonrpc":"2.0","id":4,"method":"tools/call","params":{
    "name":"skimguard_get_location_status",
    "arguments":{"placeId":"ChIJN1t_tDeuEmsRUsoyG83frY4",
      "days":30,"response_format":"json"}}}'

Swap in a Place ID you care about. If SkimGuard has no data yet, you get a plain "no data" answer, which means unknown, not unsafe. Homes are left out of public data on purpose and always answer that way.

Health check
curl -s https://mcp.skimguard.io/health

What it supports

Fifteen tools, one resource, one prompt.

Seven public tools, then four more for Business, two for Partner and two for Data Licensee. Every tool takes an optional response_format of markdown (default) or json, and every tool with a time window takes days (1 to 365, default 30). All fifteen are read-only.

ToolTierWhat it doesKey parameters
Public: free, no key, 30 requests a minute. Every tier keeps these.
skimguard_search_locationsPublicFind a place by name or address and get its SkimGuard status in the same call. Use this when you have a name, not a Place ID. A place with no data is reported as unknown, never as unsafe.query (required, 3 to 120 chars), latitude + longitude (optional, much better matches for common brand names), limit (1 to 8, default 5), days
skimguard_get_location_statusPublicStatus for one place by Google Place ID: when it was last checked, how many checks, and whether anything suspicious was seen.placeId (required), days
skimguard_find_nearby_activityPublicPublic places near a point that were checked recently, with counts of suspicious finds.latitude, longitude, radius_meters (50 to 50,000, default 2,000), days, limit
skimguard_route_riskPublicPlaces with recent suspicious finds or old checks along the road ahead. It looks at most 20 km ahead, not the whole trip, and says how far it checked. Pass real route geometry; two points make a straight line, not a road.polyline (required, 2 to 100 ordered points, start first), corridor_meters (10 to 200, default 50), lookahead_meters (100 to 20,000, default 5,000)
skimguard_lookup_bluetooth_manufacturerPublicTurns a Bluetooth SIG company ID into a manufacturer name and SkimGuard risk rating, so you know what a device seen in a check is.company_code (decimal or 0x hex)
skimguard_coverage_statsPublicNetwork-wide totals for a time window: checks, suspicious finds, places and states covered.days
skimguard_aboutPublicSkimGuard's own description of how detection works and its limits. Call it before answering general questions so the answer is current.none
Business: paid, 120 requests a minute. Only your own locations and devices.
skimguard_my_locationsBusinessCheck coverage across your locations: counts, suspicious finds and last check for each.days, limit
skimguard_my_stale_locationsBusinessWhich of your locations are overdue for a check, worst first, never-checked at the top, with how long it has been.stale_after_hours (1 to 8,760, default 72), limit
skimguard_my_scanner_healthBusinessWhether your always-on connections and enrolled phones are online, when each last reported, and its last result. A quiet connection makes a store look covered when it isn't.offline_after_minutes (5 to 1,440, default 60), limit
skimguard_location_devicesBusinessEvery device seen at one of your locations, grouped by name, manufacturer and Bluetooth type, with counts, signal strength and which rule matched. The Place ID must be one of yours.place_id (required, one of yours), suspicious_only (default false), days, limit
Partner: paid, 120 requests a minute. Only your own partner account.
skimguard_my_merchantsPartnerCheck volume for the stores credited to your partner account: counts, locations covered, last activity.days, limit
skimguard_my_earningsPartnerYour commission totals (pending, paid, voided), recent rows, stores whose subscription lapsed, and first of all whether your payouts are blocked. Commission only moves once Stripe has verified your bank and business details.days, limit
Data Licensee: paid, 300 requests a minute. Totals only; also gets Business and Partner tools for its own IDs.
skimguard_regional_riskData LicenseeSkimmer risk by US state, ranked by suspicious finds. Totals only, with no place, business or user IDs. States with under 5 checks in the window are hidden.days, limit
skimguard_device_prevalenceData LicenseeTrends across every device SkimGuard has seen: the Bluetooth type mix and top manufacturers, by volume and by suspicious rate. Groups with under 5 sightings are hidden.days, limit

Tools for your own data filter on the account behind your key, never on what you type, so there's no way to ask for another account's data. The one tool that takes a Place ID, skimguard_location_devices, checks it's yours first. Business and Partner are separate: a store never sees partner tools and the other way round.

Resource

skimguard://about

SkimGuard's own description as a readable resource, so a client can ground itself without a tool call.

Prompt

check_location_safety

A ready-made prompt for the main question, including the instruction to always repeat the "transmitting skimmers only" note.

Rate limits

Per account

30 a minute public, 120 Business and Partner, 300 Data Licensee. Over the limit returns 429 with Retry-After.

Access

Start free. Add a key when you need your own data.

Paid tiers don't unlock more public data. They add tools for data that's yours, and a higher rate limit. Every tier keeps all seven public tools.

No key

Public

Free, and kept out from behind a paywall on purpose. All seven public tools, the resource and the prompt. 30 requests a minute. No account, no key, no cost.

Use it now →

Paid · sign in or key

Business

For stores using SkimGuard. Adds four tools: coverage across your locations, what's overdue, whether your connections are online, and every device seen at a location. 120 requests a minute. Subscribe and create your key in the business portal.

Business portal → Settings → MCP API

Paid · sign in or key

Partner

For SkimGuard partners. Adds two tools: check volume for your stores, and your earnings, lapsed stores and anything holding up payout. 120 requests a minute. Create your key in the partner portal.

Partner portal → MCP

Paid · sign in or key

Data Licensee

For data licensing customers. Adds two tools: risk by state and device trends. Also gets Business and Partner tools for its own IDs. 300 requests a minute. Needs a data licensing agreement.

Start a licensing conversation →

Prices are shown at checkout. Each paid tier is a Stripe subscription you start from your portal. Yearly billing is ten times the monthly price, so two months are free. Cancelling turns off every key that subscription created; the public tools keep working. A key is shown once when it's created and only a hash is stored, so keep it somewhere safe or create a new one.

Ground rules

What the data will and won't tell you.

The tools are built to keep an assistant honest. If you're building on SkimGuard, design around these.

Not a safety guarantee

SkimGuard finds skimmers that send a wireless signal. A skimmer that doesn't is invisible to it, so "clear" means "nothing found", not "safe". Every answer says so.

Homes stay private

Checks at homes are never published. Public tools check the list of public places first.

Totals, not identities

Public and licensee tools return counts, results and times. Never user IDs, report photos or device IDs. Thin regional numbers are hidden.

iPhones hear less

SkimGuard listens to both kinds of Bluetooth today and adds more over time. Apple only lets iPhone apps hear one kind, so iPhone checks miss some older skimmers. Worth saying when you summarize a result.

Route risk looks ahead, not the whole trip

It checks at most 20 km per call and says how far it got. To check a whole drive, split it into 20 km pieces, call once per piece, and report only what you checked. A 500 km trip is about 25 calls, inside the free limit if you pace it.

A miss grows the map

Ask about a Place ID we've never seen and we register it, so the next check near it attaches to a stable place. You still get "no data": unknown, not unsafe.

If your assistant cites SkimGuard, it should cite the note too. That's the difference between a useful safety signal and false comfort.

Higher volume

Building on top of SkimGuard?

Need more than the published limits, a custom set of fields, or bulk delivery instead of per-call lookups? That's a data licensing conversation, not an MCP subscription, and we'll point you to whichever fits.

  • Custom rate limits and dedicated capacity
  • Bulk exports and regular feeds
  • Terms for redistribution or building it into your product

Get in touch

Questions about the MCP API?

Integration questions, higher limits, or a tool you wish existed. Tell us what you're building and we'll reply within 2 business days.

Or email hello@skimguard.io.