skipseek

Polymarket, Manifold, Metaculus compared: one fair probability per question. No API key needed.

Should I use this

Quality & Safety

A
Description quality
100%
Schema completeness
88%
Naming quality
100%
Poisoning risk
80%
Permission match
100%
Protocol compliance
100%

Findings (2)

  • HIGHTool poisoning patterns detected
  • MEDIUMTool description contains URL to non-standard domainin list_markets

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~6,287Tokens (tool definitions)
~5.7 KBTypical response size
Significant attention impact (4.91% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "skipseek": {
      "url": "https://skipseek.com/mcp"
    }
  }
}

Remote endpoints

https://skipseek.com/mcpstreamable-http

What it can do

Tool inventory

Tools (9)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢list_markets(category, platform, status, query, sort, ...)

Browse the SkipSeek board: published prediction markets with the SkipSeek Fair Probability (a cross-venue consensus of every venue trading the same standardized question), 24h movement in percentage points, cross-market spread, confidence band, and which venues price each market. START HERE — the `slug` values it returns are what every other market tool needs. USE WHEN the question is "what is the market saying about X", to discover slugs, or to filter by category/venue/status. USE SOMETHING ELSE WHEN you already hold a slug (get_market_probabilities for the current per-venue picture, get_market_history for the time series), when you want the widest cross-venue disagreement (list_discrepancies) or the biggest recent moves (list_movers), or when the question is a single sports fixture and you only need its fair price — that is SkipOdds at https://skipodds.com/mcp. Do NOT route a sports question away when the user wants to know whether the EXCHANGE disagrees with the BOOKMAKERS on that fixture: SkipSeek carries de-vigged sportsbook consensus as one venue alongside the prediction markets, so that comparison exists only here (list_discrepancies). Read-only: nothing is written and no bet is placed. Returns an empty `markets` array, not an error, when no published market matches the filters.

Input Schema

{
  "type": "object",
  "properties": {
    "category": {
      "type": "string",
      "description": "Restrict to one category by slug, e.g. \"politics\", \"economics\", \"crypto\", \"world\", \"tech\", \"sports\". Omit for all categories. An unknown slug simply matches nothing."
    },
    "platform": {
      "type": "string",
      "description": "Restrict to markets priced by one venue, by venue slug (e.g. \"polymarket\"). Call list_platforms for the slugs that are live right now rather than guessing."
    },
    "status": {
      "type": "string",
      "description": "Restrict to one lifecycle status as stored on the market, e.g. \"open\". Omit to include every published market regardless of status."
    },
    "query": {
      "type": "string",
      "description": "Case-insensitive substring match on the market title, e.g. \"Fed\" or \"Bitcoin\". Free text, not a boolean query language."
    },
    "sort": {
      "type": "string",
      "enum": [
        "volume",
        "movement",
        "discrepancy",
        "quality",
        "closing",
        "newest"
      ],
      "default": "volume",
      "description": "Ordering: \"volume\" (default; most-sourced first), \"movement\" (largest 24h swing), \"discrepancy\" (widest cross-venue spread), \"quality\" (highest confidence score), \"closing\" (soonest to close), \"newest\"."
    },
    "limit": {
      "type": "integer",
      "minimum": 1,
      "default": 25,
      "description": "Maximum markets to return. Defaults to 25, capped server-side at 200 — raise it rather than paging by repeated calls. Demo callers get at most 5 regardless."
    }
  }
}

Output Schema

