Pari-mutuel odds aren't fixed by a bookmaker — they float with the betting pool right up to post time. When real money lands on a horse, its price shortens fast. That's the kind of signal a human tracks by refreshing a page every few minutes. It's also exactly the kind of thing you can now just hand to an AI agent.
The setup: one shared door into thousands of scrapers
Apify hosts an MCP (Model Context Protocol) server at mcp.apify.com that exposes every Actor on the Apify Store — 72,000+ ready-made scrapers and automations — as tools an AI agent can call directly. You don't install anything per-tool. You connect once, and the agent can search the Store, read an Actor's input schema, and run it, all inside the conversation.
Connecting Claude Code (or any MCP-compatible client — Claude.ai, Cursor, VS Code) is a two-line config:
{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com",
"headers": { "Authorization": "Bearer <APIFY_TOKEN>" }
}
}
}
(Token lives in Console → API & Integrations. OAuth works too if you're in Claude Desktop and don't want to paste a token.)
What that actually looks like
Once connected, you don't pick a tool from a dropdown — you just ask for what you want:
"Check if any horse is steaming right now at Chantilly or Vincennes."
The agent searches the Store, finds 0xgollum/horse-racing-pulse, reads its input schema, and calls it with sensible defaults — no manual mapping of parameters, no separate API client to write.
Horse Racing Pulse polls PMU's public JSON API (no key, no proxy — France's official pari-mutuel operator exposes this for its own apps) for every race still open to betting, and compares implied probability between polls:
{
"type": "signal",
"signal": "steamer",
"hippodrome": "CHANTILLY",
"race_name": "LE ROI SOLEIL",
"horse_num": 4,
"horse_name": "INGEBORG",
"prob_change_pct": 6.8,
"current_cote": 5.2,
"current_prob_pct": 19.2,
"previous_prob_pct": 12.4,
"message": "INGEBORG (#4) at CHANTILLY R1C8: odds shortened to 5.2 (12.4% -> 19.2% implied) — money coming in fast."
}
A steamer means money is landing on that horse fast. A drifter is the opposite — confidence draining, price lengthening. Feed that into a conversation and the agent can reason over it in plain language instead of you parsing JSON by hand — the row carries race context (discipline, category, distance, going) alongside the signal, so "which steamers today are in handicaps with 12+ runners?" is a filter the agent can just apply.
Why this matters more than the specific example
The interesting part isn't really horse racing. It's that discovery changed. Before MCP, using a niche scraper meant knowing it existed, reading docs, writing integration code. Now the entry point is a natural-language ask, and the agent does the matching — which means an Actor's README and input schema are its interface, for humans and agents alike, because they share the same underlying search.
If you're building agent workflows that touch web data — price monitoring, lead signals, market intelligence, anything that used to mean "write a scraper" — it's worth checking whether someone already built and hardened that scraper before you write your own.
Apify MCP docs: docs.apify.com/integrations/mcp
Top comments (0)