{
  "$schema": "https://agentskills.io/schemas/skills-index-v0.2.json",
  "name": "Chessfolio Skills",
  "description": "Read-only chess skills served by the Chessfolio MCP server: personal chess-data skills (PAT bearer auth) plus public tournament-pairing skills (no token) reading Chess-Results data.",
  "skills": [
    {
      "name": "get_profile",
      "type": "api",
      "description": "The authenticated user's Chessfolio profile: display name, linked platform usernames, connected sources with sync freshness (last_synced_at), and total game count. Read-only, like every tool on this server.",
      "transport": "mcp",
      "endpoint": "https://chessfolio.io/api/mcp",
      "auth": "bearer"
    },
    {
      "name": "get_chess_stats",
      "type": "api",
      "description": "Aggregate statistics over the user's games for a chosen window: win/draw/loss by colour, online vs over-the-board comparison, performance rating, records and streaks, recent form, weekday performance, opponent-strength breakdown, game-length breakdown, top openings, monthly form and average accuracy. Same compute as the chessfolio.io dashboard.",
      "transport": "mcp",
      "endpoint": "https://chessfolio.io/api/mcp",
      "auth": "bearer"
    },
    {
      "name": "get_rating_progress",
      "type": "api",
      "description": "Rating series per provider and time control (including ECF over-the-board), each with start/end/delta over the window. Series longer than 60 points are evenly downsampled (first and last always kept) — pointsDownsampled says when. The window's opening value is seeded from the latest pre-window rating so deltas match the dashboard.",
      "transport": "mcp",
      "endpoint": "https://chessfolio.io/api/mcp",
      "auth": "bearer"
    },
    {
      "name": "list_games",
      "type": "api",
      "description": "Paged list of the user's games (50 per page) across chess.com, Lichess, ECF (OTB), manual and PGN imports, with filters matching the chessfolio.io games library: provider, result, colour, time class, date range, move-count range, opening, opponent, opening-line prefix (lineMoves, as returned by get_problem_lines) and free-text search. accuracy is the effective accuracy (platform value preferred, chessfolio review value as fallback — accuracySource says which).",
      "transport": "mcp",
      "endpoint": "https://chessfolio.io/api/mcp",
      "auth": "bearer"
    },
    {
      "name": "get_game",
      "type": "api",
      "description": "One of the user's games in full: the same summary fields as list_games plus its moves and, where a Chessfolio review exists, a review summary. `movesSource` says what the moves are — `pgn` when the full game is stored (reviewed or PGN-attached games), `opening-only` when only the recorded opening line is known, or null for an OTB/online game with no attached PGN, which carries no moves at all (the endpoint never fabricates moves). `review` is present only when a Chessfolio analysis exists: accuracy for both colours and for the user, the key critical moments and a move-classification histogram (no per-ply detail). Read-only. `id` is a game id exactly as returned by list_games.",
      "transport": "mcp",
      "endpoint": "https://chessfolio.io/api/mcp",
      "auth": "bearer"
    },
    {
      "name": "get_problem_lines",
      "type": "api",
      "description": "The 'lines that keep hurting': per-colour opening lines (6–24 plies) where the user's score drops at least 8 points below their colour baseline over at least 5 games, ranked by a struggle index of (drop × log2 of games). Each line carries its SAN prefix (lineMoves) for drill-through into list_games, plus a ready-made games URL. OTB (ECF) games carry no move lists and are excluded — hasLineData says whether any analysable games exist in the window.",
      "transport": "mcp",
      "endpoint": "https://chessfolio.io/api/mcp",
      "auth": "bearer"
    },
    {
      "name": "get_weekly_report",
      "type": "api",
      "description": "The user's most recent Friday weekly report as its frozen payload: per-source sections (chess.com / Lichess / OTB) with games, rating lines, best win and toughest defeat, plus puzzles — exactly what the email and the public share page render, with the share URL included. Returns a clear message when no report exists yet (reports generate on Fridays for weeks with activity).",
      "transport": "mcp",
      "endpoint": "https://chessfolio.io/api/mcp",
      "auth": "bearer"
    },
    {
      "name": "get_puzzle_stats",
      "type": "api",
      "description": "Cross-source puzzle activity and ratings: 12-week solve summary with win rate, volume bucketed to suit the window (day/week/month), and rating series for Lichess puzzles and chess.com tactics (chess.com is a peak-only rating — their API exposes no current value). Rating series longer than 120 rows are evenly downsampled, first and last kept (dataDownsampled says when).",
      "transport": "mcp",
      "endpoint": "https://chessfolio.io/api/mcp",
      "auth": "bearer"
    },
    {
      "name": "get_tournament_state",
      "type": "api",
      "description": "Public, read-only snapshot of any Chess-Results tournament — no token needed (source: chess-results.com). Returns the seeded player list, published round pairings with results, current standings, and any not-paired / requested-bye / withdrawal notes, plus a snapshotAt timestamp. Treat it as a point-in-time scrape that MAY BE STALE, not a live feed — always read snapshotAt. tnr is the Chess-Results tournament number (e.g. 651260) or a full chess-results.com tournament URL.",
      "transport": "mcp",
      "endpoint": "https://chessfolio.io/api/mcp",
      "auth": "none"
    },
    {
      "name": "estimate_round1",
      "type": "api",
      "description": "Public, read-only ESTIMATE of Round-1 pairings for a Chess-Results tournament — no token needed (source: chess-results.com). This is an ESTIMATE derived from the seed list, NOT the official pairing: the arbiter's real draw can differ. The opponent estimate is more reliable than colour — Round-1 colours hinge on the initial-colour draw, so treat the estimated colour as a coin-flip. The underlying snapshot may be stale (see staleWarning in the payload). Optional target returns just one player's board by case-insensitive name. tnr is the Chess-Results tournament number (e.g. 651260) or a full URL.",
      "transport": "mcp",
      "endpoint": "https://chessfolio.io/api/mcp",
      "auth": "none"
    },
    {
      "name": "estimate_pairings",
      "type": "api",
      "description": "Public, read-only ESTIMATE of the next round's pairings for a Chess-Results Swiss tournament — no token needed (source: chess-results.com). It runs the real FIDE Dutch pairing engine (bbpPairings) over the live standings, but it is an ESTIMATE, NOT the official pairing: the arbiter's Swiss-Manager draw can legitimately differ (accelerated pairings, custom settings, manual corrections). The older manual seeded-Swiss method is a teaching aid, not the target. Colours follow each player's prior-round colour history. Optional round picks which round to estimate (defaults to the next unplayed round). Optional target spotlights one player by case-insensitive name and returns their board plus a what-if scenario table. tnr is the Chess-Results tournament number (e.g. 651260) or a full chess-results.com tournament URL.",
      "transport": "mcp",
      "endpoint": "https://chessfolio.io/api/mcp",
      "auth": "none"
    }
  ]
}