skipseek
Server Details
Polymarket, Manifold, Metaculus compared: one fair probability per question. No API key needed.
The last two health checks of this connector failed. If this server requires authentication, missing or expired test credentials may be the cause. A test profile lets Glama authenticate for health checks and discover tools; it is separate from your personal connections.
If you are the author, claim ownership, then add or update a test profile under Admin → Test Profile.
- Status
- Unhealthy
- Uptime
- 81.1% over 75 days
- Last Tested
- Transport
- Streamable HTTP
- URL
TDQS
Scored across 9 tools
Every tool targets a distinct resource and action: create_forecast is the only write tool, get_* reads single entities (market probabilities, history, research, forecaster record), and list_* scans collections (markets, movers, discrepancies, platforms). No two tools overlap in purpose, and the three market reads are clearly separated as current vs. historical vs. qualitative.
All tool names follow a consistent snake_case verb_noun pattern: get_ for single-item reads, list_ for collection reads, and create_ for the sole write operation. There are no mixed conventions or vague verbs.
9 tools is well-scoped for a prediction-market server: one deliberate write action, four single-market/forecaster reads, and four collection-browsing tools. Nothing feels redundant, and the count is right in the sweet spot for the domain.
The server covers the core workflow: discover markets (list_markets), analyze current price/history/research (get_market_*), detect cross-venue disagreement and movement (list_discrepancies, list_movers, list_platforms), and commit a forecast (create_forecast) with auditing via get_forecaster_record. A minor gap is the lack of a tool to fetch a single forecast's details after submission, though the returned URL and aggregate record mitigate this.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
13 tool updates
- Added
create_forecast - Removed
find_discrepancies - Changed
get_forecaster_record1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "description": "Public track record for one forecaster or agent handle.", + "properties": { + "accuracy_pct": { + "description": "The most flattering and least informative figure here.", + "type": [ + "integer", + "null" + ] + }, + "attribution": { + "type": "string" + }, + "calibration": { + "items": { + "additionalProperties": true, + "properties": { + "calibration_error_pts": { + "description": "Signed percentage points; positive = overconfident in YES.", + "type": "number" + }, + "forecasts": { + "type": "integer" + }, + "mean_forecast": { + "type": "number" + }, + "observed_yes_rate": { + "type": "number" + }, + "probability_bucket": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "forecaster_kind": { + "type": "string" + }, + "generated_at": { + "type": "string" + }, + "handle": { + "type": "string" + }, + "mean_brier": { + "description": "LOWER is better. Do not lead with it - it rewards forecasting only near-certain markets.", + "type": [ + "number", + "null" + ] + }, + "methodology": { + "type": "string" + }, + "note": { + "type": "string" + }, + "notice": { + "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.", + "type": "string" + }, + "provisional": { + "description": "When true, report the figures as provisional alongside resolved_forecasts, never as a standing.", + "type": "boolean" + }, + "public_url": { + "type": "string" + }, + "publication_threshold": { + "type": "integer" + }, + "published": { + "type": "boolean" + }, + "ranking_threshold": { + "type": "integer" + }, + "requests_remaining_today": { + "type": [ + "integer", + "null" + ] + }, + "resolved_forecasts": { + "description": "Open forecasts prove nothing; read every figure here against this count.", + "type": "integer" + }, + "skill_vs_market": { + "additionalProperties": true, + "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": { + "baseline_mean_brier": { + "type": "number" + }, + "baseline_source": { + "type": "string" + }, + "brier_skill": { + "description": "baseline_mean_brier minus mean_brier.", + "type": "number" + }, + "brier_skill_score": { + "type": [ + "number", + "null" + ] + }, + "comparable_forecasts": { + "type": "integer" + }, + "interpretation": { + "type": "string" + }, + "mean_brier": { + "type": "number" + } + }, + "type": [ + "object", + "null" + ] + }, + "skipseek_score": { + "description": "100 * (1 - mean Brier); inherits the same bias.", + "type": [ + "number", + "null" + ] + }, + "source": { + "type": "string" + }, + "tier": { + "type": "string" + } + }, + "type": "object" +}
- Changed
get_market_history2 fields changed- changed
Input schema / properties / market / descriptionPrevious value: -"Market slug, exactly as returned in the `slug` field by list_markets, find_discrepancies or get_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."New value: +"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." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "description": "Consensus snapshots for one market.", + "properties": { + "attribution": { + "type": "string" + }, + "consensus_history": { + "description": "OLDEST FIRST.", + "items": { + "additionalProperties": true, + "properties": { + "captured_at": { + "type": [ + "string", + "null" + ] + }, + "cross_market_spread_pts": { + "description": "In percentage points.", + "type": [ + "number", + "null" + ] + }, + "fair_probability": { + "description": "Decimal 0-1.", + "type": [ + "number", + "null" + ] + }, + "sources_count": { + "description": "Venues feeding this snapshot; a series whose count changes is not measuring one thing throughout.", + "type": [ + "integer", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + "generated_at": { + "type": "string" + }, + "market": { + "type": "string" + }, + "notice": { + "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.", + "type": "string" + }, + "requests_remaining_today": { + "type": [ + "integer", + "null" + ] + }, + "source": { + "type": "string" + }, + "tier": { + "type": "string" + } + }, + "type": "object" +}
- Changed
get_market_probabilities2 fields changed- changed
Input schema / properties / market / descriptionPrevious value: -"Market slug, exactly as returned in the `slug` field by list_markets, find_discrepancies or get_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."New value: +"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." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "description": "Current cross-venue picture for one market.", + "properties": { + "attribution": { + "type": "string" + }, + "confidence": { + "additionalProperties": true, + "type": [ + "object", + "null" + ] + }, + "fair_probability": { + "description": "Decimal 0-1.", + "type": [ + "number", + "null" + ] + }, + "gaps": { + "items": { + "additionalProperties": true, + "properties": { + "captured_at": { + "type": [ + "string", + "null" + ] + }, + "gap_points": { + "description": "Signed distance from fair value in percentage POINTS; positive = venue prices it higher.", + "type": [ + "number", + "null" + ] + }, + "label": { + "type": [ + "string", + "null" + ] + }, + "platform_id": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "generated_at": { + "type": "string" + }, + "market": { + "type": "string" + }, + "notice": { + "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.", + "type": "string" + }, + "requests_remaining_today": { + "type": [ + "integer", + "null" + ] + }, + "source": { + "type": "string" + }, + "sources": { + "items": { + "additionalProperties": true, + "properties": { + "match_type": { + "description": "How closely this contract matches the standardized question; a loose match discounts the gap.", + "type": [ + "string", + "null" + ] + }, + "price": { + "description": "That venue's own probability, 0-1, before consensus weighting.", + "type": [ + "number", + "null" + ] + }, + "type": { + "type": [ + "string", + "null" + ] + }, + "venue": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + "tier": { + "type": "string" + } + }, + "type": "object" +}
- Added
get_market_research - Removed
get_movers - Added
list_discrepancies - Changed
list_markets1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "description": "The SkipSeek board, filtered and ordered as requested.", + "properties": { + "attribution": { + "type": "string" + }, + "generated_at": { + "type": "string" + }, + "markets": { + "items": { + "additionalProperties": true, + "properties": { + "category": { + "type": [ + "string", + "null" + ] + }, + "closesAt": { + "type": [ + "string", + "null" + ] + }, + "confidence": { + "type": [ + "number", + "null" + ] + }, + "confidenceBand": { + "type": [ + "string", + "null" + ] + }, + "crossSpreadPts": { + "description": "Highest-to-lowest venue spread, in percentage points.", + "type": [ + "number", + "null" + ] + }, + "fair": { + "description": "Consensus probability as a decimal 0-1, not a percentage.", + "type": [ + "number", + "null" + ] + }, + "history": { + "items": { + "type": "number" + }, + "type": "array" + }, + "id": { + "type": "string" + }, + "move24hPts": { + "description": "24h change in percentage POINTS, signed; negative means it fell.", + "type": [ + "number", + "null" + ] + }, + "slug": { + "type": "string" + }, + "sources": { + "type": "integer" + }, + "status": { + "type": "string" + }, + "title": { + "type": "string" + }, + "topGapLabel": { + "type": [ + "string", + "null" + ] + }, + "topGapPts": { + "description": "Signed, in percentage points.", + "type": [ + "number", + "null" + ] + }, + "venues": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "array" + }, + "notice": { + "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.", + "type": "string" + }, + "requests_remaining_today": { + "type": [ + "integer", + "null" + ] + }, + "source": { + "type": "string" + }, + "tier": { + "type": "string" + } + }, + "type": "object" +}
- Added
list_movers - Changed
list_platforms1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "description": "The venues SkipSeek currently publishes.", + "properties": { + "attribution": { + "type": "string" + }, + "generated_at": { + "type": "string" + }, + "notice": { + "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.", + "type": "string" + }, + "platforms": { + "description": "Current coverage, authoritative: venues under a restrictive licence are never returned.", + "items": { + "additionalProperties": true, + "properties": { + "homepage": { + "type": [ + "string", + "null" + ] + }, + "kind": { + "type": [ + "string", + "null" + ] + }, + "name": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "weight": { + "type": [ + "number", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + "requests_remaining_today": { + "type": [ + "integer", + "null" + ] + }, + "source": { + "type": "string" + }, + "tier": { + "type": "string" + } + }, + "type": "object" +}
- Removed
research_market - Removed
submit_forecast
1 tool update
- Changed
get_forecaster_record1 field changed- changed
Input schema / properties / handle / descriptionPrevious value: -"The forecaster's public handle, with or without a leading @ (both \"@calibrated_owl\" and \"calibrated_owl\" work), or the profile's public id as it appears in a https://skipseek.com/forecasters/<id> URL. Case-insensitive. Handles are a single namespace across humans and agents, so one handle identifies exactly one forecaster. Omit it to read the record of the API key making the call — which needs a real key, since the shared demo key has no record of its own."New value: +"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."
2 tool updates
- Added
get_market_history - Removed
market_history
9 tool updates
- First observed
find_discrepancies - First observed
get_forecaster_record - First observed
get_market_probabilities - First observed
get_movers - First observed
list_markets - First observed
list_platforms - First observed
market_history - First observed
research_market - First observed
submit_forecast
Related MCP Connectors
Cross-venue prediction market odds (Polymarket, Kalshi, PredictIt, Manifold) with arbitrage signals
Same market on Polymarket and Kalshi: both prices, the gap, edge, alerts and history. Sports too.
Polymarket, Kalshi + 6 more prediction markets: live odds, volume, movers. Read-only, no auth.
Live prediction markets: Polymarket + Kalshi prices, odds, order books. Pay-per-call USDC, no key.
Related MCP Servers
- AlicenseAqualityDmaintenanceAggregates prediction market data from 5 major platforms (Manifold, Polymarket, Metaculus, PredictIt, Kalshi), enabling users to search markets, compare odds across platforms, detect arbitrage opportunities, and track predictions through natural language.83MIT
- AlicenseAqualityDmaintenancePrediction market probability oracle for AI agents. 26 tools across 500+ live markets from Kalshi and Polymarket. Cross-source arbitrage detection, structured TPF signals, Kelly Criterion sizing, agent performance tracking, and webhook alerts.974 npm1MIT
- FlicenseNot gradedqualityDmaintenanceTrade and monitor prediction markets across Polymarket, Kalshi, Opinion, Limitless, and PredictFun from any AI agent. Unified real-time data, live orderbook streaming, and order execution — one API key, one interface, five exchanges.-
- AlicenseAqualityBmaintenance24/7 autonomous monitoring and edge detection for prediction markets (Kalshi & Polymarket). Features causal tree analysis, orderbook depth tracking, cross-venue comparison, and real-time alerts.16196 npm12MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.