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.
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.
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.
https://mcp.skimguard.io/mcp
2. Or add it to a config file (Claude Desktop, Claude Code, Cursor)
| Client | Config 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 clients | Any file with an mcpServers block |
{ "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": { "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.
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.
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"}}}'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"}}}'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.
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.
| Tool | Tier | What it does | Key parameters |
|---|---|---|---|
| Public: free, no key, 30 requests a minute. Every tier keeps these. | |||
| skimguard_ | Public | Find 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_ | Public | Status 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_ | Public | Public 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_ | Public | Places 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_ | Public | Turns 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_ | Public | Network-wide totals for a time window: checks, suspicious finds, places and states covered. | days |
| skimguard_ | Public | SkimGuard'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_ | Business | Check coverage across your locations: counts, suspicious finds and last check for each. | days, limit |
| skimguard_ | Business | Which 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_ | Business | Whether 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_ | Business | Every 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_ | Partner | Check volume for the stores credited to your partner account: counts, locations covered, last activity. | days, limit |
| skimguard_ | Partner | Your 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_ | Data Licensee | Skimmer 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_ | Data Licensee | Trends 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.
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.
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.
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.
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.