Skip to content

Machina World Cup Intelligence

by machina.gg · remote · no sign-in to list tools · v0.1.1 · published by gg.machina

World Cup 2026 match, team, player and market context from Machina Sports, the sports AI platform.

Changes · 5

16 tools: 5 change things and 11 only read.

Scanned Oct 21, 2026

1 check matched something in the tool definitions. No finding is not a safety guarantee. How the checks work.

claude mcp add --transport sse world-cup-intelligence https://worldcup-mcp.org.machina.gg/sse --header 'X-Api-Token: <your-x-api-token>'

Findings

Matches of fixed checks, with the text they matched.

1 warn
  • The server marks "worldcup_match_recap" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

    Matched text

    annotations: {"readOnlyHint":true}; The description's first verb is "post": a word for a change.

    What this check looks for

Tools

Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.

16 tools

Changes things 5Claude Code: ask
  • worldcup_backtest_forecastsHistorical accuracy report of the model over played fixtures (calibration + CLV ledger).No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Historical accuracy report of the model over played fixtures (calibration + CLV ledger). Cost: 12 credits (intelligence). Example: worldcup_backtest_forecasts() Args: league: league/competition filter (default: World Cup). season: season filter.

    Annotations the server declares

    • title: Backtest Forecasts
    • readOnlyHint: true
  • worldcup_fan_pulseSocial/news fan-sentiment card (buzz, narratives, breaking news) via live X/web search.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Social/news fan-sentiment card (buzz, narratives, breaking news) via live X/web search. Tournament-wide by default, or scoped to a team or fixture. Cost: 40 credits (skill card). ~1h cache. Example: worldcup_fan_pulse(event="Brazil vs Morocco") Args: event: natural fixture description ("Brazil vs Morocco") — or get event_urn from worldcup_get_schedule. event_urn: canonical fixture URN (preferred when known). team: scope the pulse to one team. opponent: opponent name (with team). date: fixture date YYYY-MM-DD (disambiguates rematches). query: free-text subject when no event/team is given. lookback_hours: search window in hours (0 = workflow default). force_regen: bypass the cache and regenerate now.

    Annotations the server declares

    • title: Fan Sentiment Pulse
    • readOnlyHint: true
  • worldcup_market_watchTournament-wide market-watch card: biggest market movers and informational edges across World Cup markets.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Tournament-wide market-watch card: biggest market movers and informational edges across World Cup markets. Cost: 40 credits (skill card). ~20 min cache. Example: worldcup_market_watch() Args: force_regen: bypass the ~20min cache and regenerate now.

    Annotations the server declares

    • title: Market Watch Digest
    • readOnlyHint: true
  • worldcup_match_recapPost-match recap card, authored once the final whistle blows — result, narrative, market settlement.1 finding

    Why it is in this group

    • The description's first verb is "post": a word for a change.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    Findings

    • Warn

      The server marks "worldcup_match_recap" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

      Matched text

      annotations: {"readOnlyHint":true}; The description's first verb is "post": a word for a change.

      What this check looks for
    Description, as the server wrote it
    Post-match recap card, authored once the final whistle blows — result, narrative, market settlement. Cost: 40 credits (skill card). Example: worldcup_match_recap(event="Brazil vs Morocco") Args: event: natural fixture description ("Brazil vs Morocco") — or get event_urn from worldcup_get_schedule. event_urn: canonical fixture URN (preferred when known). team: team name (alternative to event). opponent: opponent name (with team). date: fixture date YYYY-MM-DD (disambiguates rematches). force_regen: bypass the cache and regenerate now.

    Annotations the server declares

    • title: Match Recap Card
    • readOnlyHint: true
  • worldcup_player_spotlightGrounded player card: performance context + narrative, source- cited.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Grounded player card: performance context + narrative, source- cited. Cost: 40 credits (skill card). Example: worldcup_player_spotlight(player="Vinicius Jr", team="Brazil") Args: player: player name (e.g. "Vinicius Jr"). team: the player's national team (disambiguates homonyms). player_urn: canonical player URN (from worldcup_resolve). force_regen: bypass the cache and regenerate now.

    Annotations the server declares

    • title: Player Spotlight Card
    • readOnlyHint: true
