Developer · MCP

Connect Inside the Ten to your LLM

Inside the Ten exposes a remote Model Context Protocol server so Claude, ChatGPT, or any MCP-capable client can read your leagues, rosters, and Inside the Ten's proprietary model layer — projections, Keys/Signals, tFPA matchups, and dynasty trade value — right inside your chat. Bring your own LLM; the numbers are the same ones the Inside the Ten app uses.

Read-only by construction. The server advertises tools only — no write path exists. It can never draft, add/drop, or change your leagues.

1. Get an API token

Sign in to Inside the Ten, then open your API tokens settings and create a token. The full pylon_… secret is shown once — copy it immediately; Inside the Ten stores only a hash. Treat it like a password. You can revoke it any time from the same page.

2. Endpoint

The server speaks JSON-RPC 2.0 over streamable HTTP at a single endpoint, authenticated with your token as a bearer credential:

Endpoint
POST https://pylonfantasy.fly.dev/mcp
Authorization: Bearer pylon_YOUR_TOKEN

A normal app login (JWT) is not accepted here — only pylon_ tokens authenticate the MCP surface.

3. Claude Desktop

Add Inside the Ten to claude_desktop_config.json (Claude Desktop → Settings → Developer → Edit Config). The mcp-remote bridge connects Claude to the remote endpoint and forwards your token. Restart Claude Desktop after saving.

claude_desktop_config.json
{
  "mcpServers": {
    "pylon": {
      "command": "npx",
      "args": [
        "-y", "mcp-remote",
        "https://pylonfantasy.fly.dev/mcp",
        "--header", "Authorization: Bearer pylon_YOUR_TOKEN"
      ]
    }
  }
}

Requires Node.js (for npx). Once connected, ask Claude e.g. "Use Inside the Ten to show my projections for week 1" and it will call get_projections.

4. ChatGPT

In ChatGPT, open Settings → Connectors (Developer mode / custom connectors, available on paid plans) and add a custom MCP connector:

  • Server URL: https://pylonfantasy.fly.dev/mcp
  • Authentication: Bearer token — paste your pylon_… token

Save, then enable the Inside the Ten connector in a chat. ChatGPT will discover the tools via tools/list and call them on demand.

5. Any MCP client

Any client that supports remote MCP works the same way: point it at the endpoint, send your token as an Authorization: Bearer header, and speak JSON-RPC 2.0 (protocol version 2024-11-05). A raw tools/call looks like:

curl
curl -s https://pylonfantasy.fly.dev/mcp \
  -H "Authorization: Bearer pylon_YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call",
       "params":{"name":"whoami","arguments":{}}}'

6. Tool reference

Nine read-only tools. Every result is a JSON-RPC response whose result.content[0].text is a JSON string carrying a data object and a provenance block — modelVersion (raw for source data, or the model that produced it), dataAsOf (when the underlying data was synced/computed), and generatedAt. Cite provenance for freshness; it's first-class, not an afterthought.

whoamimodel: raw

Returns the Inside the Ten user id of the authenticated token — a connectivity / identity smoke check.

No arguments.

Sample result (the content[0].text payload, parsed)
{
  "data": { "userId": "6f1c…e2a", "authenticated": true },
  "provenance": { "modelVersion": "raw", "dataAsOf": null, "generatedAt": "2026-07-02T18:30:00.12Z" }
}
list_leaguesmodel: raw

Lists your fantasy leagues across all connected platforms. Use a league id with get_league / get_my_roster.

No arguments.

Sample result (the content[0].text payload, parsed)
{
  "data": {
    "leagues": [
      { "id": "a3…f1", "source": "sleeper", "name": "Dynasty Warlords",
        "season": 2026, "scoringFormat": "generic-full-ppr", "leagueSize": 12,
        "totalRounds": 15, "isKeeper": true, "lastSyncedAt": "2026-07-02T09:12:00Z" }
    ],
    "count": 1
  },
  "provenance": { "modelVersion": "raw", "dataAsOf": "2026-07-02T09:12:00Z", "generatedAt": "2026-07-02T18:30:00.12Z" }
}
get_leaguemodel: raw

A league's scoring format key and effective scoring rules (custom override or resolved preset).

Arguments
  • leagueId string · required — from list_leagues
Sample result (the content[0].text payload, parsed)
{
  "data": {
    "leagueId": "a3…f1", "scoringFormatKey": "generic-full-ppr", "isCustom": false,
    "rules": { "receptions": 1.0, "receivingYards": 0.1, "passingTouchdown": 4.0, "rushingYards": 0.1 }
  },
  "provenance": { "modelVersion": "raw", "dataAsOf": null, "generatedAt": "2026-07-02T18:30:00.12Z" }
}
get_my_rostermodel: raw

Your roster in a league: player id, name, position, NFL team, starter flag. Ordered starters first.

Arguments
  • leagueId string · required — from list_leagues
Sample result (the content[0].text payload, parsed)
{
  "data": {
    "leagueId": "a3…f1", "teamId": "b7…c2",
    "roster": [
      { "playerId": "p_0417", "fullName": "Bijan Robinson", "position": "RB", "team": "ATL", "isStarter": true }
    ],
    "count": 1
  },
  "provenance": { "modelVersion": "raw", "dataAsOf": null, "generatedAt": "2026-07-02T18:30:00.12Z" }
}
get_adpmodel: raw

Average draft position for a scoring format, top players by overall ADP.

