Fantasy Pundit: FPL Commentary & League Roasts

Read or create the canonical weekly FPL mini-league commentary and roast after scoring settles.

Should I use this

Quality & Safety

A
Description quality
100%
Schema completeness
100%
Naming quality
100%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~3,096Tokens (tool definitions)
~11.8 KBTypical response size
Significant attention impact (2.42% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "mcp": {
      "url": "https://api.fantasypundit.lol/mcp"
    }
  }
}

Remote endpoints

https://api.fantasypundit.lol/mcpstreamable-http

What it can do

Tool inventory

Tools (3)

🟒 Read-only🟑 WriteπŸ”΄ Deleteβšͺ Unknown
🟒get_league_commentary(league, gameweek)

Read Fantasy Pundit’s existing canonical weekly commentary and roast for a public FPL mini-league. Use this first for requests to roast, recap, or review a league. It never creates a new edition. At full-time it can report that the current Gameweek is available to reserve while FPL scoring settles.

Input Schema

{
  "type": "object",
  "properties": {
    "league": {
      "type": "string",
      "minLength": 1,
      "description": "A public FPL classic league ID, a Fantasy Premier League league URL, or a league name search term. If the user has not provided one, ask them for it before calling this tool."
    },
    "gameweek": {
      "description": "Optional Gameweek from 1 to 38. Omit for the current available Gameweek.",
      "type": "integer",
      "minimum": 1,
      "maximum": 38
    }
  },
  "required": [
    "league"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}

Output Schema

{
  "type": "object",
  "properties": {
    "status": {
      "type": "string",
      "enum": [
        "completed",
        "queued",
        "processing",
        "not_generated",
        "needs_league_selection",
        "failed"
      ]
    },
    "nextStep": {
      "type": "string",
      "enum": [
        "present_commentary",
        "poll",
        "ask_to_generate",
        "choose_league",
        "ask_to_retry",
        "unavailable"
      ],
      "description": "The next safe action. Reading or checking status never grants permission to create an edition."
    },
    "jobId": {
      "description": "Use this exact ID with get_commentary_result; do not start another job.",
      "type": "string"
    },
    "league": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string"
        },
        "name": {
          "type": "string"
        }
      },
      "required": [
        "id"
      ],
      "additionalProperties": false
    },
    "seasonId": {
      "type": "string"
    },
    "gameweek": {
      "anyOf": [
        {
          "type": "integer",
          "minimum": 1,
          "maximum": 38
        },
        {
          "type": "null"
        }
      ]
    },
    "latestCompletedGameweek": {
      "anyOf": [
        {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        },
        {
          "type": "null"
        }
      ]
    },
    "latestAvailableGameweek": {
      "anyOf": [
        {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        },
        {
          "type": "null"
        }
      ]
    },
    "commentary": {
      "type": "object",
      "properties": {
        "format": {
          "type": "string"
        },
        "headline": {
          "type": "string"
        },
        "intro": {
          "type": "string"
        },
        "sections": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "title": {
                "type": "string"
              },
              "body": {
                "type": "string"
              }
            },
            "required": [
              "body"
            ],
            "additionalProperties": {}
          }
        },
        "closing": {
          "type": "string"
        },
        "shareLine": {
          "type": "string"
        },
        "exchanges": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "speaker": {
                "type": "string"
              },
              "text": {
                "type": "string"
              }
            },
            "required": [
              "speaker",
              "text"
            ],
            "additionalProperties": {}
          }
        }
      },
      "additionalProperties": {},
      "description": "The exact published edition. Present its text as returned; do not create a competing rewrite."
    },
    "publishedAt": {
      "type": "string"
    },
    "share": {
      "type": "object",
      "properties": {
        "url": {
          "type": [
            "string",
            "null"
          ]
        },
        "text": {
          "type": [
            "string",
            "null"
          ]
        }
      },
      "required": [
        "url",
        "text"
      ],
      "additionalProperties": false
    },
    "links": {
      "type": "object",
      "properties": {
        "leagueUrl": {
          "type": "string"
        }
      },
      "required": [
        "leagueUrl"
      ],
      "additionalProperties": false
    },
    "progress": {
      "type": "number"
    },
    "pollAfterSeconds": {
      "description": "Minimum delay before the next read-only status call. Stop polling when completed or failed.",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "deferredUntilFinal": {
      "description": "The request is saved while FPL scoring settles. This is a normal waiting state.",
      "type": "boolean"
    },
    "canGenerate": {
      "description": "Whether a request can be made for this week. Creation still requires the user to ask for it.",
      "type": "boolean"
    },
    "deduplicated": {
      "type": "boolean"
    },
    "generationMode": {
      "type": "string",
      "const": "text"
    },
    "nextAction": {
      "description": "User-actionable guidance for this result.",
      "type": "string"
    },
    "candidates": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "minLength": 1,
            "description": "Public FPL classic league ID to use after the user chooses this league."
          },
          "name": {
            "type": "string"
          },
          "adminName": {
            "type": [
              "string",
              "null"
            ]
          },
          "adminTeamName": {
            "type": [
              "string",
              "null"
            ]
          },
          "entryCount": {
            "type": [
              "string",
              "number",
              "null"
            ]
          }
        },
        "required": [
          "id",
          "name"
        ],
        "additionalProperties": false
      }
    },
    "resolution": {
      "type": "object",
      "properties": {
        "source": {
          "type": "string"
        },
        "input": {
          "type": "string"
        }
      },
      "required": [
        "source",
        "input"
      ],
      "additionalProperties": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string"
        },
        "message": {
          "type": "string"
        },
        "retryAfterSeconds": {
          "type": "integer",
          "exclusiveMinimum": 0,
          "maximum": 9007199254740991
        },
        "resetAt": {
          "type": "string"
        }
      },
      "required": [
        "code",
        "message"
      ],
      "additionalProperties": false
    }
  },
  "required": [
    "status",
    "nextStep"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "additionalProperties": {}
}
βšͺgenerate_weekly_commentary(league, gameweek)

