# MCP server: https://novigapi.com/api/mcp

> Independent. Not affiliated with, endorsed by or sponsored by Novig.

Canonical: https://novigapi.com/docs/endpoints/mcp
Facts checked: 2026-11-12

The novigapi.com MCP server at https://novigapi.com/api/mcp gives AI agents Novig markets, player props, line history, fair prices and devig as tools over stateless JSON-RPC, authorized with your nv_ key. Data matches REST, at most about 10 seconds old. Novig's own API needs signed requests, checked 12 Nov 2026. (Source: [Novig docs: Sign a request](https://docs.novig.com/api/signing.md))

## What it returns

Model Context Protocol over plain HTTP POST: each request is one JSON-RPC message and gets one JSON response, with no session to keep. Send your key in the `Authorization` header. Data tools also require `user_request`, the user's task in one sentence, and unlock once the account's setup questions are answered (`get_onboarding_questions`, then `answer_onboarding`).

Data tools (key required)

| Tool | Arguments | Mirrors |
| --- | --- | --- |
| get_markets | league, event_id, market_type, player, team, status, limit, cursor | [GET /v1/markets](https://novigapi.com/docs/endpoints/markets) |
| get_market | market_id | [GET /v1/markets/{id}](https://novigapi.com/docs/endpoints/market) |
| get_events | league, status, limit, cursor | [GET /v1/events](https://novigapi.com/docs/endpoints/events) |
| get_orderbook | market_id | [GET /v1/orderbook/{id}](https://novigapi.com/docs/endpoints/orderbook-snapshot) |
| get_trades | market_id, since, limit, cursor | [GET /v1/trades](https://novigapi.com/docs/endpoints/trades) |
| get_ohlc_daily | market_id or date, limit, cursor | [GET /v1/ohlc/daily](https://novigapi.com/docs/endpoints/ohlc-daily) |
| fair_price | market_id | [GET /v1/fair-price](https://novigapi.com/docs/endpoints/fair-price) |
| get_line_history | market_id or outcome_id, since, until, limit, cursor | [GET /v1/line-history](https://novigapi.com/docs/endpoints/line-history) |
| get_player_props | league, player, limit, cursor | [GET /v1/player-props](https://novigapi.com/docs/endpoints/player-props) |
| get_players | league, q, limit, cursor | [GET /v1/players](https://novigapi.com/docs/endpoints/players) |
| get_teams | league, limit, cursor | [GET /v1/teams](https://novigapi.com/docs/endpoints/teams) |
| get_leagues | limit, cursor | [GET /v1/leagues](https://novigapi.com/docs/endpoints/leagues) |
| get_results | league, since, limit, cursor | [GET /v1/results](https://novigapi.com/docs/endpoints/results) |
| get_clv | market_id or player, limit, cursor | [GET /v1/clv](https://novigapi.com/docs/endpoints/clv) |
| get_line_moves | league, since, min_delta_pp, limit, cursor | Line moves and steam |


Tools that need no key and cost nothing

| Tool | Arguments | What it does |
| --- | --- | --- |
| devig | outcomes (2 to 20, each `american`, `decimal` or `probability`), method (`multiplicative`, `additive` or `power`) | Fair probabilities and odds from any book's prices. Same maths as the [no-vig calculator](https://novigapi.com/no-vig-calculator). |
| search | query | Find players, teams and leagues; returns ids for `fetch`. |
| fetch | id (such as `player:NBA:cooper-flagg`, `league:NBA` or `market:<id>`) | Current markets for a search result, as text with a citation URL. |
| start_signup, finish_signup | data_wanted, use_case, agent; then device_code | Get a key for your user with a code they approve. See [agents.md](https://novigapi.com/agents.md). |
| get_onboarding_questions, answer_onboarding | answers | The account setup questions data tools wait for. `answer_onboarding` needs the key. |
| send_feedback, rate_result | rating, message | Tell the team what is missing or rate an answer. |


## Parameters

Query and path parameters

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| Authorization | header | Yes | `Bearer nv_...`. |
| method | string (body) | Yes | `initialize`, `tools/list` or `tools/call`. |
| params.name | string (body) | For calls | Tool name. |
| params.arguments | object (body) | For calls | Tool input. Data tools need `user_request`. |


## Request

```bash
curl -s -X POST "https://novigapi.com/api/mcp" \
  -H "Authorization: Bearer nv_..." \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"get_markets","arguments":{"league":"NBA","market_type":"STEALS","limit":1,"user_request":"Find the fair price on Cooper Flagg steals tonight"}}}'
```

## Response

Tool results arrive as one text block holding the same JSON as REST, here the real Cooper Flagg 1.5 steals market from 12 Nov 2026. Errors set `isError: true` with the REST error body as text.

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "content": [
      {
        "type": "text",
        "text": "{\"data\":[{\"market_id\":\"01a1d00f-ec01-71c0-9776-0facc97e44a7\",\"event_id\":\"01a1cac7-5c83-7e41-ba84-afe1af0c1ca6\",\"league\":\"NBA\",\"market_type\":\"STEALS\",\"description\":\"Cooper Flagg 1.5 STEALS\",\"strike\":1.5,\"status\":\"OPEN\",\"player_slug\":\"cooper-flagg\",\"team_slug\":null,\"stat_slug\":\"steals\",\"starts_at\":\"2026-11-13T01:05:00.000Z\",\"fee_coefficient\":0.06,\"fee_charged\":\"WHEN_LIVE\",\"maker_credit\":0.25,\"volume\":198265,\"open_interest\":146324,\"first_seen\":\"2026-11-12T17:29:44.454Z\",\"closed_at\":null,\"event_description\":\"Dallas Mavericks @ Minnesota Timberwolves\",\"event_status\":\"OPEN_PREGAME\",\"outcomes\":[{\"outcome_id\":\"01a1d00f-ec01-71c0-9776-0fb0230cbd18\",\"name\":\"Over 1.5\",\"status\":\"PENDING\",\"bid\":0.39,\"bid_qty\":18938,\"ask\":0.43,\"fair\":0.41,\"last\":0.415,\"spread_pp\":4,\"american\":144,\"decimal\":2.439},{\"outcome_id\":\"01a1d00f-ec01-71c0-9776-0fc320d7d309\",\"name\":\"Under 1.5\",\"status\":\"PENDING\",\"bid\":0.57,\"bid_qty\":7500,\"ask\":0.61,\"fair\":0.59,\"last\":0.585,\"spread_pp\":4,\"american\":-144,\"decimal\":1.6949}],\"observed_at\":\"2026-11-12T17:23:56.000Z\",\"source_age_seconds\":6,\"edge_cached\":true}],\"meta\":{\"observed_at\":\"2026-11-12T17:23:56.000Z\",\"source_age_seconds\":6,\"edge_cached\":true,\"next_cursor\":null,\"limit\":1,\"count\":1,\"plan\":\"developer\",\"credits_charged\":1,\"credits_remaining\":9874,\"credit_policy\":\"credits_v1\"}}"
      }
    ],
    "isError": false
  }
}
```

## Fields

Response fields

| Field | Type | Description |
| --- | --- | --- |
| result.content[0].text | string | The tool's JSON result, as a string. Parse it. |
| result.isError | boolean | True on a refused or failed call; the text explains why. |
| error | object | JSON-RPC error for protocol problems, such as `-32601 Method not found`. |


## Credit cost

Each data tool costs what the matching REST call costs (get_markets 1 credit per 100 rows requested, get_line_history 5x, get_clv 5x). `devig`, `search`, `fetch`, the signup, onboarding and feedback tools, `initialize` and `tools/list` cost 0.

## Python

```python
import os
import requests

KEY = os.environ["NOVIGAPI_API_KEY"]  # nv_...
HEADERS = {"Authorization": f"Bearer {KEY}"}

def mcp_call(name, arguments, id=1):
    body = {"jsonrpc": "2.0", "id": id, "method": "tools/call", "params": {"name": name, "arguments": arguments}}
    r = requests.post("https://novigapi.com/api/mcp", json=body, headers=HEADERS, timeout=20)
    result = r.json()["result"]
    if result.get("isError"):
        raise RuntimeError(result["content"][0]["text"])
    return result["content"][0]["text"]

print(mcp_call("devig", {"outcomes": [{"american": -120}, {"american": 100}], "method": "multiplicative", "user_request": "Devig a two-way line"}))
```

## JavaScript

```javascript
const KEY = process.env.NOVIGAPI_API_KEY; // nv_...
const headers = { Authorization: "Bearer " + KEY };

const body = { jsonrpc: "2.0", id: 1, method: "tools/list" };
const res = await fetch("https://novigapi.com/api/mcp", { method: "POST", headers: { ...headers, "Content-Type": "application/json" }, body: JSON.stringify(body) });
const { result } = await res.json();
console.log(result.tools.map((t) => t.name));
```

## Set it up in your client

- [Use with Claude](https://novigapi.com/use-with-claude): Claude Code and Claude Desktop.
- [Use with Cursor](https://novigapi.com/use-with-cursor): `.cursor/mcp.json`.
- [Use with ChatGPT](https://novigapi.com/use-with-chatgpt): GPT Actions from our OpenAPI file, and what works with connectors.

## Notes and edge cases

- Supported protocol versions: 2025-06-18, 2025-03-26 and 2024-11-05. The server is stateless, so there is nothing to resume after a dropped connection.
- A plan limit returns `isError: true` with the 429 body as text, including what to tell the user and the upgrade link; see [errors](https://novigapi.com/docs/endpoints/errors).
- Every tool's full input schema is listed by `tools/list`. A data tool called before the account's setup questions are answered returns `isError: true` with `ONBOARDING_REQUIRED` and costs nothing.
- Keep your key out of shared config files; use environment variables where your client supports them.

## Sources

- [Novig docs: Sign a request](https://docs.novig.com/api/signing.md)
- [Novig API docs](https://docs.novig.com)

---

Get a free API key: https://novigapi.com/sign-up . Docs: https://novigapi.com/docs . MCP: https://novigapi.com/api/mcp . Operated by Stunning Couches LLC. Independent. Not affiliated with, endorsed by or sponsored by Novig.