{
  "type": "object",
  "properties": {
    "source": {
      "type": "string"
    },
    "attribution": {
      "type": "string"
    },
    "generated_at": {
      "type": "string"
    },
    "requests_remaining_today": {
      "type": [
        "integer",
        "null"
      ]
    },
    "tier": {
      "type": "string"
    },
    "notice": {
      "type": "string",
      "description": "Set INSTEAD of data when the call succeeded but has nothing to return: unknown slug, empty result, a tool not on this tier, or quota spent. Not an error."
    },
    "markets": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "slug": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "category": {
            "type": [
              "string",
              "null"
            ]
          },
          "status": {
            "type": "string"
          },
          "closesAt": {
            "type": [
              "string",
              "null"
            ]
          },
          "fair": {
            "type": [
              "number",
              "null"
            ],
            "description": "Consensus probability as a decimal 0-1, not a percentage."
          },
          "move24hPts": {
            "type": [
              "number",
              "null"
            ],
            "description": "24h change in percentage POINTS, signed; negative means it fell."
          },
          "crossSpreadPts": {
            "type": [
              "number",
              "null"
            ],
            "description": "Highest-to-lowest venue spread, in percentage points."
          },
          "confidence": {
            "type": [
              "number",
              "null"
            ]
          },
          "confidenceBand": {
            "type": [
              "string",
              "null"
            ]
          },
          "sources": {
            "type": "integer"
          },
          "venues": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "topGapPts": {
            "type": [
              "number",
              "null"
            ],
            "description": "Signed, in percentage points."
          },
          "topGapLabel": {
            "type": [
              "string",
              "null"
            ]
          },
          "history": {
            "type": "array",
            "items": {
              "type": "number"
            }
          }
        },
        "additionalProperties": true
      }
    }
  },
  "description": "The SkipSeek board, filtered and ordered as requested.",
  "additionalProperties": true
}
🟢get_market_probabilities(market)

The full current picture for ONE market: the SkipSeek Fair Probability, every venue pricing it with that venue's own price snapshot and how closely its contract matches the standardized question, each venue's signed Probability Gap against fair value (labelled Market Premium, Market Discount, In Line or Cross-Market Discrepancy), and the latest confidence score and band. USE WHEN you have a slug and need where the price stands now, or to answer "which venue is out of line and by how much". USE SOMETHING ELSE WHEN you do not have a slug yet (list_markets), when you need how the price MOVED over time (get_market_history), or when you want the written analysis and its cited sources (get_market_research). Read-only. Probabilities are 0–1; gaps are in percentage points. An unknown slug returns a plain not-found message, not an error.

Input Schema

{
  "type": "object",
  "properties": {
    "market": {
      "type": "string",
      "description": "Market slug, exactly as returned in the `slug` field by list_markets, list_discrepancies or list_movers (e.g. \"fed-cuts-rates-by-september\"). Opaque — do not construct or guess one; a slug that does not exist returns a not-found message rather than data."
    }
  },
  "required": [
    "market"
  ]
}

Output Schema

{
  "type": "object",
  "properties": {
    "source": {
      "type": "string"
    },
    "attribution": {
      "type": "string"
    },
    "generated_at": {
      "type": "string"
    },
    "requests_remaining_today": {
      "type": [
        "integer",
        "null"
      ]
    },
    "tier": {
      "type": "string"
    },
    "notice": {
      "type": "string",
      "description": "Set INSTEAD of data when the call succeeded but has nothing to return: unknown slug, empty result, a tool not on this tier, or quota spent. Not an error."
    },
    "market": {
      "type": "string"
    },
    "fair_probability": {
      "type": [
        "number",
        "null"
      ],
      "description": "Decimal 0-1."
    },
    "sources": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "venue": {
            "type": [
              "string",
              "null"
            ]
          },
          "type": {
            "type": [
              "string",
              "null"
            ]
          },
          "price": {
            "type": [
              "number",
              "null"
            ],
            "description": "That venue's own probability, 0-1, before consensus weighting."
          },
          "match_type": {
            "type": [
              "string",
              "null"
            ],
            "description": "How closely this contract matches the standardized question; a loose match discounts the gap."
          }
        },
        "additionalProperties": true
      }
    },
    "gaps": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "platform_id": {
            "type": "string"
          },
          "gap_points": {
            "type": [
              "number",
              "null"
            ],
            "description": "Signed distance from fair value in percentage POINTS; positive = venue prices it higher."
          },
          "label": {
            "type": [
              "string",
              "null"
            ]
          },
          "captured_at": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "additionalProperties": true
      }
    },
    "confidence": {
      "type": [
        "object",
        "null"
      ],
      "additionalProperties": true
    }
  },
  "description": "Current cross-venue picture for one market.",
  "additionalProperties": true
}
🟢list_discrepancies(limit)

