@chessceo/mcp 0.36.4 → 0.36.6

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.
@@ -274,7 +274,19 @@ set_nags(id, path, ["$14"])
274
274
 
275
275
  ## Visual annotations (arrows + coloured squares)
276
276
 
277
- `set_annotations(id, path, {arrows, highlights})` sets both together (an atomic replacement pass both current and new). Passing empty arrays clears.
277
+ **Use them.** An arrow says what a sentence would. If a comment mentions a move, a plan, a square, a target draw it. The reader sees the board; a green f2→f4 arrow replaces "White's plan is to break with f4"; a red square on h6 replaces "Black's weak point is h6". Annotations are the fastest LLM→reader channel we have.
278
+
279
+ **When to reach for one (any of these triggers → add):**
280
+
281
+ - Naming a pawn break in prose → arrow from the pawn to its target square (`green` for your break, `red` for the opponent's).
282
+ - Naming a plan involving specific moves (castle long, Nc4-a5, Bxh6) → arrow(s) for the piece routes.
283
+ - Naming a key square / weak square / target → highlight (`green` = key square for you, `red` = weak square you exploit or that Black attacks).
284
+ - Naming a piece under pressure or a piece that will become the target → highlight the square it's on.
285
+ - Showing multiple candidate moves in one comment → arrow per candidate, different colours.
286
+
287
+ If the comment could be *replaced* by two arrows and a highlighted square, then the arrows + squares alone are better and the prose is redundant. Try that direction first.
288
+
289
+ `set_annotations(id, node_id, {arrows, highlights})` sets both together — atomic replacement, pass both current and new. Empty arrays clear.
278
290
 
279
291
  Colours (both arrows and squares): `green`, `red`, `yellow`, `light-blue`, `dark-blue`, `orange`.
280
292
 
@@ -289,7 +301,7 @@ Usage conventions:
289
301
  | dark-blue | Alternative / secondary idea |
290
302
  | orange | Attention / warning |
291
303
 
292
- **Keep it light.** 1–3 arrows per node and 2–3 highlighted squares is plenty. Twenty arrows is noise, not signalpick the most important ones. Highlights are labels, not decoration.
304
+ **Keep it light.** 1–3 arrows per node and 2–3 highlighted squares is plenty. Twenty arrows is noise. Highlights are labels, not decoration. **But zero arrows on a strategic branch-point comment is usually a miss** if the comment names a plan, a break, a square, or a piece, the corresponding annotation almost certainly exists and is worth adding.
293
305
 
294
306
  Example:
295
307
  ```
@@ -173,7 +173,7 @@ Depth calibrates to the *character* of the position, not to whether the DB has g
173
173
 
174
174
  - **Forcing → keep going.** Concrete tactics, only-moves, sharp sequences — analyse until the position calms (real endgame, stable middlegame structure). No game data doesn't matter; the moves are forced, so there's nothing to look up anyway. `describe_position` + engine is enough.
175
175
  - **Quiet → stop early.** Once the position is strategic — many reasonable moves, no immediate threats — one sentence of plans is worth more than another 6 plies of tree. Stop and describe.
176
- - **Novelties MUST branch.** If you're introducing a move nobody's played, "the DB has no games" is not a reason to stop the reader will actually reach this position over the board and needs an answer. Predict the opponent's replies with `predict_human_move` (rating-conditioned to their level), sanity-check with Stockfish (objective best) and Lc0 (practical alternatives), then branch on the top ~2 predicted responses. This is precisely where all three signals matter most, because there's no historical answer to lean on. See also "Novelty burns" — save deep novelty-prep for the games that actually warrant it.
176
+ - **Novelties still need coverage — but the position tells you HOW.** If you're introducing a move nobody's played, "the DB has no games" is not a reason to stop; the reader will reach this position over the board and needs an answer. The shape of that coverage follows the same forcing/quiet rule above: if the novelty forces a single reply, cover just that line; if it opens several plausible replies, branch on them. Predict the opponent with `predict_human_move` (rating-conditioned), sanity-check with Stockfish (objective) and Lc0 (practical alternatives). All three signals matter *most* here precisely because no game-database answer exists. See also "Novelty burns" — that's a separate rule about WHEN to spend a novelty.
177
177
 
178
178
  ## How to combine these
179
179
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chessceo/mcp",
3
- "version": "0.36.4",
3
+ "version": "0.36.6",
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": {