Koskamo

groundhog.markets MCP

An official MCP server providing free, keyless access to global weather forecasts, market rules for Kalshi and Polymarket, and historical data. It aggregates median forecasts from multiple sources like NOAA and ECMWF for over 800 locations, supporting tools for forecasting, market tracking, and data retrieval via Streamable HTTP.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

groundhog.markets MCP logo, by groundhog.marketsVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-01Operated by groundhog.markets
MCP endpoint (Streamable HTTP)
https://groundhog.markets/mcp
Vendor documentation

What you can do with it

  • Retrieve median daily high and low weather forecasts for specific locations
  • Access weather market rules and settlement data for Kalshi and Polymarket
  • Query historical weather observations and model runs without look-ahead bias
  • Search for places and retrieve source licensing information

Source and maintenance

Vendor evidenceRegistry 1.2.0

Protocol and capabilities

Server
groundhog 1.2.0
MCP protocol
2025-06-18
Tools
8 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": false
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

Weather for any place: forecast (size=line, week or table; date=today, tomorrow or +N; variable=rain for rain) and markets(place) for each weather market's station, rule and number so far. Units are in every answer. Keep the Credits line and link the Page URL when you repeat numbers.

Tools

8 advertised

forecast — Forecast blend
Advertised by the server during the last successful anonymous check.
Advertised read-only

Daily high/low for any place from every free forecast: median, spread, rain, current obs and active alerts, with credits and the page URL. line ≈321 tok, week ≈566, table ≈1,567, series ≈1,564. Keep the credits and link the page when you repeat numbers. size=runs: one place, each source's newest runs by day with run_utc and fetched_at; NBM adds XND, P12, Q12. variable=rain: members' share of 0.01 in or more and heavier (n = model families), NBM calibrated, amounts by source, so far today, month to date; rain line ≈647 tok, table ≈1,955.

forecast input schema
{
  "type": "object",
  "required": [
    "place"
  ],
  "properties": {
    "all": {
      "type": "boolean",
      "description": "table: also twin and stale rows"
    },
    "stn": {
      "type": "string",
      "description": "rain: a settle station of the place, e.g. KORD"
    },
    "win": {
      "enum": [
        "lst",
        "cal"
      ],
      "type": "string",
      "description": "rain: lst = the climate day at a daily-rain settle station, cal = calendar day"
    },
    "date": {
      "type": "string",
      "description": "today | tomorrow | +N (0-7) | YYYY-MM-DD, each place's local date. Default: today before 15:00 local, else tomorrow."
    },
    "days": {
      "type": "integer",
      "maximum": 7,
      "minimum": 1,
      "description": "week/table days (default 7)"
    },
    "runs": {
      "type": "integer",
      "maximum": 4,
      "minimum": 1,
      "description": "size=runs: newest runs per source (1)"
    },
    "size": {
      "enum": [
        "line",
        "week",
        "table",
        "series",
        "runs"
      ],
      "type": "string",
      "description": "default line; runs = each source's newest runs by day (trading fields)"
    },
    "step": {
      "enum": [
        1,
        3,
        6
      ],
      "type": "integer",
      "description": "series step hours (temp 3, rain 6)"
    },
    "hours": {
      "type": "integer",
      "maximum": 168,
      "minimum": 24,
      "description": "series hours (72)"
    },
    "place": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "array",
          "items": {
            "type": "string"
          },
          "maxItems": 10,
          "minItems": 1
        }
      ],
      "description": "Slug, name, 'City, ST', 'City, Country', ICAO or 'lat,lon'. An array (up to 10) for line/week."
    },
    "units": {
      "enum": [
        "F",
        "C"
      ],
      "type": "string",
      "description": "default F in the US, else C; rain in inches with F, mm with C"
    },
    "format": {
      "enum": [
        "md",
        "tsv",
        "json"
      ],
      "type": "string",
      "description": "line md, others tsv"
    },
    "credits": {
      "enum": [
        "compact",
        "full",
        "short"
      ],
      "type": "string"
    },
    "variable": {
      "enum": [
        "temp",
        "rain"
      ],
      "type": "string",
      "description": "temp (default) or rain"
    },
    "include_6h": {
      "type": "boolean",
      "description": "temp only: also count 6-hourly (~) days"
    }
  },
  "additionalProperties": false
}
forecast annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
places — Find a place
Advertised by the server during the last successful anonymous check.
Advertised read-only