Create, reserve, or reuse Fantasy Pundit’s one official weekly commentary and league roast for the current available Gameweek. At full-time, a request can be saved and starts automatically as soon as FPL scoring is ready, which may be before FPL changes its public Gameweek label. This can consume shared generation capacity, so call it only after the user explicitly asks. Repeated calls return the same canonical league/Gameweek job. There are no tone or audio controls.

Input Schema

{
  "type": "object",
  "properties": {
    "league": {
      "type": "string",
      "minLength": 1,
      "description": "A public FPL classic league ID, a Fantasy Premier League league URL, or a league name search term. If the user has not provided one, ask them for it before calling this tool."
    },
    "gameweek": {
      "description": "Expected current Gameweek from the read or failed job. Refuses creation if the available week changed; cannot create historical editions.",
      "type": "integer",
      "minimum": 1,
      "maximum": 38
    }
  },
  "required": [
    "league"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}

Output Schema

{
  "type": "object",
  "properties": {
    "status": {
      "type": "string",
      "enum": [
        "completed",
        "queued",
        "processing",
        "not_generated",
        "needs_league_selection",
        "failed"
      ]
    },
    "nextStep": {
      "type": "string",
      "enum": [
        "present_commentary",
        "poll",
        "ask_to_generate",
        "choose_league",
        "ask_to_retry",
        "unavailable"
      ],
      "description": "The next safe action. Reading or checking status never grants permission to create an edition."
    },
    "jobId": {
      "description": "Use this exact ID with get_commentary_result; do not start another job.",
      "type": "string"
    },
    "league": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string"
        },
        "name": {
          "type": "string"
        }
      },
      "required": [
        "id"
      ],
      "additionalProperties": false
    },
    "seasonId": {
      "type": "string"
    },
    "gameweek": {
      "anyOf": [
        {
          "type": "integer",
          "minimum": 1,
          "maximum": 38
        },
        {
          "type": "null"
        }
      ]
    },
    "latestCompletedGameweek": {
      "anyOf": [
        {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        },
        {
          "type": "null"
        }
      ]
    },
    "latestAvailableGameweek": {
      "anyOf": [
        {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        },
        {
          "type": "null"
        }
      ]
    },
    "commentary": {
      "type": "object",
      "properties": {
        "format": {
          "type": "string"
        },
        "headline": {
          "type": "string"
        },
        "intro": {
          "type": "string"
        },
        "sections": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "title": {
                "type": "string"
              },
              "body": {
                "type": "string"
              }
            },
            "required": [
              "body"
            ],
            "additionalProperties": {}
          }
        },
        "closing": {
          "type": "string"
        },
        "shareLine": {
          "type": "string"
        },
        "exchanges": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "speaker": {
                "type": "string"
              },
              "text": {
                "type": "string"
              }
            },
            "required": [
              "speaker",
              "text"
            ],
            "additionalProperties": {}
          }
        }
      },
      "additionalProperties": {},
      "description": "The exact published edition. Present its text as returned; do not create a competing rewrite."
    },
    "publishedAt": {
      "type": "string"
    },
    "share": {
      "type": "object",
      "properties": {
        "url": {
          "type": [
            "string",
            "null"
          ]
        },
        "text": {
          "type": [
            "string",
            "null"
          ]
        }
      },
      "required": [
        "url",
        "text"
      ],
      "additionalProperties": false
    },
    "links": {
      "type": "object",
      "properties": {
        "leagueUrl": {
          "type": "string"
        }
      },
      "required": [
        "leagueUrl"
      ],
      "additionalProperties": false
    },
    "progress": {
      "type": "number"
    },
    "pollAfterSeconds": {
      "description": "Minimum delay before the next read-only status call. Stop polling when completed or failed.",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "deferredUntilFinal": {
      "description": "The request is saved while FPL scoring settles. This is a normal waiting state.",
      "type": "boolean"
    },
    "canGenerate": {
      "description": "Whether a request can be made for this week. Creation still requires the user to ask for it.",
      "type": "boolean"
    },
    "deduplicated": {
      "type": "boolean"
    },
    "generationMode": {
      "type": "string",
      "const": "text"
    },
    "nextAction": {
      "description": "User-actionable guidance for this result.",
      "type": "string"
    },
    "candidates": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "minLength": 1,
            "description": "Public FPL classic league ID to use after the user chooses this league."
          },
          "name": {
            "type": "string"
          },
          "adminName": {
            "type": [
              "string",
              "null"
            ]
          },
          "adminTeamName": {
            "type": [
              "string",
              "null"
            ]
          },
          "entryCount": {
            "type": [
              "string",
              "number",
              "null"
            ]
          }
        },
        "required": [
          "id",
          "name"
        ],
        "additionalProperties": false
      }
    },
    "resolution": {
      "type": "object",
      "properties": {
        "source": {
          "type": "string"
        },
        "input": {
          "type": "string"
        }
      },
      "required": [
        "source",
        "input"
      ],
      "additionalProperties": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string"
        },
        "message": {
          "type": "string"
        },
        "retryAfterSeconds": {
          "type": "integer",
          "exclusiveMinimum": 0,
          "maximum": 9007199254740991
        },
        "resetAt": {
          "type": "string"
        }
      },
      "required": [
        "code",
        "message"
      ],
      "additionalProperties": false
    }
  },
  "required": [
    "status",
    "nextStep"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "additionalProperties": {}
}
🟒get_commentary_result(jobId)