Only reads 11Claude Code: allow
  • worldcup_explain_market_moveGrounded explanation of WHY a market moved: price history + live research, source-cited.No findings

    Why it is in this group

    • The name "worldcup_explain_market_move" says "explain": a word for reading.
    Description, as the server wrote it
    Grounded explanation of WHY a market moved: price history + live research, source-cited. Cost: 12 credits (intelligence). Get market_id from worldcup_search_markets or worldcup_market_watch. Example: worldcup_explain_market_move(market_id="KXWC26-BRA") Args: market_id: the market id/ticker to explain (required). window_hours: move window to analyze in hours (default 24). min_move_bps: ignore moves smaller than this (basis points). include_reasoning: include the reasoning trace.

    Annotations the server declares

    • title: Explain Market Move
    • readOnlyHint: true
  • worldcup_find_market_edgesScan open markets for model-vs-market gaps (informational edge candidates across the tournament).No findings

    Why it is in this group

    • The name "worldcup_find_market_edges" says "find": a word for reading.
    Description, as the server wrote it
    Scan open markets for model-vs-market gaps (informational edge candidates across the tournament). Cost: 18 credits (edge). Informational only — never betting advice. Example: worldcup_find_market_edges(min_edge_bps=300) Args: min_edge_bps: minimum edge in basis points (default 200). limit: max candidates returned (default 10). include_reasoning: include per-candidate reasoning. status: market status filter (e.g. "open").

    Annotations the server declares

    • title: Find Market Edges
    • readOnlyHint: true
  • worldcup_get_event_contextEnriched single-fixture context: form, group standings slice, injuries, optional research extras.No findings

    Why it is in this group

    • The name "worldcup_get_event_context" says "get": a word for reading.
    Description, as the server wrote it
    Enriched single-fixture context: form, group standings slice, injuries, optional research extras. Cost: 1 credit (data). Example: worldcup_get_event_context(event="Brazil vs Morocco") Args: event: natural fixture description ("Brazil vs Morocco") — or get event_urn from worldcup_get_schedule. event_urn: canonical fixture URN (preferred when known). team: team name (alternative to event). opponent: opponent name (with team). date: fixture date YYYY-MM-DD (disambiguates rematches). provider_event_id: a provider's raw event id (auto-resolved). include_prematch_research: add grounded pre-match research. include_social_pulse: add a social sentiment slice.

    Annotations the server declares

    • title: Get Match Context
    • readOnlyHint: true
  • worldcup_get_market_stateLive state of ONE market: price, order-book depth, optional candles/trades history.No findings

    Why it is in this group

    • The name "worldcup_get_market_state" says "get": a word for reading.
    Description, as the server wrote it
    Live state of ONE market: price, order-book depth, optional candles/trades history. Cost: 3 credits (market). Get market_id from worldcup_search_markets. Example: worldcup_get_market_state(market_id="KXWC26-BRA", include_history=True) Args: market_id: the market id/ticker from worldcup_search_markets. include_book: include order-book depth (default true). include_history: include price history candles. include_trades: include recent trades. history_hours: history window in hours (default 24). history_interval: candle interval (e.g. "1h").

    Annotations the server declares

    • title: Get Market State
    • readOnlyHint: true
  • worldcup_get_match_forecastDixon-Coles model forecast for one fixture (1X2 probabilities, model-vs-market gaps).No findings

    Why it is in this group

    • The name "worldcup_get_match_forecast" says "get": a word for reading.
    Description, as the server wrote it
    Dixon-Coles model forecast for one fixture (1X2 probabilities, model-vs-market gaps). Cost: 12 credits (intelligence). Get event_urn from worldcup_get_schedule. Example: worldcup_get_match_forecast(event_urn="urn:machina:...:wor") Args: event_urn: canonical fixture URN (required). include_reasoning: include the model's reasoning trace. min_gap_bps: only report model-vs-market gaps above this (bps).

    Annotations the server declares

    • title: Get Match Forecast
    • readOnlyHint: true
  • worldcup_get_scheduleTournament fixtures with their event_urn — the discovery primitive every per-fixture tool builds on.No findings

    Why it is in this group

    • The name "worldcup_get_schedule" says "get": a word for reading.
    Description, as the server wrote it
    Tournament fixtures with their event_urn — the discovery primitive every per-fixture tool builds on. Cost: 1 credit (data). Example: worldcup_get_schedule(team="Brazil") Args: team: filter by team name (e.g. "Brazil"). opponent: filter by opponent name. date_from: ISO date lower bound (YYYY-MM-DD). date_to: ISO date upper bound (YYYY-MM-DD). status: fixture status filter (e.g. "scheduled", "finished"). limit: max fixtures returned (default 20).

    Annotations the server declares

    • title: Get Match Schedule
    • readOnlyHint: true
  • worldcup_get_signalPer-fixture betting signal: fuses the model forecast with the best market price into recommendation + edge% + EV + fractional-Kelly stake.No findings

    Why it is in this group

    • The name "worldcup_get_signal" says "get": a word for reading.
    Description, as the server wrote it
    Per-fixture betting signal: fuses the model forecast with the best market price into recommendation + edge% + EV + fractional-Kelly stake. Cost: 18 credits (edge). Informational decision support — never a guaranteed bet. Example: worldcup_get_signal(event="Brazil vs Morocco") Args: event: natural fixture description ("Brazil vs Morocco") — or get event_urn from worldcup_get_schedule. event_urn: canonical fixture URN (preferred when known). team: team name (alternative to event). opponent: opponent name (with team). date: fixture date YYYY-MM-DD (disambiguates rematches). bankroll: optional bankroll for stake sizing. kelly_fraction: fraction of full Kelly (default 0.25). min_edge_bps: minimum edge in basis points to surface (default 200). fee_bps: market fee in basis points (default 0). include_reasoning: include the signal's reasoning trace.

    Annotations the server declares

    • title: Get Market Signal
    • readOnlyHint: true
  • worldcup_healthWhoami/smoke check — verifies your API key and the product surface.No findings

    Why it is in this group

    • The description's first verb is "whoami": a word for reading.
    Description, as the server wrote it
    Whoami/smoke check — verifies your API key and the product surface. Cost: FREE (0 credits). Call this first to validate setup before spending credits. Example: worldcup_health() Args: include_connectors: also report upstream connector reachability.

    Annotations the server declares

    • title: Health Check
    • readOnlyHint: true
  • worldcup_match_previewGrounded match preview card: form, key men, group context, market snapshot — source-cited, ready to publish.No findings

    Why it is in this group

    • The name "worldcup_match_preview" says "preview": a word for reading.
    Description, as the server wrote it
    Grounded match preview card: form, key men, group context, market snapshot — source-cited, ready to publish. Cost: 40 credits (skill card). Example: worldcup_match_preview(event="Brazil vs Morocco") Args: event: natural fixture description ("Brazil vs Morocco") — or get event_urn from worldcup_get_schedule. event_urn: canonical fixture URN (preferred when known). team: team name (alternative to event). opponent: opponent name (with team). date: fixture date YYYY-MM-DD (disambiguates rematches). force_regen: bypass the cache and regenerate now.

    Annotations the server declares

    • title: Match Preview Card
    • readOnlyHint: true
  • worldcup_resolveResolve ANY provider id or free-text name (team, player, fixture) to the canonical Machina entity + URN via the identity crosswalk.No findings

    Why it is in this group

    • The name "worldcup_resolve" says "resolve": a word for reading.
    Description, as the server wrote it
    Resolve ANY provider id or free-text name (team, player, fixture) to the canonical Machina entity + URN via the identity crosswalk. Cost: 1 credit (data). Example: worldcup_resolve(id="sr:competitor:4715") Args: id: provider id (Sportradar/Opta/api-football/...) or a name like "Vinicius Jr" / "Brazil vs Morocco".

    Annotations the server declares

    • title: Resolve Team, Player or Match
    • readOnlyHint: true
  • worldcup_search_marketsSearch Kalshi + Polymarket World Cup markets in one normalized shape.No findings

    Why it is in this group

    • The name "worldcup_search_markets" says "search": a word for reading.
    Description, as the server wrote it
    Search Kalshi + Polymarket World Cup markets in one normalized shape. Cost: 3 credits (market). Example: worldcup_search_markets(team="Brazil") Args: query: free-text market search. team: filter markets involving a team. source: "kalshi" or "polymarket" (default: both). status: market status filter (e.g. "open"). limit: max markets returned (default 20). force_live: bypass the cache and hit the venues live.

    Annotations the server declares

    • title: Search Prediction Markets
    • readOnlyHint: true