Arguments
  • format string · required — scoring format key, e.g. generic-full-ppr, half-ppr, tfc
  • source string · optional — ADP source id, e.g. fantasypros-ecr
  • limit integer · optional — 1–500, default 200
Sample result (the content[0].text payload, parsed)
{
  "data": {
    "format": "generic-full-ppr",
    "adp": [
      { "playerId": "p_0417", "sourceId": "fantasypros-ecr", "scoringFormat": "generic-full-ppr",
        "snapshotDate": "2026-06-30", "adpOverall": 1.4, "adpStdDev": 0.6 }
    ],
    "count": 1
  },
  "provenance": { "modelVersion": "raw", "dataAsOf": "2026-06-30T00:00:00Z", "generatedAt": "2026-07-02T18:30:00.12Z" }
}
get_projectionsmodel: v1

League-scoring-aware ensemble projections: per-player mean, P10, P90, and contributing source count. Prefers your personal ensemble when you have one.

Arguments
  • season integer · required — e.g. 2026
  • week integer · optional — 0 = season-long (default), 1–23 weekly
  • scoringFormat string · optional — default generic-full-ppr
  • position string · optional — QB · RB · WR · TE · K · DEF (optional filter)
  • limit integer · optional — top-N by mean, default 300
Sample result (the content[0].text payload, parsed)
{
  "data": {
    "season": 2026, "week": 0, "scoringFormat": "generic-full-ppr",
    "isPersonalEnsemble": false, "count": 1,
    "projections": [
      { "playerId": "p_0417", "fullName": "Bijan Robinson", "position": "RB", "team": "ATL",
        "mean": 312.4, "p10": 258.1, "p90": 366.9, "sourceCount": 6 }
    ]
  },
  "provenance": { "modelVersion": "v1", "dataAsOf": "2026-07-01T09:12:00Z", "generatedAt": "2026-07-02T18:30:00.12Z" }
}
get_keys_signalsmodel: raw

Inside the Ten Keys / Signals. role-change (snap-share breakouts) · regression-watch (air-yards vs target-share buy/sell) · catch-rate-regression (realized vs separation-predicted catch rate).

Arguments
  • type string · required — role-change · regression-watch · catch-rate-regression
  • season integer · optional — defaults to the current season
Sample result (the content[0].text payload, parsed)
{
  "data": {
    "type": "catch-rate-regression", "season": 2026,
    "signals": [
      { "playerId": "p_2210", "fullName": "Calvin Ridley", "direction": "sell",
        "realizedCatchRate": 0.71, "expectedCatchRate": 0.64, "deltaPct": 7.0 }
    ]
  },
  "provenance": { "modelVersion": "raw", "dataAsOf": null, "generatedAt": "2026-07-02T18:30:00.12Z" }
}
get_tfpa_matchupsmodel: tfpa

tFPA defense-vs-position matchup grades, ranked. Lower tfpaValue = tougher matchup; rank 1 / percentile 0 = toughest.

Arguments
  • season integer · required — e.g. 2026
  • position string · optional — QB · RB · WR · TE · ALL (default ALL)
Sample result (the content[0].text payload, parsed)
{
  "data": {
    "season": 2026, "position": "WR", "throughWeek": 18, "count": 1,
    "defenses": [
      { "team": "NYJ", "tfpaRank": 1, "tfpaValue": 0.86, "tfpaPercentile": 0, "games": 17 }
    ]
  },
  "provenance": { "modelVersion": "tfpa", "dataAsOf": null, "generatedAt": "2026-07-02T18:30:00.12Z" }
}
evaluate_trademodel: dynasty-{season}

Evaluates a dynasty trade: each side's total value, a verdict from side A's perspective, a per-asset breakdown, and sweetener suggestions. Read-only — proposes and commits nothing.

Arguments
  • season integer · required — e.g. 2026
  • scoringFormatKey string · required — e.g. generic-full-ppr
  • sideA / sideB object · required — each: playerIds[] and picks[] ({year, round, tier: early|mid|late})
  • superflex boolean · optional — QB premium vs 1QB. default false
  • tePremiumMultiplier number · optional — 1.0 = off (default)
Sample result (the content[0].text payload, parsed)
{
  "data": {
    "sideAValue": 41.2, "sideBValue": 38.9, "verdict": "lean",
    "assetBreakdown": [ { "asset": "Bijan Robinson", "side": "A", "value": 41.2 } ],
    "sweetenerSuggestions": [ { "asset": "2027 3rd (mid)", "value": 2.1 } ]
  },
  "provenance": { "modelVersion": "dynasty-2026", "dataAsOf": null, "generatedAt": "2026-07-02T18:30:00.12Z" }
}

7. Rate limits & errors

Calls are rate-limited per token (a sliding window, 120 requests / 60s by default). Exceeding it returns HTTP 429 with a machine-readable envelope and a Retry-After header:

429 Too Many Requests
{
  "error": {
    "code": "rate_limited",
    "message": "MCP request rate limit exceeded for this API token.",
    "retryAfterSeconds": 12,
    "limit": 120,
    "windowSeconds": 60
  }
}

Protocol-level problems come back as standard JSON-RPC errors:

  • -32601 — unknown method or tool name
  • -32602 — missing a required argument
  • -32603 — the tool failed while running
  • -32700 / -32600 — invalid JSON or malformed request

A revoked or unknown token gets 401 Unauthorized before any tool runs.

Ready to connect?

Create a token and paste it into your client.

Get your API token →