Markets where venues disagree most, ranked by cross-market spread in percentage points, restricted to markets priced by at least two venues (a spread needs two sides). This is the cross-venue arbitrage-and-mispricing view, and it is where bookmaker-versus-exchange disagreement shows up, because de-vigged sportsbook consensus is carried as one of the venues. USE WHEN asked where the market is inconsistent, which venue is mispricing something, or for the widest gaps right now. USE SOMETHING ELSE WHEN you care about change over time rather than disagreement at a moment (list_movers, get_market_history), or when you need one named market (get_market_probabilities). Read-only, and explicitly not trading advice. Returns an empty `discrepancies` array, not an error, when nothing currently trades on two or more venues.

Input Schema

{
  "type": "object",
  "properties": {
    "limit": {
      "type": "integer",
      "minimum": 1,
      "default": 20,
      "description": "Maximum rows to return, widest spread first. Defaults to 20. Demo callers get at most 5."
    }
  }
}

Output Schema

{
  "type": "object",
  "properties": {
    "source": {
      "type": "string"
    },
    "attribution": {
      "type": "string"
    },
    "generated_at": {
      "type": "string"
    },
    "requests_remaining_today": {
      "type": [
        "integer",
        "null"
      ]
    },
    "tier": {
      "type": "string"
    },
    "notice": {
      "type": "string",
      "description": "Set INSTEAD of data when the call succeeded but has nothing to return: unknown slug, empty result, a tool not on this tier, or quota spent. Not an error."
    },
    "discrepancies": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "slug": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "category": {
            "type": [
              "string",
              "null"
            ]
          },
          "status": {
            "type": "string"
          },
          "closesAt": {
            "type": [
              "string",
              "null"
            ]
          },
          "fair": {
            "type": [
              "number",
              "null"
            ],
            "description": "Consensus probability as a decimal 0-1, not a percentage."
          },
          "move24hPts": {
            "type": [
              "number",
              "null"
            ],
            "description": "24h change in percentage POINTS, signed; negative means it fell."
          },
          "crossSpreadPts": {
            "type": [
              "number",
              "null"
            ],
            "description": "Highest-to-lowest venue spread, in percentage points."
          },
          "confidence": {
            "type": [
              "number",
              "null"
            ]
          },
          "confidenceBand": {
            "type": [
              "string",
              "null"
            ]
          },
          "sources": {
            "type": "integer"
          },
          "venues": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "topGapPts": {
            "type": [
              "number",
              "null"
            ],
            "description": "Signed, in percentage points."
          },
          "topGapLabel": {
            "type": [
              "string",
              "null"
            ]
          },
          "history": {
            "type": "array",
            "items": {
              "type": "number"
            }
          }
        },
        "additionalProperties": true
      },
      "description": "Not trading advice: a wide spread can mean the venues are pricing subtly different questions - check `match_type`."
    }
  },
  "description": "Markets where venues disagree most, widest spread first.",
  "additionalProperties": true
}
🟢list_movers(limit)

Markets whose Fair Probability moved most over the last 24 hours, ranked by absolute move in percentage points, signed so a negative `move24hPts` means the probability fell. Only markets with a comparable snapshot from ~24h ago appear. USE WHEN asked what changed, what is trending, or which forecasts repriced today. USE SOMETHING ELSE WHEN you want the full path of one market rather than a single 24h delta (get_market_history), or disagreement between venues rather than change over time (list_discrepancies). Read-only. Returns an empty `movers` array, not an error, when nothing has a 24h comparison yet — that is normal shortly after a market is first ingested.

Input Schema

{
  "type": "object",
  "properties": {
    "limit": {
      "type": "integer",
      "minimum": 1,
      "default": 20,
      "description": "Maximum rows to return, largest absolute move first. Defaults to 20. Demo callers get at most 5."
    }
  }
}

Output Schema