Find a place slug by name, City, ST, airport code or lat,lon; says full blend or grid only.

places input schema
{
  "type": "object",
  "required": [
    "q"
  ],
  "properties": {
    "q": {
      "type": "string"
    },
    "limit": {
      "type": "integer",
      "maximum": 10,
      "minimum": 1
    }
  },
  "additionalProperties": false
}
places annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
sources — Sources
Advertised by the server during the last successful anonymous check.
Advertised read-only

Open sources groundhog uses: licence, latest run, age, status.

sources input schema
{
  "type": "object",
  "properties": {},
  "additionalProperties": false
}
sources annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
markets — Weather markets
Advertised by the server during the last successful anonymous check.
Advertised read-only

Weather markets in a place (Kalshi, Polymarket high/low/rain): settlement station and rule, the number so far under that rule, our value and the official result once settled, forecast daily max/min at the station. No prices. Needs place or family. line ≈526 tok, table ≈1,757; every city ≈36,291. With neither: the list of market cities.

markets input schema
{
  "type": "object",
  "properties": {
    "date": {
      "type": "string",
      "description": "today | tomorrow | yesterday | YYYY-MM-DD, each place's local date (default today)"
    },
    "size": {
      "enum": [
        "line",
        "table"
      ],
      "type": "string",
      "description": "line (default with place) | table (default without)"
    },
    "place": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "array",
          "items": {
            "type": "string"
          },
          "maxItems": 10,
          "minItems": 1
        }
      ],
      "description": "Slug, name, 'City, ST' or ICAO; an array for up to 10 places"
    },
    "family": {
      "enum": [
        "high",
        "low",
        "rain",
        "all"
      ],
      "type": "string",
      "description": "high | low | rain | all (default all); alone: every market city"
    },
    "format": {
      "enum": [
        "md",
        "tsv",
        "json"
      ],
      "type": "string",
      "description": "line md, table tsv"
    },
    "credits": {
      "enum": [
        "compact",
        "full",
        "short"
      ],
      "type": "string"
    }
  },
  "additionalProperties": false
}
markets annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
receipts — Market receipts
Advertised by the server during the last successful anonymous check.
Advertised read-only

How often our settle value matched the venue's result, with every miss. No prices.

receipts input schema
{
  "type": "object",
  "properties": {
    "days": {
      "type": "integer",
      "maximum": 30,
      "minimum": 1,
      "description": "last N days (30)"
    },
    "venue": {
      "enum": [
        "kalshi",
        "polymarket"
      ],
      "type": "string"
    },
    "family": {
      "enum": [
        "high",
        "low",
        "rain",
        "all"
      ],
      "type": "string"
    },
    "format": {
      "enum": [
        "md",
        "tsv",
        "json"
      ],
      "type": "string",
      "description": "default tsv"
    }
  },
  "additionalProperties": false
}
receipts annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
search — Search places
Advertised by the server during the last successful anonymous check.
Advertised read-only

Search places by name, City, ST, airport code or lat,lon. Returns {results: [{id, title, url, text}]}; pass an id to fetch.