This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.

Install

Pinned to version 0.1.1. Values in angle brackets are yours to fill in.

claude mcp add --transport sse world-cup-intelligence https://worldcup-mcp.org.machina.gg/sse --header 'X-Api-Token: <your-x-api-token>'

Run in a terminal.

Claude Code permissions

Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.

.claude/settings.json
{
  "permissions": {
    "allow": [
      "mcp__world-cup-intelligence__worldcup_health",
      "mcp__world-cup-intelligence__worldcup_get_schedule",
      "mcp__world-cup-intelligence__worldcup_resolve",
      "mcp__world-cup-intelligence__worldcup_get_event_context",
      "mcp__world-cup-intelligence__worldcup_search_markets",
      "mcp__world-cup-intelligence__worldcup_get_market_state",
      "mcp__world-cup-intelligence__worldcup_get_match_forecast",
      "mcp__world-cup-intelligence__worldcup_explain_market_move",
      "mcp__world-cup-intelligence__worldcup_find_market_edges",
      "mcp__world-cup-intelligence__worldcup_get_signal",
      "mcp__world-cup-intelligence__worldcup_match_preview"
    ],
    "ask": [
      "mcp__world-cup-intelligence__worldcup_backtest_forecasts",
      "mcp__world-cup-intelligence__worldcup_market_watch",
      "mcp__world-cup-intelligence__worldcup_fan_pulse",
      "mcp__world-cup-intelligence__worldcup_match_recap",
      "mcp__world-cup-intelligence__worldcup_player_spotlight"
    ],
    "deny": []
  }
}

Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. It assumes the server is installed as world-cup-intelligence. Review it before you use it.