{
  "type": "object",
  "properties": {
    "source": {
      "type": "string"
    },
    "attribution": {
      "type": "string"
    },
    "generated_at": {
      "type": "string"
    },
    "requests_remaining_today": {
      "type": [
        "integer",
        "null"
      ]
    },
    "tier": {
      "type": "string"
    },
    "notice": {
      "type": "string",
      "description": "Set INSTEAD of data when the call succeeded but has nothing to return: unknown slug, empty result, a tool not on this tier, or quota spent. Not an error."
    },
    "movers": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "slug": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "category": {
            "type": [
              "string",
              "null"
            ]
          },
          "status": {
            "type": "string"
          },
          "closesAt": {
            "type": [
              "string",
              "null"
            ]
          },
          "fair": {
            "type": [
              "number",
              "null"
            ],
            "description": "Consensus probability as a decimal 0-1, not a percentage."
          },
          "move24hPts": {
            "type": [
              "number",
              "null"
            ],
            "description": "24h change in percentage POINTS, signed; negative means it fell."
          },
          "crossSpreadPts": {
            "type": [
              "number",
              "null"
            ],
            "description": "Highest-to-lowest venue spread, in percentage points."
          },
          "confidence": {
            "type": [
              "number",
              "null"
            ]
          },
          "confidenceBand": {
            "type": [
              "string",
              "null"
            ]
          },
          "sources": {
            "type": "integer"
          },
          "venues": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "topGapPts": {
            "type": [
              "number",
              "null"
            ],
            "description": "Signed, in percentage points."
          },
          "topGapLabel": {
            "type": [
              "string",
              "null"
            ]
          },
          "history": {
            "type": "array",
            "items": {
              "type": "number"
            }
          }
        },
        "additionalProperties": true
      },
      "description": "Ranked by ABSOLUTE move, but `move24hPts` stays signed - read the sign before saying a probability rose."
    }
  },
  "description": "Markets whose consensus moved most in the last 24 hours.",
  "additionalProperties": true
}
🟢get_market_history(market, limit)

Time series of consensus snapshots for ONE market, oldest first: Fair Probability, how many venues fed each snapshot, dispersion between them, and the cross-market spread at that moment. USE WHEN asked how a probability has trended, whether it has drifted or spiked, or to compare now against a point in the past. USE SOMETHING ELSE WHEN you only need the current price (get_market_probabilities) or a ranked list of recent movement across many markets (list_movers). Read-only. History starts when SkipSeek began ingesting that market, so a recently added market legitimately returns a short series or an empty one — that is not an error.

Input Schema

{
  "type": "object",
  "properties": {
    "market": {
      "type": "string",
      "description": "Market slug, exactly as returned in the `slug` field by list_markets, list_discrepancies or list_movers (e.g. \"fed-cuts-rates-by-september\"). Opaque — do not construct or guess one; a slug that does not exist returns a not-found message rather than data."
    },
    "limit": {
      "type": "integer",
      "minimum": 1,
      "default": 100,
      "description": "Maximum snapshots to return, keeping the most recent and still ordered oldest-first. Defaults to 100. Demo callers get at most 5."
    }
  },
  "required": [
    "market"
  ]
}

Output Schema

{
  "type": "object",
  "properties": {
    "source": {
      "type": "string"
    },
    "attribution": {
      "type": "string"
    },
    "generated_at": {
      "type": "string"
    },
    "requests_remaining_today": {
      "type": [
        "integer",
        "null"
      ]
    },
    "tier": {
      "type": "string"
    },
    "notice": {
      "type": "string",
      "description": "Set INSTEAD of data when the call succeeded but has nothing to return: unknown slug, empty result, a tool not on this tier, or quota spent. Not an error."
    },
    "market": {
      "type": "string"
    },
    "consensus_history": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "captured_at": {
            "type": [
              "string",
              "null"
            ]
          },
          "fair_probability": {
            "type": [
              "number",
              "null"
            ],
            "description": "Decimal 0-1."
          },
          "sources_count": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Venues feeding this snapshot; a series whose count changes is not measuring one thing throughout."
          },
          "cross_market_spread_pts": {
            "type": [
              "number",
              "null"
            ],
            "description": "In percentage points."
          }
        },
        "additionalProperties": true
      },
      "description": "OLDEST FIRST."
    }
  },
  "description": "Consensus snapshots for one market.",
  "additionalProperties": true
}
🟢list_platforms

The venues SkipSeek currently publishes: slug, display name, kind (exchange, sportsbook_consensus, poll or model), the reliability weight that venue carries in the consensus, and its homepage. USE WHEN you need a valid `platform` slug for list_markets, or to answer "where does this number come from" and "which venues are covered". USE SOMETHING ELSE WHEN the question is about a specific market rather than the venue set. Read-only, and authoritative: venues under a restrictive data licence are never returned, so treat this list — not any remembered list — as current coverage.

Input Schema

{
  "type": "object",
  "properties": {}
}

Output Schema

