Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Markets orchestration — connects ESPN live schedules with Kalshi and Polymarket prediction markets. Unified dashboards, odds comparison, entity search, and bet evaluation across platforms. Use when: user wants to see prediction market odds alongside ESPN game schedules, compare odds across platforms, search for a team/player on Kalshi or Polymarket, check for arbitrage between ESPN odds and prediction markets, or evaluate a specific game's market value. Don't use when: user wants raw prediction
.claude/skills/machina-sports-markets/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-15 | ✗→✓ | ▲ Improved | 102% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 1315% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 214% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 126% | 0% |
| case-12 | ✗→✓ | ▲ Improved | 101% | 0% |
Bridges ESPN live schedules (NBA, NFL, MLB, NHL, WNBA, CFB, CBB) with Kalshi and Polymarket prediction markets. Before writing queries, consult references/api-reference.md for supported sport codes, command parameters, and price normalization formats.
bashsports-skills markets get_todays_markets --sport=nba sports-skills markets search_entity --query="Lakers" --sport=nba sports-skills markets compare_odds --sport=nba --event_id=401234567 sports-skills markets get_sport_markets --sport=nfl sports-skills markets get_sport_schedule --sport=nba sports-skills markets normalize_price --price=0.65 --source=polymarket sports-skills markets evaluate_market --sport=nba --event_id=401234567 sports-skills markets match_markets --sport=mlb --date=2026-06-06 sports-skills markets get_market_price --venue=kalshi --ticker=KXMENWORLDCUP-26-FR sports-skills markets get_price_history --venue=kalshi --ticker=KXMENWORLDCUP-26-FR --interval=1d
Python SDK:
pythonfrom sports_skills import markets markets.get_todays_markets(sport="nba") markets.search_entity(query="Lakers", sport="nba") markets.compare_odds(sport="nba", event_id="401234567") markets.get_sport_markets(sport="nfl") markets.get_sport_schedule(sport="nba", date="2025-02-26") markets.normalize_price(price=0.65, source="polymarket") markets.evaluate_market(sport="nba", event_id="401234567") markets.match_markets(sport="mlb", date="2026-06-06") markets.get_market_price(venue="kalshi", ticker="KXMENWORLDCUP-26-FR", at_time="2026-05-01T12:00:00+00:00") markets.get_price_history(venue="polymarket", token_id="<token_id>", interval="1h")
CRITICAL: Before calling any orchestration command, verify:
sport code is provided for sport-aware commands (get_todays_markets, compare_odds, get_sport_markets, evaluate_market).espn = American odds, polymarket = 0-1 probability, kalshi = 0-100 integer.--sport=nba maps automatically to the correct Polymarket sport code and Kalshi series ticker.sport → series_id; Kalshi uses KXNBA, KXNFL, etc.bashsports-skills markets get_todays_markets --sport=nba
Returns each game with ESPN info, DraftKings odds, matching Kalshi markets, and matching Polymarket markets.
get_sport_schedule --sport=nbacompare_odds --sport=nba --event_id=<id>price_basis: "reference"), so confirm both legs on each venue's order book before trading it.sources and completeness say which venues actually priced this game; a provider error is reported as error, not as "no markets".evaluate_market --sport=nba --event_id=<id> --outcome=0 --fee_per_contract=<dollars per $1 contract>betting.evaluate_bet: devig → edge → KellyWithout fee_per_contract the ask is reported but evaluation is null — the net numbers are refused rather than assumed free. A ticker or token_id that names another team, another date, or a derivative (first-half, spread) market is refused, not substituted. Fees are not currently settable via the CLI; use the Python wrapper (markets.evaluate_market(..., fee_per_contract=...)).
match_markets --sport=mlb --date=2026-06-06kalshi.market_tickers[i] and polymarket.markets[i].token_ids[j] straight into get_market_price to compare prices.get_market_price --venue=kalshi --ticker=<ticker> --at_time=2026-05-01 for a single point-in-time price (both yes/no sides, 0-1).get_price_history --venue=kalshi --ticker=<ticker> --interval=1d for the full series — same {timestamp, price} shape on either venue.Example 1: Today's games with prediction market odds User says: "What NBA games are on today and what are the prediction market odds?" Actions:
get_todays_markets(sport="nba")Result: Unified dashboard with each game's ESPN info and Kalshi/Polymarket prices
Example 2: Cross-platform team search User says: "Find me Lakers markets on Kalshi and Polymarket" Actions:
search_entity(query="Lakers", sport="nba")Result: All Lakers markets across both exchanges with prices and volume
Example 3: Odds comparison for a specific game User says: "Compare the odds for this Celtics game across ESPN and Polymarket" Actions:
get_sport_schedule(sport="nba")compare_odds(sport="nba", event_id="<id>")Result: Normalized side-by-side comparison with automatic arbitrage check
Example 4: Full market evaluation User says: "Is there edge on the Chiefs game?" Actions:
get_sport_schedule(sport="nfl")evaluate_market(sport="nfl", event_id="<id>")Result: Fair probability, edge percentage, EV, Kelly fraction, and bet recommendation
Example 5: Browse all markets for a sport User says: "Show me all NFL prediction markets" Actions:
get_sport_markets(sport="nfl")Result: All open NFL markets across Kalshi and Polymarket
Example 6: Price conversion User says: "Convert a Polymarket price of 65 cents to American odds" Actions:
normalize_price(price=0.65, source="polymarket")Result: Common structure with implied probability (0.65), American odds (-185.7), and decimal (1.54)
Example 7: Pair a game across venues User says: "Find the Mets game on both Kalshi and Polymarket" Actions:
match_markets(sport="mlb", date="<game date>")Result: The game paired across venues — Kalshi market tickers and Polymarket moneyline token IDs side by side
Example 8: Historical price User says: "What was France's World Cup price a month ago?" Actions:
get_market_price(venue="kalshi", ticker="KXMENWORLDCUP-26-FR", at_time="2026-05-03T12:00:00+00:00")Result: Yes/no prices (0-1) as of that moment; use get_price_history for the full curve
get_odds~~ — does not exist. Use compare_odds to see odds across sources.search_markets~~ — does not exist on the markets module. Use search_entity instead.get_schedule~~ — does not exist. Use get_sport_schedule instead.If a command is not listed in references/api-reference.md, it does not exist.
Error: No markets returned for a sport Cause: Sport code may be missing or incorrect Solution: Check references/api-reference.md for valid sport codes. Use the exact code (e.g., nba, epl, laliga)
Error: compare_odds returns no data for an event Cause: The event_id is incorrect or the game has not been indexed yet Solution: Call get_sport_schedule(sport=...) to retrieve the correct event_id first
Error: One source shows warnings in the response Cause: Kalshi or Polymarket is temporarily unavailable Solution: The module returns partial results — use what is available. Retry the unavailable source separately using the kalshi or polymarket skill directly
Error: normalize_price returns unexpected American odds value Cause: Wrong source parameter — Kalshi uses 0-100 integers, Polymarket uses 0-1 decimals Solution: Verify the source. Kalshi price of 65 requires source="kalshi", Polymarket price of 0.65 requires source="polymarket"
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-15 | fail→pass | 17,355 | 8,652 | -50% | 1 | 1 | 0% | 1,763 | 3,565 | +102% | 0 | 0 | — |
case-01 | fail→fail | 28,883 | 11,641 | -60% | 1 | 1 | 0% | 4,491 | 2,705 | -40% | 0 | 0 | — |
case-02 | fail→fail | 19,553 | 15,669 | -20% | 1 | 1 | 0% | 3,584 | 2,705 | -25% | 0 | 0 | — |
case-03 | fail→fail | 17,778 | 16,825 | -5% | 1 | 1 | 0% | 1,778 | 2,741 | +54% | 0 | 0 | — |
case-04 | pass→pass | 6,397 | 21,562 | +237% | 1 | 1 | 0% | 996 | 4,315 | +333% | 0 | 0 | — |
case-05 | fail→fail | 21,774 | 19,168 | -12% | 1 | 1 | 0% | 2,970 | 5,389 | +81% | 0 | 0 | — |
case-06 | pass→fail | 10,165 | 28,624 | +182% | 1 | 1 | 0% | 653 | 4,403 | +574% | 0 | 0 | — |
case-07 | fail→pass | 17,918 | 16,196 | -10% | 1 | 1 | 0% | 348 | 4,923 | +1315% | 0 | 0 | — |
case-08 | fail→fail | 10,154 | 36,981 | +264% | 1 | 1 | 0% | 668 | 2,856 | +328% | 0 | 0 | — |
case-09 | fail→pass | 14,404 | 8,404 | -42% | 1 | 1 | 0% | 1,210 | 3,802 | +214% | 0 | 0 | — |
case-10 | fail→pass | 15,363 | 24,610 | +60% | 1 | 1 | 0% | 1,850 | 4,172 | +126% | 0 | 0 | — |
case-11 | fail→fail | 13,590 | 14,135 | +4% | 1 | 1 | 0% | 1,343 | 2,556 | +90% | 0 | 0 | — |
case-12 | fail→pass | 13,343 | 18,801 | +41% | 1 | 1 | 0% | 1,836 | 3,698 | +101% | 0 | 0 | — |
case-13 | fail→pass | 42,301 | 12,883 | -70% | 1 | 1 | 0% | 1,367 | 4,382 | +221% | 0 | 0 | — |
case-14 | fail→pass | 31,215 | 8,722 | -72% | 1 | 1 | 0% | 1,666 | 2,884 | +73% | 0 | 0 | — |
case-16 | fail→fail | 9,580 | 19,084 | +99% | 1 | 1 | 0% | 430 | 2,709 | +530% | 0 | 0 | — |
case-17 | fail→fail | 16,847 | 18,848 | +12% | 1 | 1 | 0% | 2,126 | 2,603 | +22% | 0 | 0 | — |
case-18 | fail→fail | 28,173 | 13,872 | -51% | 1 | 1 | 0% | 3,143 | 2,646 | -16% | 0 | 0 | — |
case-19 | pass→pass | 54,812 | 10,666 | -81% | 1 | 1 | 0% | 2,366 | 3,027 | +28% | 0 | 0 | — |
case-20 | pass→pass | 16,031 | 4,583 | -71% | 1 | 1 | 0% | 1,266 | 2,989 | +136% | 0 | 0 | — |
case-21 | fail→fail | 5,557 | 22,213 | +300% | 1 | 1 | 0% | 698 | 3,379 | +384% | 0 | 0 | — |
case-22 | fail→fail | 16,264 | 14,832 | -9% | 1 | 1 | 0% | 1,614 | 2,607 | +62% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 11 counted toward the lift figure. The other 11 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +27 percentage points is the difference between those two pass rates over the 11 comparable cases. 3 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
| Model | Method | Date | Lift |
|---|---|---|---|
| gemini-3.6-flash | verified | 8/4/2026 | +48% |
Other measured skills in the registry, with their headline benchmark lift.