@chessceo/mcp 0.49.3 → 0.49.5

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.
package/dist/index.js CHANGED
@@ -114,6 +114,18 @@ const SUMMARY_AUTHORING_DOC = loadBundledDoc("summary-authoring.md", "Summary au
114
114
  // all intact) — not summarised into English.
115
115
  const EXAMPLE_OVERVIEW_PGN = loadBundledDoc("examples/italian-fried-liver.pgn", "Italian Fried Liver overview example");
116
116
  const EXAMPLE_REPERTOIRE_PGN = loadBundledDoc("examples/najdorf-6-f4-white.pgn", "Najdorf 6.f4 White repertoire example");
117
+ // Per-engine guidance surfaced in list_cloud_machine_options' RESPONSE only
118
+ // (an AUTHED_TOOLS-gated call, both transports — see authedRequest's
119
+ // missing-token check and isAuthedToolCall's 401+WWW-Authenticate
120
+ // pre-check). Deliberately NOT in this tool's static `description` in
121
+ // tools.ts, since tools/list itself is reachable without authentication —
122
+ // putting it there would surface this to any caller who can list tools,
123
+ // not just ones who actually hold a token.
124
+ const ENGINE_GUIDE = {
125
+ stockfish: "Objective calculation — the ground truth for whether a line is actually winning/drawn/losing with best play, whether a tactic is real, whether a defense holds. Gives 0.00 to a large share of normal positions even when one side is much harder to play for a human — that means 'drawn with best play,' not 'trivial' or 'nothing to look for.'",
126
+ lc0: "Neural-net engine trained on human-style play, roughly 3500-strength. Its evaluation approximates how a strong human judges the position (practical chances, initiative, structure) rather than pure objective truth — good for finding ideas and gauging which side is easier to play over the board. Has real weaknesses in unconventional/irregular positions outside its training distribution: evals there can be unstable or it can miss a deep concrete tactic. When it disagrees sharply with Stockfish, look for the tactical justification before trusting its read.",
127
+ combo: "Runs Stockfish and Lc0 together — use when you want both the objective read and the practical/human-feel read on the same position.",
128
+ };
117
129
  // v0.48: consolidated the five `read_*_guide` / `read_example_prep_files`
118
130
  // tools into ONE `read_docs`. LLM lists what it wants; we return them
119
131
  // in a single response. Also cleaner: enumerating available docs in one
@@ -367,11 +379,15 @@ async function callToolInner(name, args) {
367
379
  case "list_player_live_tournaments":
368
380
  // Note: snake_case fide_id, unlike the prep endpoints. Documented quirk.
369
381
  return get("/api/chess/live/player", { fide_id: Number(args.fide_id) });
370
- case "list_cloud_machine_options":
371
- return authedRequest("GET", "/api/agent/cloud-engines/options");
382
+ case "list_cloud_machine_options": {
383
+ const raw = await authedRequest("GET", "/api/agent/cloud-engines/options");
384
+ const resp = raw;
385
+ return { ...(resp && typeof resp === "object" ? resp : { options: [] }), engine_guide: ENGINE_GUIDE };
386
+ }
372
387
  case "start_cloud_engine":
373
388
  return authedRequest("POST", "/api/agent/cloud-engines", {
374
389
  machineType: String(args.machine_type),
390
+ ...(typeof args.engine_type === "string" ? { engineType: args.engine_type } : {}),
375
391
  });
376
392
  case "list_cloud_engines":
377
393
  return authedRequest("GET", "/api/agent/cloud-engines");
package/dist/tools.js CHANGED
@@ -258,20 +258,25 @@ export const TOOLS = [
258
258
  },
259
259
  {
260
260
  name: "list_cloud_machine_options",
261
- 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.",
261
+ description: "Returns the catalog of cloud-engine machine types the user can start — every engine shape (stockfish-only, lc0-only, and combo) they're entitled to, same visibility rules as the chess.ceo app (SKU, which engine(s) it runs, human display name, cost per hour, availability), plus an `engine_guide` explaining what each engine type is actually good/bad for so you can pick the right one for the task, not just the cheapest. 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, and a given SKU only supports the engine(s) shown in its `engine` field (a stockfish-only SKU cannot be started as lc0 or combo). Present the user the display names + prices; pass the SKU to start_cloud_engine.",
262
262
  inputSchema: { type: "object", properties: {} },
263
263
  },
264
264
  {
265
265
  name: "start_cloud_engine",
266
- 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" +
267
- "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" +
268
- "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.",
266
+ description: "Rent a GPU/CPU instance on the user's chess.ceo account — stockfish-only, lc0-only, or combo (both in one container), whichever the chosen SKU provides. Real money — billed per second while running.\n\n" +
267
+ "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. `engine_type` must match what that SKU actually provides (its `engine` field from the catalog) — omit it to default to whatever the SKU is (a combo SKU defaults to \"combo\").\n\n" +
268
+ "Use list_cloud_engines first to check if the user already has one running; don't start a second instance unless the user asked for it. Requires an MCP token with agent access.",
269
269
  inputSchema: {
270
270
  type: "object",
271
271
  properties: {
272
272
  machine_type: {
273
273
  type: "string",
274
- 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.",
274
+ description: "SKU from list_cloud_machine_options (e.g. 'rtx-5090-64', 'rtx-5090', 'epyc-256'). MUST be the exact SKU, not the display name and not a guess.",
275
+ },
276
+ engine_type: {
277
+ type: "string",
278
+ enum: ["stockfish", "lc0", "combo"],
279
+ description: "Which engine(s) to run. Must match the SKU's own `engine` field from list_cloud_machine_options — e.g. a stockfish-only SKU can only be started as \"stockfish\". Optional; defaults to \"combo\".",
275
280
  },
276
281
  },
277
282
  required: ["machine_type"],
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chessceo/mcp",
3
- "version": "0.49.3",
3
+ "version": "0.49.5",
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": {