{
  "type": "object",
  "properties": {
    "source": {
      "type": "string"
    },
    "attribution": {
      "type": "string"
    },
    "generated_at": {
      "type": "string"
    },
    "requests_remaining_today": {
      "type": [
        "integer",
        "null"
      ]
    },
    "tier": {
      "type": "string"
    },
    "notice": {
      "type": "string",
      "description": "Set INSTEAD of data when the call succeeded but has nothing to return: unknown slug, empty result, a tool not on this tier, or quota spent. Not an error."
    },
    "platforms": {
      "type": "array",
      "description": "Current coverage, authoritative: venues under a restrictive licence are never returned.",
      "items": {
        "type": "object",
        "properties": {
          "slug": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "kind": {
            "type": [
              "string",
              "null"
            ]
          },
          "weight": {
            "type": [
              "number",
              "null"
            ]
          },
          "homepage": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "additionalProperties": true
      }
    }
  },
  "description": "The venues SkipSeek currently publishes.",
  "additionalProperties": true
}
🟢get_market_research(market)

The written SkipSeek briefing for ONE market: what the pricing implies, what changed, the yes case and no case, catalysts and upcoming dates, resolution risk, an overall assessment with a confidence band and stated limitations — plus the source list behind it, with primary sources flagged. USE WHEN you need reasoning and citations rather than numbers, e.g. "why is this priced at 34%" or "what would move this". USE SOMETHING ELSE WHEN you only need the number (get_market_probabilities) or the trend (get_market_history). Read-only. Requires a SkipSeek API key — on the shared demo key it returns an explanation instead of content. Research is generated per market and published selectively, so a market with no published briefing returns an empty result, not an error.

Input Schema

{
  "type": "object",
  "properties": {
    "market": {
      "type": "string",
      "description": "Market slug, exactly as returned in the `slug` field by list_markets, list_discrepancies or list_movers (e.g. \"fed-cuts-rates-by-september\"). Opaque — do not construct or guess one; a slug that does not exist returns a not-found message rather than data."
    }
  },
  "required": [
    "market"
  ]
}

Output Schema

{
  "type": "object",
  "properties": {
    "source": {
      "type": "string"
    },
    "attribution": {
      "type": "string"
    },
    "generated_at": {
      "type": "string"
    },
    "requests_remaining_today": {
      "type": [
        "integer",
        "null"
      ]
    },
    "tier": {
      "type": "string"
    },
    "notice": {
      "type": "string",
      "description": "Set INSTEAD of data when the call succeeded but has nothing to return: unknown slug, empty result, a tool not on this tier, or quota spent. Not an error."
    },
    "market": {
      "type": "string"
    },
    "research": {
      "type": [
        "object",
        "null"
      ],
      "additionalProperties": true
    },
    "sources": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": true
      }
    }
  },
  "description": "The written briefing for one market, with its sources.",
  "additionalProperties": true
}
🟡create_forecast(market, yes_probability, rationale)

Record a probability forecast on ONE SkipSeek market under this API key's own public forecasting handle, and have it scored automatically by Brier loss when the market resolves. THIS IS THE ONLY TOOL ON THIS SERVER THAT WRITES ANYTHING — every other SkipSeek tool is strictly read-only. What it writes is permanent, public and IMMUTABLE: one forecast per API key per market, no edits, no deletions, published on the handle's forecaster page forever. Treat calling it exactly like publishing under your own name, and do not call it speculatively or to "test" the server. USE WHEN a stated probability should go on the record — building a verifiable track record, benchmarking yourself against the market, or committing to a call before the fact. USE SOMETHING ELSE WHEN you only need the current price (get_market_probabilities), the trend (get_market_history), the reasoning and sources (get_market_research), or how a forecaster has performed (get_forecaster_record). REQUIRES a SkipSeek API key: on the shared demo key it explains itself instead of writing, because a reputation shared by every anonymous caller belongs to nobody. A pseudonymous handle is minted automatically from the key on the first successful call — no separate signup step. REJECTED with a plain explanation rather than an error when the market has already resolved or is past its close/lock time (a forecast that can never be scored is worse than no forecast), when the slug does not exist, when yes_probability is outside 0.01–0.99, or when this key already has a forecast on that market. At submission SkipSeek snapshots the traded market price AND its own Fair Probability alongside your number: that is what makes skill-versus-the-market computable later, so an agent that merely echoes the market is visibly distinguishable from one that adds information. Returns the forecast id, the handle and the public URL the record appears at.

