Skip to main content
Glama
patrick-oreilly

chesscom-stats-mcp

chesscom-stats-mcp

An MCP server for Chess.com stats. Plug it into Claude (or any MCP client) and ask things like:

  • "How did I do this month?"

  • "What's my score with the Pirc as black?"

  • "Show me my last five rapid games."

  • "What's Hikaru's bullet rating?"

Demo: asking Claude how I did on Chess.com this month

It uses Chess.com's public Published-Data API, so there is no API key and nothing to sign in to. It only reads public data.

Install

Claude Code

claude mcp add chesscom -e CHESSCOM_USERNAME=your_username -- npx -y chesscom-stats-mcp

Claude Desktop, Cursor and other clients

Add this to the client's MCP config (for Claude Desktop, claude_desktop_config.json):

{
  "mcpServers": {
    "chesscom": {
      "command": "npx",
      "args": ["-y", "chesscom-stats-mcp"],
      "env": { "CHESSCOM_USERNAME": "your_username" }
    }
  }
}

CHESSCOM_USERNAME is optional. With it set, "how did I do?" means you; without it, name the player in the question.

Related MCP server: MCP Chess Server

Tools

Tool

What it returns

month_summary

One month at a glance: win/loss/draw and score %, rating change per time control, results as white and black, average accuracy, how wins and losses ended, longest streaks, best win, worst loss, most-played openings. Defaults to the current month; filter by time control or include unrated games.

recent_games

The latest games, newest first, with result, ratings, opening, accuracy and a link.

get_ratings

Current and best rating plus lifetime record for bullet, blitz, rapid and daily.

get_profile

Public profile: name, country, join date, league, followers.

All tools are read-only.

Notes

  • Ratings on a Chess.com game are post-game, so a month's ratingChange runs from the rating after the first rated game of the month to the rating after the last one.

  • Accuracy is only present for games that were reviewed on Chess.com, so averageAccuracy covers gamesWithAccuracy games, not all of them.

  • Variants (Chess960 and so on) are left out of month_summary.

Development

npm install
npm test                              # builds, then runs the unit tests
node scripts/demo.mjs list            # list tools over a real stdio connection
node scripts/demo.mjs month_summary '{"username":"hikaru"}'

License

MIT

Available Tools

4 tools
get_profilePlayer profileB
Read-only

A Chess.com player's public profile: name, country, join date, league, followers.

