@chessceo/mcp 0.8.0 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.js +27 -4
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -172,7 +172,7 @@ const TOOLS = [
172
172
  "• Recency > career. The last 12-24 months dominate. This endpoint's compact/LLM view deliberately omits per-move `hotness` — at the individual level it's trailing noise. The general DB endpoint keeps it (there it's fashion signal).\n" +
173
173
  "• Opponent will deviate early. Prep is a tree, not a line — cover the 2 most likely replies at each real branching point, not one 20-move line.\n" +
174
174
  "• Surprise is a scalpel. Don't tell a lifelong 1.e4 player to switch to 1.d4 — meta-signal screams prep. Rare secondary lines within the user's existing repertoire (e.g. 6.Bc4 instead of usual 6.Bg5 vs the Najdorf) are where surprise is real.\n\n" +
175
- "For the full guide use the `prep_strategy_primer` prompt.",
175
+ "For the full guide call the `read_prep_strategy_guide` tool.",
176
176
  inputSchema: {
177
177
  type: "object",
178
178
  properties: {
@@ -285,15 +285,22 @@ const TOOLS = [
285
285
  required: ["fide_id"],
286
286
  },
287
287
  },
288
+ {
289
+ name: "list_cloud_machine_options",
290
+ description: "Returns the catalog of combo cloud-engine machine types the user can start (SKU, human display name, cost per hour, availability). ALWAYS call this before start_cloud_engine — SKU strings like 'rtx-5090-64' do not match the display names ('Stockfish 32 CPUs + Lc0 1× RTX 5090') and are NOT guessable. Present the user the display names + prices; pass the SKU to start_cloud_engine.",
291
+ inputSchema: { type: "object", properties: {} },
292
+ },
288
293
  {
289
294
  name: "start_cloud_engine",
290
- description: "Rent a combo GPU instance (Stockfish + Lc0 in the same container) on the user's chess.ceo account. Real money — billed per second while running. Requires an MCP token with agent access. Use `list_cloud_engines` first to see if the user already has one running; don't start a second combo unless the user asked for it.",
295
+ description: "Rent a combo GPU instance (Stockfish + Lc0 in the same container) on the user's chess.ceo account. Real money — billed per second while running.\n\n" +
296
+ "CRITICAL: `machine_type` must be an exact SKU from `list_cloud_machine_options` (e.g. 'rtx-5090-64', NOT 'rtx-5090'). Guessing SKUs will fail. Call list_cloud_machine_options first, show the user the display names + prices, get their confirmation, then pass the SKU here.\n\n" +
297
+ "Use list_cloud_engines first to check if the user already has one running; don't start a second combo unless the user asked for it. Requires an MCP token with agent access.",
291
298
  inputSchema: {
292
299
  type: "object",
293
300
  properties: {
294
301
  machine_type: {
295
302
  type: "string",
296
- description: "SKU picked from the user's cloud-engine options (e.g. 'rtx-5090', 'rtx-5090-dual'). Ask the user if you don't already know which one they want.",
303
+ description: "SKU from list_cloud_machine_options (e.g. 'rtx-5090-64', 'rtx-5090-dual-64'). MUST be the exact SKU, not the display name and not a guess.",
297
304
  },
298
305
  },
299
306
  required: ["machine_type"],
@@ -327,7 +334,7 @@ const TOOLS = [
327
334
  "• Lc0 is practical eval — trust it for 'which side is easier?' 'which candidate is best when Stockfish shows several as equal?' Lc0 sees long-term positional factors Stockfish's fixed search can miss.\n" +
328
335
  "• When they agree → high confidence. When they disagree → look at both scores and reason WHY (Stockfish sharply higher = tactic Lc0 missed; Lc0 higher = long-term positional edge past Stockfish's horizon). Never dismiss either — the disagreement is the signal.\n\n" +
329
336
  "Contempt (`contempt`) skews Lc0 (only Lc0 — Stockfish always stays objective) toward White (positive) or Black (negative). Practical range -20..+20. Use it to find non-objective 'practical' ideas or when the user needs to steer toward fighting/solid lines with a specific colour. Do NOT quote a contempt-biased eval as objective — cross-check with Stockfish.\n\n" +
330
- "For the full guide including worked examples, use the `engine_usage_primer` prompt.\n\n" +
337
+ "For the full guide including worked examples, call the `read_engine_usage_guide` tool.\n\n" +
331
338
  "Not for casual questions — this costs real money per second. Use the free `analyse` tool (single Stockfish, 2s) or `get_position_stats` for anything that doesn't require deep prep.",
332
339
  inputSchema: {
333
340
  type: "object",
@@ -355,6 +362,16 @@ const TOOLS = [
355
362
  required: ["fen"],
356
363
  },
357
364
  },
365
+ {
366
+ name: "read_engine_usage_guide",
367
+ description: "Returns the full chess.ceo engine-usage guide: when to trust Stockfish (objective truth) vs Lc0 (practical eval), how to read disagreements between them, and how to use Lc0 contempt to find non-objective 'practical' ideas. Call this ONCE per session before running expensive `cloud_analyse` calls or when the user asks WHY the engines gave certain scores. Same content is also available as the `engine_usage_primer` prompt (for clients that surface prompts as slash commands), but many clients do not expose prompts to the model — this tool works everywhere.",
368
+ inputSchema: { type: "object", properties: {} },
369
+ },
370
+ {
371
+ name: "read_prep_strategy_guide",
372
+ description: "Returns the full chess.ceo prep-strategy guide: why win% is one weight not a verdict, why prep is a two-player game with symmetric information (opponent sees your history too), how sample size and recency change the reading, when 'revealed weaknesses' are actionable vs already patched, how to use move-order tricks with the `trs` field, and how to calibrate surprise (rare secondary lines inside the existing repertoire, not big first-move switches). Call this ONCE per session before recommending an opening plan, especially when the user is preparing for a specific real opponent.",
373
+ inputSchema: { type: "object", properties: {} },
374
+ },
358
375
  {
359
376
  name: "prep_snapshot",
360
377
  description: "One call, three parallel fetches at the same position: opponent's stats on their side, your stats on your side, and the 11.7M-game general database at that position. Use this while walking the opening tree — one round trip instead of three separate calls, and you can compare the three views directly (e.g. opponent has 2 games here but the general DB has 8k → prep candidate).",
@@ -427,6 +444,8 @@ async function callTool(name, args) {
427
444
  case "list_player_live_tournaments":
428
445
  // Note: snake_case fide_id, unlike the prep endpoints. Documented quirk.
429
446
  return get("/api/chess/live/player", { fide_id: Number(args.fide_id) });
447
+ case "list_cloud_machine_options":
448
+ return authedRequest("GET", "/api/agent/cloud-engines/options");
430
449
  case "start_cloud_engine":
431
450
  return authedRequest("POST", "/api/agent/cloud-engines", {
432
451
  machineType: String(args.machine_type),
@@ -445,6 +464,10 @@ async function callTool(name, args) {
445
464
  body.contempt = args.contempt;
446
465
  return authedRequest("POST", "/api/agent/cloud-engines/analyse", body);
447
466
  }
467
+ case "read_engine_usage_guide":
468
+ return { guide: ENGINE_USAGE_DOC };
469
+ case "read_prep_strategy_guide":
470
+ return { guide: PREP_STRATEGY_DOC };
448
471
  case "prep_snapshot": {
449
472
  const me = Number(args.fide_id_me);
450
473
  const opp = Number(args.fide_id_opponent);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chessceo/mcp",
3
- "version": "0.8.0",
3
+ "version": "0.10.0",
4
4
  "description": "Model Context Protocol server for chess.ceo — 11.7M+ games, ~1.5M FIDE player profiles, opening preparation, live broadcasts.",
5
5
  "type": "module",
6
6
  "bin": {