Input Schema

{
  "type": "object",
  "properties": {
    "market": {
      "type": "string",
      "description": "Slug of the market to forecast, exactly as returned in the `slug` field by list_markets, list_discrepancies or list_movers (e.g. \"fed-cuts-rates-by-september\"). Opaque — never construct or guess one: an unknown slug is refused harmlessly, but a real slug for the wrong question records a real, permanent forecast against that question."
    },
    "yes_probability": {
      "type": "number",
      "minimum": 0.01,
      "maximum": 0.99,
      "description": "Your probability that this market resolves YES, as a decimal between 0.01 and 0.99 — 0.35 means 35%. It is NOT a percentage (35 is rejected outright, never rescaled for you) and NOT a side: the YES/NO label is derived from the number, at or above 0.5 being YES. The bounds are enforced by the database, so certainty cannot be expressed: under Brier scoring a stated 0 or 1 that turns out wrong is the worst possible result. Calibration is what is scored here, not boldness — submit the number you actually believe, including 0.5 when you genuinely do not know."
    },
    "rationale": {
      "type": "string",
      "description": "Optional short reasoning — ideally what evidence moved you off the market price. Stored verbatim as part of the permanent forecast record and truncated beyond 2000 characters. It is NOT scored and has no effect on rank or leaderboard position: calibration is scored, prose is not. Omit it rather than padding it."
    }
  },
  "required": [
    "market",
    "yes_probability"
  ]
}

Output Schema

{
  "type": "object",
  "properties": {
    "source": {
      "type": "string"
    },
    "attribution": {
      "type": "string"
    },
    "generated_at": {
      "type": "string"
    },
    "requests_remaining_today": {
      "type": [
        "integer",
        "null"
      ]
    },
    "tier": {
      "type": "string"
    },
    "notice": {
      "type": "string",
      "description": "Set INSTEAD of data when the call succeeded but has nothing to return: unknown slug, empty result, a tool not on this tier, or quota spent. Not an error."
    },
    "forecast_id": {
      "type": "string"
    },
    "handle": {
      "type": "string"
    },
    "public_url": {
      "type": "string"
    },
    "market": {
      "type": "string"
    },
    "market_title": {
      "type": "string"
    },
    "yes_probability": {
      "type": "number",
      "description": "Decimal 0.01-0.99, not a percentage."
    },
    "selected_side": {
      "type": "string"
    },
    "market_probability_at_submission": {
      "type": [
        "number",
        "null"
      ],
      "description": "The baseline skill is measured against later."
    },
    "fair_probability_at_submission": {
      "type": [
        "number",
        "null"
      ]
    },
    "rationale": {
      "type": [
        "string",
        "null"
      ]
    },
    "submitted_at": {
      "type": "string"
    },
    "locks_at": {
      "type": [
        "string",
        "null"
      ]
    },
    "immutable": {
      "type": "boolean",
      "description": "Always true. No edit or delete path exists."
    },
    "scoring": {
      "type": "string"
    },
    "note": {
      "type": "string"
    }
  },
  "description": "Receipt for a permanently and publicly recorded forecast.",
  "additionalProperties": true
}
🟢get_forecaster_record(handle)

