# dino.markets (remote · api.dino.markets)

Matched Kalshi and Polymarket markets across sports, crypto, weather, and economics over MCP.

- Trust score: 60/100 (medium)
- Change this week: +6
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-03

## Components

- remote · `api.dino.markets`: 60/100 (this document), [markdown](https://verifymcp.io/servers/markets-dino-mcp/v2-mcp.md), [page](https://verifymcp.io/servers/markets-dino-mcp/v2-mcp)

## Channel facts

- Endpoint: `https://api.dino.markets/v2/mcp/`
- Transports: `streamable-http`
- Auth: `none`
- Version: `2.0.0`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-08-03.

- **Endpoint Security**: 57/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - Authorisation not fully verified: no authorisation is required to call this server, and 10 tool(s) never declared a destructiveHint. The MCP spec treats an absent hint as destructive by default, so we cannot call this surface safe.
  - HTTPS is enforced; there's no plaintext access path.
  - HSTS check failed: the Strict-Transport-Security header is absent.
  - DNSSEC check failed: this domain isn't protected by DNSSEC.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 56/100
  - AI-judged instruction clarity (good).
  - Context-footprint check failed: tool/resource definitions use about 2341 tokens (~234/item across 10 items; 10 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 27/100
  - Stability observed for 8 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 71/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 0% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### Claude

```bash
claude mcp add --transport http markets-dino-mcp https://api.dino.markets/v2/mcp/
```

### Codex

```toml
[mcp_servers.markets-dino-mcp]
url = "https://api.dino.markets/v2/mcp/"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "markets-dino-mcp": {
      "type": "remote",
      "url": "https://api.dino.markets/v2/mcp/",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add markets-dino-mcp --url https://api.dino.markets/v2/mcp/ --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  markets-dino-mcp:
    url: "https://api.dino.markets/v2/mcp/"
```

### Other

```json
{
  "mcpServers": {
    "markets-dino-mcp": {
      "type": "http",
      "url": "https://api.dino.markets/v2/mcp/"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-08-02 (score 60, +1)

No change was recorded against any check on this day. Stability & Change Management went from 20 to 23. That category is still filling its 30-day observation window: 6 days of observed history at the previous scan, 7 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-07-31 (score 59, +2)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-30 (score 57, +1)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-29 (score 56, +1)

No change was recorded against any check on this day. Stability & Change Management went from 7 to 10. That category is still filling its 30-day observation window: 2 days of observed history at the previous scan, 3 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-07-28 (score 55, +1)

No change was recorded against any check on this day. Stability & Change Management went from 3 to 7. That category is still filling its 30-day observation window: 1 days of observed history at the previous scan, 2 at this one. The score rises as the window fills, whether or not the server changes. Other categories moved too: Schema Quality & AI Usability rose 1.

### 2026-07-27 (score 54, 0)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-26 (score 54)

First indexed and scored.

## MCP tools (10)

### `list_markets` (~662 tokens)

List the matched, unified cross-venue catalog as canonical market objects. Each object has id, slug, title, category, market_type, typed context, status, signal, spread_pts, potential_arb_pct, coverage, outcomes (with kalshi/polymarket prices), links, and more. Filter by category and valid context fields, status (open/live/resolving/closed/settled — resolving means the game has ended and settlement is pending), signal (spread or candidates). Sort by start_time (default) or -spread_pts. Arbitrage is a distinct native Opportunity shape, so signal=arb is rejected explicitly; call find_arbitrage instead. Sports support sport+competition (sport keys: baseball, basketball, football, hockey, soccer, tennis, cricket, lol, dota2, valorant, cs2, r6, ow, mma); weather supports location; crypto supports asset; economics supports indicator or institution. market_type (comma-separated: moneyline, outright, total, spread, team_total, advance, weather_high, weather_low, crypto_above, fed_decision, econ_print, cb_decision, or 'all') opts into the derivative families; the default stays moneyline+outright. weather_high/weather_low/crypto_above/fed_decision/econ_print/cb_decision rows are LADDER markets (own row, no game anchor) with per-leg relation (EXACT|OVERLAPS|DERIVED); every ladder row's kalshi_ladder serves the full priced Kalshi bucket axis alongside the served outcomes. weather_high/weather_low: temperature buckets, kalshi_span discloses a 1°F bracket offset, basis discloses the settlement station. crypto_above: cumulative price-threshold legs (not mutually exclusive), band REVIEW always (venues fix at different times off different sources, boundary semantics differ). fed_decision/cb_decision: fixed 5-way rate-decision enum, band REVIEW pending cancellation-handling verification. econ_print: Polymarket bucket axis; relation DERIVED marks a leg whose only Kalshi backing is the cumulative ladder — it serves the Polymarket price alone (kalshi null, never fabricated); factors.po…

Input parameters:

- `asset`
- `basis`
- `category`
- `competition`
- `indicator`
- `institution`
- `limit` (integer)
- `location`
- `market_type`
- `signal`
- `sort`
- `sport`
- `status`

### `find_arbitrage` (~254 tokens)

Find current confirmed cross-venue arbitrage opportunities between Kalshi and Polymarket. Mirrors GET /v2/arbitrage and returns Opportunity objects, not Market objects: one exact selected execution leg per outcome with ask_usd, stake_fraction, available_contracts, contract_id, and URL. edge_pct and roi_pct include venue fees under fee_model='conservative_per_contract'; max_wager_usd is a conservative fee-inclusive capital estimate because quantity-level venue rounding can differ. The envelope includes as_of and delay_seconds. All values remain snapshot observations, not guarantees. Optionally filter by sport (broad key: baseball, basketball, football, hockey, soccer, tennis, cricket, lol, dota2, valorant, cs2, r6, ow, mma). This REST snapshot is best-effort and about two minutes delayed on every tier — NOT execution-grade. The real-time, gapless, execution-grade feed is the WebSocket push (Basic/Premium/Pro get the full market stream; Free gets a curated `sample` taste); use watch_markets to get a stream ticket. Free to any active dino.markets key.

Input parameters:

- `limit` (integer)
- `sport`

### `get_market` (~207 tokens)

Fetch the canonical market object for a single market by its id. Accepts `dino_<uuid>` (from list_markets or find_arbitrage.market_id), a bare UUID, or a persisted slug — the same id resolution as get_settlement. Returns the full canonical object with settlement disclosure (settlement.parity, settlement.risks[]), venue ids, and depth (if priced). Cache this aggressively — settlement changes only when the matcher re-analyses the live text (updated_at moves). Prices change frequently (priced_at). Known limitation: a currently fired arb can still appear as signal='spread' here because this canonical Market view requires both venue prices for every outcome while the arb ledger stores only the selected execution venue per outcome. Use find_arbitrage for the native opportunity shape. Returns 404 if the market is not found. Mirrors GET /v2/pairs/{id}. Free to any active dino.markets key.

Input parameters:

- `id` (string, required)

### `get_settlement` (~155 tokens)

Fetch the identity + settlement view of a single market: `{id, slug, title, status, settlement}`. Accepts `dino_<uuid>`, a bare UUID, or a persisted slug. Skips the price join get_market does — settlement is static fine print (parity, risks[], venue text, verdict), not a live quote, so this is cheaper to call and cacheable until updated_at moves. Never returns the raw per-venue Kalshi winner, only the cross-venue agree/diverge verdict. Returns 404 if the market is not found. Mirrors GET /v2/pairs/{id}/settlement. Free to any active dino.markets key.

Input parameters:

- `id` (string, required)

### `list_categories` (~44 tokens)

List normalized market categories, market types, and category-valid contextual facets. Call this first to discover valid filters for the other tools. Free to any active dino.markets key.

### `find_markets` (~251 tokens)

Free-text market/event lookup by team, competition, context, or market title. This is the AGENT FRONT DOOR: call find_markets FIRST to resolve a team or competition name (e.g. 'Yankees', 'EPL', 'Lakers vs Celtics') into a market id before calling get_market, list_markets, or get_spreads — an agent that can't find a market can't use anything else. Matches case-insensitively against team, category, contextual facets, market_type, slugs, and native venue ids. Returns lean canonical market objects (identity only, no live prices, same shape as list_markets) so lookups stay fast; hand the returned id to get_market for pricing and settlement detail. Paginated (page/page_size, max 50 per page). Filter by category, sport, and status (open/live/resolving/closed/settled — default open,live). Mirrors GET /v2/search. Free to any active dino.markets key.

Input parameters:

- `category`
- `page` (integer)
- `page_size` (integer)
- `q` (string, required)
- `sport`
- `status`

### `get_spreads` (~208 tokens)

Cross-venue price-gap view over matched pairs whose resolution rule marks them spread-only (never arb-fireable) but that carry a live, disclosed cross-venue price gap. Only verified-band (EXACT/HIGH) rows are returned — this tool inherits the /v2/spreads band allowlist verbatim and never re-filters it. Optionally filter by category, its explicit context fields, and a minimum spread_pts gap (min_gap), capped by limit. Call find_markets first if you need to resolve a team, competition, or context name into a market id to cross-reference a specific game. Mirrors GET /v2/spreads. Free to any active dino.markets key, no tier-specific gate.

Input parameters:

- `asset`
- `basis`
- `category`
- `competition`
- `indicator`
- `institution`
- `limit` (integer)
- `location`
- `min_gap`
- `sport`

### `get_coverage` (~25 tokens)

Internal coverage census for the matched feed. Most integrations want find_markets instead.

### `report_bad_arb` (~98 tokens)

Flag a bad or incorrect arbitrage opportunity for operator review. For opp_id, pass the Opportunity id returned by find_arbitrage. Include at least one of: opp_id, reason, sport, market, or detail. Mirrors POST /v2/report-bad-arb. Free to any active key.

Input parameters:

- `detail`
- `market`
- `opp_id`
- `reason`
- `sport`

### `watch_markets` (~181 tokens)

Mint a short-lived (~120s) connect ticket for the real-time WebSocket market stream and return the ws_url plus your tier's allowed channels. The agent (or a client SDK) opens the WebSocket; this tool does not hold the connection. Your tier's allowed channels come back in `allowed.channels` (the source of truth; the v2 markets:{sport} channel renaming ships with the WS reshape). Every active subscription gets a ticket — Free is entitled to the curated `sample` + `status` channels only; Basic/Premium/Pro get the full market stream. Channels above your tier come back in `locked` (name, what it carries, which tier unlocks it, price) so what you are not receiving is visible rather than silently absent. A lapsed/inactive key gets a 402 with an upgrade URL.

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/markets-dino-mcp/v2-mcp#diagnostics

## Score history

- 2026-08-03: 60
- 2026-08-02: 60
- 2026-08-01: 59
- 2026-07-31: 59
- 2026-07-30: 57
- 2026-07-29: 56
- 2026-07-28: 55
- 2026-07-27: 54
- 2026-07-26: 54

## Links

- Remote endpoint: https://api.dino.markets/v2/mcp/
- Website: https://dino.markets/
- Changelog RSS feed: https://verifymcp.io/servers/markets-dino-mcp/v2-mcp/changelog.xml
- Changelog JSON feed: https://verifymcp.io/servers/markets-dino-mcp/v2-mcp/changelog.json
- HTML version of this page: https://verifymcp.io/servers/markets-dino-mcp/v2-mcp