Check a Fantasy Pundit weekly commentary and league-roast job returned by generate_weekly_commentary. It never starts generation. When completed, return the exact canonical commentary and share links without rewriting it.

Input Schema

{
  "type": "object",
  "properties": {
    "jobId": {
      "type": "string",
      "minLength": 1,
      "description": "Weekly commentary job ID returned by generate_weekly_commentary."
    }
  },
  "required": [
    "jobId"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}

Output Schema

{
  "type": "object",
  "properties": {
    "status": {
      "type": "string",
      "enum": [
        "completed",
        "queued",
        "processing",
        "not_generated",
        "needs_league_selection",
        "failed"
      ]
    },
    "nextStep": {
      "type": "string",
      "enum": [
        "present_commentary",
        "poll",
        "ask_to_generate",
        "choose_league",
        "ask_to_retry",
        "unavailable"
      ],
      "description": "The next safe action. Reading or checking status never grants permission to create an edition."
    },
    "jobId": {
      "description": "Use this exact ID with get_commentary_result; do not start another job.",
      "type": "string"
    },
    "league": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string"
        },
        "name": {
          "type": "string"
        }
      },
      "required": [
        "id"
      ],
      "additionalProperties": false
    },
    "seasonId": {
      "type": "string"
    },
    "gameweek": {
      "anyOf": [
        {
          "type": "integer",
          "minimum": 1,
          "maximum": 38
        },
        {
          "type": "null"
        }
      ]
    },
    "latestCompletedGameweek": {
      "anyOf": [
        {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        },
        {
          "type": "null"
        }
      ]
    },
    "latestAvailableGameweek": {
      "anyOf": [
        {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        },
        {
          "type": "null"
        }
      ]
    },
    "commentary": {
      "type": "object",
      "properties": {
        "format": {
          "type": "string"
        },
        "headline": {
          "type": "string"
        },
        "intro": {
          "type": "string"
        },
        "sections": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "title": {
                "type": "string"
              },
              "body": {
                "type": "string"
              }
            },
            "required": [
              "body"
            ],
            "additionalProperties": {}
          }
        },
        "closing": {
          "type": "string"
        },
        "shareLine": {
          "type": "string"
        },
        "exchanges": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "speaker": {
                "type": "string"
              },
              "text": {
                "type": "string"
              }
            },
            "required": [
              "speaker",
              "text"
            ],
            "additionalProperties": {}
          }
        }
      },
      "additionalProperties": {},
      "description": "The exact published edition. Present its text as returned; do not create a competing rewrite."
    },
    "publishedAt": {
      "type": "string"
    },
    "share": {
      "type": "object",
      "properties": {
        "url": {
          "type": [
            "string",
            "null"
          ]
        },
        "text": {
          "type": [
            "string",
            "null"
          ]
        }
      },
      "required": [
        "url",
        "text"
      ],
      "additionalProperties": false
    },
    "links": {
      "type": "object",
      "properties": {
        "leagueUrl": {
          "type": "string"
        }
      },
      "required": [
        "leagueUrl"
      ],
      "additionalProperties": false
    },
    "progress": {
      "type": "number"
    },
    "pollAfterSeconds": {
      "description": "Minimum delay before the next read-only status call. Stop polling when completed or failed.",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "deferredUntilFinal": {
      "description": "The request is saved while FPL scoring settles. This is a normal waiting state.",
      "type": "boolean"
    },
    "canGenerate": {
      "description": "Whether a request can be made for this week. Creation still requires the user to ask for it.",
      "type": "boolean"
    },
    "deduplicated": {
      "type": "boolean"
    },
    "generationMode": {
      "type": "string",
      "const": "text"
    },
    "nextAction": {
      "description": "User-actionable guidance for this result.",
      "type": "string"
    },
    "candidates": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "minLength": 1,
            "description": "Public FPL classic league ID to use after the user chooses this league."
          },
          "name": {
            "type": "string"
          },
          "adminName": {
            "type": [
              "string",
              "null"
            ]
          },
          "adminTeamName": {
            "type": [
              "string",
              "null"
            ]
          },
          "entryCount": {
            "type": [
              "string",
              "number",
              "null"
            ]
          }
        },
        "required": [
          "id",
          "name"
        ],
        "additionalProperties": false
      }
    },
    "resolution": {
      "type": "object",
      "properties": {
        "source": {
          "type": "string"
        },
        "input": {
          "type": "string"
        }
      },
      "required": [
        "source",
        "input"
      ],
      "additionalProperties": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string"
        },
        "message": {
          "type": "string"
        },
        "retryAfterSeconds": {
          "type": "integer",
          "exclusiveMinimum": 0,
          "maximum": 9007199254740991
        },
        "resetAt": {
          "type": "string"
        }
      },
      "required": [
        "code",
        "message"
      ],
      "additionalProperties": false
    }
  },
  "required": [
    "status",
    "nextStep"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "additionalProperties": {}
}

Recommended Prompts

retrieve_data
Get details about [item] from Fantasy Pundit: FPL Commentary & League Roasts
Expected tools: get_league_commentary
fetch_info
Fetch [information type] using Fantasy Pundit: FPL Commentary & League Roasts
Expected tools: get_league_commentary

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded3 tools
verifiedversion not recorded3 tools
verifiedversion not recorded3 tools
verifiedversion not recorded3 tools
verifiedversion not recorded3 tools
verifiedversion not recorded3 tools