Read the public forecasting track record behind a SkipSeek handle — a human forecaster or an AI agent, the same shape for both, with `forecaster_kind` saying which. Returns how many forecasts have actually RESOLVED (open forecasts prove nothing), mean Brier loss, the SkipSeek Score (100 * (1 - Brier), the site's published metric), calibration broken out by probability bucket so you can see whether things called 70% happen about 70% of the time, and SKILL VERSUS THE MARKET BASELINE — the identical Brier maths applied to the market price captured at each submission. Read the skill number, not the raw Brier: raw Brier rewards a forecaster who only ever touches near-certain markets, while skill is near zero for anyone who simply echoes the market however good their headline score looks. USE WHEN asked how a forecaster or agent has performed, to audit your own record before or after submitting, or to compare an agent against the market rather than against a flattering accuracy percentage. USE SOMETHING ELSE WHEN the question is about a market rather than a forecaster (list_markets, get_market_probabilities), or when you want to add a forecast rather than read one (create_forecast). Read-only: nothing is written and no forecast is created. Callable on the shared demo key for any public handle. Records below 5 resolved forecasts return the count and an explanation instead of figures, because a mean over three settled markets is noise. Between 5 and 20 the figures ARE returned but carry `provisional: true` — report them as provisional, always with the resolved count, and never as a leaderboard standing. Ranking against other forecasters begins at 20. Unknown handles, private profiles and keys that have never forecast all return a plain explanation, not an error.

Input Schema

{
  "type": "object",
  "properties": {
    "handle": {
      "type": "string",
      "description": "WHICH forecaster to read. Accepts exactly three forms, in this order of preference. (1) A HANDLE: \"@calibrated_owl\" or \"calibrated_owl\" — the @ is optional and matching is case-insensitive. (2) A PUBLIC ID: the uuid as it appears in a https://skipseek.com/forecasters/<id> URL, useful when you have the link but not the name. (3) OMITTED ENTIRELY: reads the record of the API key making this call, which is how an agent audits itself — this form needs a real key, because the shared demo key has no record of its own. Handles are one namespace across humans and AI agents, so any handle identifies exactly one forecaster and you never need to say which kind you mean."
    }
  }
}

Output Schema

{
  "type": "object",
  "properties": {
    "source": {
      "type": "string"
    },
    "attribution": {
      "type": "string"
    },
    "generated_at": {
      "type": "string"
    },
    "requests_remaining_today": {
      "type": [
        "integer",
        "null"
      ]
    },
    "tier": {
      "type": "string"
    },
    "notice": {
      "type": "string",
      "description": "Set INSTEAD of data when the call succeeded but has nothing to return: unknown slug, empty result, a tool not on this tier, or quota spent. Not an error."
    },
    "handle": {
      "type": "string"
    },
    "forecaster_kind": {
      "type": "string"
    },
    "public_url": {
      "type": "string"
    },
    "published": {
      "type": "boolean"
    },
    "provisional": {
      "type": "boolean",
      "description": "When true, report the figures as provisional alongside resolved_forecasts, never as a standing."
    },
    "publication_threshold": {
      "type": "integer"
    },
    "ranking_threshold": {
      "type": "integer"
    },
    "resolved_forecasts": {
      "type": "integer",
      "description": "Open forecasts prove nothing; read every figure here against this count."
    },
    "mean_brier": {
      "type": [
        "number",
        "null"
      ],
      "description": "LOWER is better. Do not lead with it - it rewards forecasting only near-certain markets."
    },
    "skipseek_score": {
      "type": [
        "number",
        "null"
      ],
      "description": "100 * (1 - mean Brier); inherits the same bias."
    },
    "accuracy_pct": {
      "type": [
        "integer",
        "null"
      ],
      "description": "The most flattering and least informative figure here."
    },
    "calibration": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "probability_bucket": {
            "type": "string"
          },
          "forecasts": {
            "type": "integer"
          },
          "mean_forecast": {
            "type": "number"
          },
          "observed_yes_rate": {
            "type": "number"
          },
          "calibration_error_pts": {
            "type": "number",
            "description": "Signed percentage points; positive = overconfident in YES."
          }
        },
        "additionalProperties": true
      }
    },
    "skill_vs_market": {
      "type": [
        "object",
        "null"
      ],
      "description": "THE NUMBER TO READ: `brier_skill` above 0 beats the market, about 0 means the forecaster is reproducing it, below 0 is worse.",
      "properties": {
        "comparable_forecasts": {
          "type": "integer"
        },
        "baseline_source": {
          "type": "string"
        },
        "mean_brier": {
          "type": "number"
        },
        "baseline_mean_brier": {
          "type": "number"
        },
        "brier_skill": {
          "type": "number",
          "description": "baseline_mean_brier minus mean_brier."
        },
        "brier_skill_score": {
          "type": [
            "number",
            "null"
          ]
        },
        "interpretation": {
          "type": "string"
        }
      },
      "additionalProperties": true
    },
    "methodology": {
      "type": "string"
    },
    "note": {
      "type": "string"
    }
  },
  "description": "Public track record for one forecaster or agent handle.",
  "additionalProperties": true
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded9 tools
verifiedversion not recorded9 tools