ParametersJSON Schema
NameRequiredDescriptionDefault
usernameNoChess.com username.

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so safety is covered. The description adds only the word 'public', which mildly implies no authentication is needed, but says nothing about rate limits, error behavior for unknown users, or freshness of the data. Modest added value above the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single terse noun phrase that front-loads the resource and lists the return fields with no filler. It is a fragment rather than a sentence, but every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description usefully enumerates the returned fields, compensating for the missing schema. It is nearly sufficient for a one-optional-parameter read tool, though it omits any error/not-found behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% for the single username parameter, so the schema already documents it fully. The description does not mention the username input at all, adding no semantics beyond the schema. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names the exact resource (a Chess.com player's public profile) and enumerates the data it returns (name, country, join date, league, followers), which implicitly separates it from get_ratings and recent_games. There is no explicit verb or sibling callout, but the resource is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no statement of when to use this tool versus get_ratings, month_summary, or recent_games, and no prerequisites or exclusions. The agent must infer usage purely from the resource name.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_ratingsCurrent ratingsA
Read-only

Current and best rating plus lifetime win/loss/draw record for each time control (bullet, blitz, rapid, daily).

ParametersJSON Schema
NameRequiredDescriptionDefault
usernameNoChess.com username.

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds the useful behavioral fact that records are lifetime (not windowed) and covers four named time controls, but says nothing about auth requirements, rate limits, or behavior when no username is supplied.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One sentence, front-loaded with the payload ('current and best rating'), with the enumerated time controls serving as a compact scope statement. No filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter read tool with no output schema, the description effectively documents the return shape by listing the data categories. The only shortfall is the undefined behavior of the optional username argument.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the single username parameter is fully documented there, so the schema does the heavy lifting. The description adds no information about the parameter — notably it never explains what happens when the optional username is omitted, which is the one semantic gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific resource (ratings) and enumerates exactly what is returned: current and best rating plus lifetime win/loss/draw per time control. That content profile implicitly separates it from siblings like recent_games and month_summary, though no sibling is named explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied by the data scope — an agent can infer this is the tool for a rating/record snapshot, but there is no statement of when to prefer it over get_profile or month_summary, and no exclusions or prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

month_summaryMonth summaryA
Read-only

How a player did in one calendar month: record and score, rating change per time control, results as white and black, average accuracy, how wins and losses ended, streaks, best win, worst loss and most-played openings. Defaults to the current month. Use this for questions like "how did I do this month?".

ParametersJSON Schema
NameRequiredDescriptionDefault
yearNoDefaults to the current year.
monthNo1-12. Defaults to the current month.
usernameNoChess.com username.
rated_onlyNoSkip unrated games. Defaults to true.
time_classNoOnly count this time control.

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds genuine value by enumerating the derived metrics returned (rating change per time control, how wins/losses ended, best win, worst loss), which functions as an output contract in the absence of an output schema. No auth or rate-limit notes, but none are critical here.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the deliverable, then the default, then the usage cue; no filler sentences. The long enumeration of returned fields is dense but earns its place because no output schema exists.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description correctly compensates by listing what comes back, and it covers defaulting behavior for year/month. It leaves one gap: username is listed as optional by the schema, yet the description never explains what happens if it is omitted.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so year, month, rated_only, time_class and username are all documented in the schema itself. The description only echoes the current-month default, adding nothing beyond what the schema already states. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a concrete deliverable — a per-calendar-month performance summary — and enumerates its contents (record, rating change per time control, accuracy, streaks, openings). It is clearly differentiated from get_profile and get_ratings by the monthly aggregation, though it never names a sibling to contrast against.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"Use this for questions like 'how did I do this month?'" gives an explicit trigger context, and "Defaults to the current month" clarifies the defaulting behavior. It stops short of stating when to prefer recent_games or get_ratings instead, so no exclusion guidance is present.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

recent_gamesRecent gamesA
Read-only

A player's most recent finished games, newest first, with result, ratings, opening, accuracy and a link.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoHow many games. Defaults to 10.
usernameNoChess.com username.
time_classNoOnly count this time control.

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so safety is covered. The description still adds real behavioral context beyond that: results are restricted to finished games (not in-progress), ordered newest first, and include result, ratings, opening, accuracy and a link. Missing only pagination/cap behavior and the fact that limit is capped at 50.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence that names the resource first and then the ordering and returned fields. No filler, no redundancy with the title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only list tool with full schema coverage and annotations covering the safety profile, the description is nearly sufficient, and it partly compensates for the absent output schema by naming returned fields. It falls short only on the 'recent' semantics and the 50-item ceiling.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all three parameters (limit, username, time_class) are already documented with defaults and enum values. The description mentions 'a player's' only obliquely and adds no format or syntax detail beyond the schema, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific resource (a player's most recent finished games) plus scope detail (newest first, finished only) and enumerates the payload fields. An agent can tell this apart from get_ratings or month_summary by resource alone, though no sibling is named explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use guidance, no mention of prerequisites (e.g. requires a valid Chess.com username), and no routing to or away from siblings like month_summary for aggregate views. It simply describes what the output contains.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 4 tool updatesv0.1.0
    • First observedget_profile
    • First observedget_ratings
    • First observedmonth_summary
    • First observedrecent_games

TDQS

B3.4/5.0

Scored across 4 tools

Disambiguation4/5

Each tool targets a distinct slice: profile identity, current/best ratings, a monthly aggregate, and a raw recent-games list. The only mild overlap is between month_summary and recent_games, both about played games, but the aggregate-vs-list distinction is spelled out clearly in the descriptions.

Naming Consistency3/5

Two tools use a get_ verb prefix (get_profile, get_ratings) while the other two are bare noun phrases (month_summary, recent_games). Names are readable and unambiguous, but the set mixes two conventions rather than following one pattern.

Tool Count4/5

Four tools is lean but sensible for a focused Chess.com stats server — identity, ratings, monthly performance, recent games. It sits just under a fully comfortable surface, since users may also want historical or arbitrary-range stats.

Completeness3/5

Core stats workflows are covered (profile, ratings, month summary, recent games), but there are notable gaps: no arbitrary date-range or archive queries, no fetching a specific game, and no puzzle/tactics or online-status data. Agents can work around some of this but will hit dead ends for historical queries.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    C
    maintenance
    Provides access to Chess.com player data, game records, and public information through standardized MCP interfaces, allowing AI assistants to search and analyze chess information.
    10
    89
    MIT
  • A
    license
    B
    quality
    D
    maintenance
    Provides Chess.com player data integration, enabling AI assistants to fetch real-time chess player profiles and comprehensive statistics including ratings, game counts, and performance metrics from Chess.com's public API.
    2
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    Enables querying Chess.com public data including player profiles, stats, games, and club information through natural language.
    9
    4 npm
    MIT