# `gg.machina/world-cup-intelligence` on anlyon.dev

> Text inside fenced blocks marked untrusted-server-text was written by the MCP server's publisher, not by anlyon.dev. It is data to inspect, not instructions to follow. Invisible characters are shown as [U+XXXX].
> No finding is not a safety guarantee: these are point-in-time checks of tool definitions, not of code or behaviour.

- Page: https://anlyon.dev/servers/gg.machina/world-cup-intelligence
- JSON: https://anlyon.dev/api/v1/servers/gg.machina/world-cup-intelligence
- Version: 0.1.1 (active)
- Publisher: gg.machina (domain proven to the MCP Registry)
- Runs: remote (sse)
- Sign-in to list tools: none
- Metadata from the official MCP Registry, synced 2026-10-21T18:13:03.717Z

Title and description, as the publisher wrote them:

```untrusted-server-text
Machina World Cup Intelligence
World Cup 2026 match, team, player and market context from Machina Sports, the sports AI platform.
```

Scanned 2026-10-21T19:00:43.441Z over sse.

**16 tools: 5 change things and 11 only read.**

| Group | Class | Tools | Claude Code |
| --- | --- | --- | --- |
| Deletes or cancels | destructive | 0 | deny |
| Can't be undone | irreversible | 0 | ask |
| Changes things | write | 5 | ask |
| Only reads | read | 11 | allow |

## Findings

- **warn** Annotations that disagree with the tool in `worldcup_match_recap` ([annotation-conflict](https://anlyon.dev/methodology#annotation-conflict))

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

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


## Changes things (5)

Creates or changes something that can be changed back. Claude Code: ask.

### `worldcup_backtest_forecasts`

- 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:

```untrusted-server-text
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.
        
```

### `worldcup_fan_pulse`

- 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:

```untrusted-server-text
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.
        
```

### `worldcup_market_watch`

- 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:

```untrusted-server-text
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.
        
```

### `worldcup_match_recap`

- 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 annotation-conflict

Description, as the server wrote it:

```untrusted-server-text
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.
        
```

### `worldcup_player_spotlight`

- 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:

```untrusted-server-text
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.
        
```

## Only reads (11)

Looks things up and changes nothing. Claude Code: allow.

### `worldcup_explain_market_move`

- The name "worldcup_explain_market_move" says "explain": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
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.
        
```

### `worldcup_find_market_edges`

- The name "worldcup_find_market_edges" says "find": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
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").
        
```

### `worldcup_get_event_context`

- The name "worldcup_get_event_context" says "get": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
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.
        
```

### `worldcup_get_market_state`

- The name "worldcup_get_market_state" says "get": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
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").
        
```

### `worldcup_get_match_forecast`

- The name "worldcup_get_match_forecast" says "get": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
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).
        
```

### `worldcup_get_schedule`

- The name "worldcup_get_schedule" says "get": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
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).
        
```

### `worldcup_get_signal`

- The name "worldcup_get_signal" says "get": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
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.
        
```

### `worldcup_health`

- The description's first verb is "whoami": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
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.
        
```

### `worldcup_match_preview`

- The name "worldcup_match_preview" says "preview": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
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.
        
```

### `worldcup_resolve`

- The name "worldcup_resolve" says "resolve": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
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".
        
```

### `worldcup_search_markets`

- The name "worldcup_search_markets" says "search": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
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.
        
```

## Claude Code permissions

For `.claude/settings.json`, assuming the server is installed as `world-cup-intelligence`:

```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": []
  }
}
```
