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.
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:
POST https://pylonfantasy.fly.dev/mcp
Authorization: Bearer pylon_YOUR_TOKENA 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.
{
"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 -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: rawReturns the Inside the Ten user id of the authenticated token — a connectivity / identity smoke check.
No arguments.
{
"data": { "userId": "6f1c…e2a", "authenticated": true },
"provenance": { "modelVersion": "raw", "dataAsOf": null, "generatedAt": "2026-07-02T18:30:00.12Z" }
}list_leaguesmodel: rawLists your fantasy leagues across all connected platforms. Use a league id with get_league / get_my_roster.
No arguments.
{
"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: rawA league's scoring format key and effective scoring rules (custom override or resolved preset).
leagueIdstring · required — from list_leagues
{
"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: rawYour roster in a league: player id, name, position, NFL team, starter flag. Ordered starters first.
leagueIdstring · required — from list_leagues
{
"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: rawAverage draft position for a scoring format, top players by overall ADP.
formatstring · required — scoring format key, e.g. generic-full-ppr, half-ppr, tfcsourcestring · optional — ADP source id, e.g. fantasypros-ecrlimitinteger · optional — 1–500, default 200
{
"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: v1League-scoring-aware ensemble projections: per-player mean, P10, P90, and contributing source count. Prefers your personal ensemble when you have one.
seasoninteger · required — e.g. 2026weekinteger · optional — 0 = season-long (default), 1–23 weeklyscoringFormatstring · optional — default generic-full-pprpositionstring · optional — QB · RB · WR · TE · K · DEF (optional filter)limitinteger · optional — top-N by mean, default 300
{
"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: rawInside 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).
typestring · required — role-change · regression-watch · catch-rate-regressionseasoninteger · optional — defaults to the current season
{
"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: tfpatFPA defense-vs-position matchup grades, ranked. Lower tfpaValue = tougher matchup; rank 1 / percentile 0 = toughest.
seasoninteger · required — e.g. 2026positionstring · optional — QB · RB · WR · TE · ALL (default ALL)
{
"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.
seasoninteger · required — e.g. 2026scoringFormatKeystring · required — e.g. generic-full-pprsideA / sideBobject · required — each: playerIds[] and picks[] ({year, round, tier: early|mid|late})superflexboolean · optional — QB premium vs 1QB. default falsetePremiumMultipliernumber · optional — 1.0 = off (default)
{
"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:
{
"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.