search input schema
{
  "type": "object",
  "required": [
    "query"
  ],
  "properties": {
    "query": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
search annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
fetch — Fetch a place
Advertised by the server during the last successful anonymous check.
Advertised read-only

The 7-day forecast of a place id from search: {id, title, text, url, metadata}. Keep the credits and link the url when you repeat numbers.

fetch input schema
{
  "type": "object",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
fetch annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
history — As-issued history
Advertised by the server during the last successful anonymous check.
Advertised read-only

As-issued history for backtests (no look-ahead): kind=daily (every source's daily hi/lo/rain per run at a place), nbm (NBM text columns: TXN, XND, P12, Q12; view=day = the books' day view) or obs (settlement truth: CLI, routine-METAR max/min). from/to (<= 366 days, 1 unit per 31 days); run=ISO | lead=N (+cycle=H: the run issued N days before) | asof=ISO (what was known then). Rows carry fetched_at and origin (bf:* = backfilled). TSV by default.

history input schema
{
  "type": "object",
  "required": [
    "from"
  ],
  "properties": {
    "to": {
      "type": "string",
      "description": "last target date (default from)"
    },
    "els": {
      "type": "string",
      "description": "kind=nbm: elements, comma list (TXN,XND,P12,Q12,TMP)"
    },
    "run": {
      "type": "string",
      "description": "one run, YYYY-MM-DDTHH:MMZ"
    },
    "stn": {
      "type": "string",
      "description": "ICAO (kind=nbm, obs)"
    },
    "asof": {
      "type": "string",
      "description": "newest run fetched by this UTC time (no look-ahead)"
    },
    "from": {
      "type": "string",
      "description": "first target date YYYY-MM-DD"
    },
    "kind": {
      "enum": [
        "daily",
        "nbm",
        "obs"
      ],
      "type": "string",
      "description": "daily (default) | nbm | obs"
    },
    "lead": {
      "type": "integer",
      "maximum": 15,
      "minimum": 0,
      "description": "the run issued N UTC days before each date"
    },
    "prod": {
      "enum": [
        "nbe",
        "nbs"
      ],
      "type": "string",
      "description": "kind=nbm: nbe (default) | nbs"
    },
    "view": {
      "enum": [
        "raw",
        "day"
      ],
      "type": "string",
      "description": "kind=nbm: raw (default) | day"
    },
    "cycle": {
      "type": "integer",
      "maximum": 23,
      "minimum": 0,
      "description": "with lead: only runs at H UTC"
    },
    "place": {
      "type": "string",
      "description": "slug, name or ICAO (kind=daily; nbm/obs: its station)"
    },
    "format": {
      "enum": [
        "tsv",
        "json"
      ],
      "type": "string",
      "description": "tsv (default) | json"
    },
    "source": {
      "type": "string",
      "description": "kind=daily: source ids, comma list (e.g. nbm,gfs,ifs)"
    },
    "product": {
      "enum": [
        "CLI",
        "METAR_R",
        "ASOS"
      ],
      "type": "string",
      "description": "kind=obs"
    }
  },
  "additionalProperties": false
}
history annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

Not advertised

No resource definitions available.

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
467 ms
95th percentile latency
467 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 467 ms · metadata changed · 8 tool(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http groundhog-markets-mcp https://groundhog.markets/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add groundhog-markets-mcp --url https://groundhog.markets/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable groundhog-markets-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "groundhog-markets-mcp": {
      "url": "https://groundhog.markets/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "groundhog-markets-mcp": {
      "type": "streamableHttp",
      "url": "https://groundhog.markets/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start groundhog-markets-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "groundhog-markets-mcp": {
      "type": "http",
      "url": "https://groundhog.markets/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http groundhog-markets-mcp https://groundhog.markets/mcp

Claude Desktop

Merge this into claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\), then restart Claude Desktop.
Claude Desktop configuration
{
  "mcpServers": {
    "groundhog-markets-mcp": {
      "url": "https://groundhog.markets/mcp"
    }
  }
}

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "groundhog-markets-mcp": {
      "serverUrl": "https://groundhog.markets/mcp"
    }
  }
}

Let your agent find its tools

Find servers like groundhog.markets MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.

Do you run groundhog.markets MCP?

Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.

Claim this listing