Every answer this server returns carries the date it was verified, and how many days ago that was. Your agent applies its own freshness tolerance rather than trusting that a page is current.
That is the point of it. A list can tell you something was free at some point; it cannot tell you whether it is free now. Neither can this server — but it can tell you when it last looked, per row, and let you decide.
{
"mcpServers": {
"ai-deals-sentinel": {
"url": "https://ai-deals.rockpool.cc/mcp"
}
}
}
No API key, no signup, no account. The endpoint speaks JSON-RPC over HTTP POST.
They are not the same promise, and the difference is visible in one tool call:
| what it covers | how often | |
|---|---|---|
| Liveness | free, no-key public data APIs | measured daily — one read-only GET per API, recording HTTP status and latency |
| Offers | free tiers, trial credits, discounts | dated per row, re-verified on a rolling basis — not daily |
Both carry dates. Only liveness is daily. Every offer row exposes verified_at and verified_days_ago, so a row that has not been re-read recently says so instead of looking identical to one checked this morning.
**find_free_inference** — free tiers, trial credits and discounts on AI APIs, filterable by capability (inference, gpu, search, embeddings, vector-db, speech-vision, compute-sandbox, eval-observability) or by provider. Every row carries source_url and verified_at.
By default it returns only offers an agent can consume via API once a human has cleared signup. Pass agent_usable_only: false to see the rest — several well-known free GPU offers are notebook environments a script cannot drive, and that default excludes them rather than the catalog missing them.
**get_offer** — full detail for one provider's offer: the caveats, the access barrier, what the allowance actually covers, and where the claim came from.
**check_api_health** — today's measured liveness of free, no-key public data APIs: HTTP status and latency from one read-only GET each. Use counts.measured as the denominator, not counts.total; the difference is rows that were never called because they need a key.
Rows are sourced to the provider's own page, never to an aggregator, and each carries the URL the claim came from.
Tool responses quote third-party provider text verbatim — caveats and allowance descriptions are the providers' own words, reproduced so you can read what they actually said rather than a paraphrase.
Offers that ended are kept and marked rather than deleted, so an agent asking about a provider gets "this ended" instead of silence. An absent row and a retired row are different answers, and only one of them is useful.
free offer that exists.
expires_at is recorded where a provider states an end date, and set tounknown where an offer is time-limited but no date is published. Absence means no known expiry.
reported means a figure could not beestablished first-party — most often a provider documenting a benefit without publishing its quantum — and the row says so rather than repeating a number from elsewhere.