MCP Server

PlyMove

com.plymove/mcp
Education Gaming Public & reachable MCP 2026-07-28

What this MCP does

Analyzes chess positions and games with engine lines, move comparisons, teaching moments, and explanations tailored to learner rating.

analyze_what_if
Analyze a user-requested alternative at a mainline decision point: legal SAN validation, Stockfish continuation, Maia naturalness, teaching point, and annotated RAV PGN (read-only).
Read only Idempotent
Input schema
{'type': 'object', 'required': ['alternative_move_san', 'target_elo'], 'properties': {'pgn': {'type': 'string', 'description': 'Full game PGN (or use analysis_id from a prior storyboard)'}, 'anchor_ply': {'type': 'integer', 'description': 'Mainline ply of the played move (decision point)'}, 'move_label': {'type': 'string', 'description': 'Human move label e.g. 17...Be6 or 24.Rxd4'}, 'target_elo': {'type': 'integer', 'maximum': 3500, 'minimum': 400}, 'analysis_id': {'type': 'string', 'description': 'Stored analysis id when PGN is omitted'}, 'engine_depth': {'type': 'integer', 'maximum': 20, 'minimum': 4}, 'analysis_profile': {'enum': ['fast', 'chatgpt', 'standard', 'deep'], 'type': 'string', 'description': 'Time/depth budget profile'}, 'max_branch_plies': {'type': 'integer', 'maximum': 16, 'minimum': 2, 'description': 'Max continuation plies'}, 'alternative_move_san': {'type': 'string', 'description': 'Requested alternative in SAN — never auto-substituted'}}}
Output schema
{'type': 'object', 'required': ['target_elo', 'played_move', 'alternative_move', 'continuation_sans', 'teaching_point', 'rav_pgn', 'branches_legal', 'branch_semantically_attached'], 'properties': {'kind': {'type': 'string'}, 'schema': {'type': 'string'}, 'rav_pgn': {'type': 'string'}, 'anchor_ply': {'type': 'integer'}, 'fen_before': {'type': 'string'}, 'move_label': {'type': 'string'}, 'target_elo': {'type': 'integer'}, 'diagnostics': {'type': 'object', 'additionalProperties': True}, 'played_move': {'type': 'string'}, 'branches_legal': {'type': 'boolean'}, 'teaching_point': {'type': 'string'}, 'alternative_move': {'type': 'string'}, 'maia_probability': {'type': 'number'}, 'continuation_sans': {'type': 'array', 'items': {'type': 'string'}}, 'mainline_preserved': {'type': 'boolean'}, 'evaluation_delta_cp': {'type': 'integer'}, 'branch_semantically_attached': {'type': 'boolean'}}, 'description': 'User-requested what-if branch with legal RAV and teaching comparison.'}
build_game_storyboard
Build a verified Elo-aware game storyboard: opening, story arc, ranked moments, branches, and main lesson. Read-only analysis — does not modify user files or external systems.
Read only Idempotent
Input schema
{'type': 'object', 'required': ['pgn', 'target_elo'], 'properties': {'pgn': {'type': 'string', 'description': 'Full game PGN'}, 'language': {'type': 'string', 'default': 'en', 'description': 'Output language (e.g. en)'}, 'target_elo': {'type': 'integer', 'maximum': 3500, 'minimum': 400, 'description': 'Learner Elo rating'}, 'max_moments': {'type': 'integer', 'default': 5, 'maximum': 12, 'minimum': 1, 'description': 'Maximum storyboard chapters'}, 'engine_depth': {'type': 'integer', 'maximum': 24, 'minimum': 4, 'description': 'Stockfish depth for deep analysis'}, 'output_format': {'enum': ['annotated_pgn', 'storyboard_json', 'both'], 'type': 'string', 'default': 'both', 'description': 'Return annotated PGN, JSON storyboard, or both (default both).'}, 'shallow_depth': {'type': 'integer', 'maximum': 20, 'minimum': 4, 'description': 'Stockfish depth for selective shallow scan (defaults to min(engine_depth, 10))'}, 'include_rendered_story': {'type': 'boolean', 'default': True, 'description': 'Include accessible recap prose'}}}
Output schema
{'type': 'object', 'required': ['kind', 'target_elo', 'verification'], 'properties': {'game': {'type': 'object', 'properties': {'black': {'type': 'string'}, 'event': {'type': 'string'}, 'white': {'type': 'string'}, 'result': {'type': 'string'}}}, 'kind': {'enum': ['storyboard'], 'type': 'string'}, 'build': {'type': 'object', 'properties': {'git_sha': {'type': 'string'}, 'version': {'type': 'string'}, 'core_git_sha': {'type': 'string'}, 'deployment_id': {'type': 'string'}, 'adapter_git_sha': {'type': 'string'}, 'adapter_version': {'type': 'string'}, 'upstream_mcp_url': {'type': 'string'}, 'storyboard_pipeline_version': {'type': 'string'}}}, 'engine': {'type': 'object', 'properties': {'name': {'type': 'string'}, 'depth': {'type': 'integer'}, 'version': {'type': 'string'}}}, 'moments': {'type': 'array', 'items': {'type': 'object', 'properties': {'rank': {'type': 'integer'}, 'title': {'type': 'string'}, 'branches': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}}, 'category': {'type': 'string'}, 'event_id': {'type': 'string'}, 'sequence': {'type': 'object', 'additionalProperties': True}, 'anchor_ply': {'type': 'integer'}, 'move_label': {'type': 'string'}, 'reason_selected': {'type': 'string'}}}}, 'opening': {'type': 'object', 'properties': {'eco': {'type': 'string'}, 'name': {'type': 'string'}, 'family': {'type': 'string'}, 'source': {'type': 'string'}, 'variation': {'type': 'string'}, 'confidence': {'type': 'number'}, 'recognized': {'type': 'boolean'}, 'source_pin': {'type': 'string'}, 'matched_ply': {'type': 'integer'}}}, 'story_arc': {'type': 'object', 'properties': {'premise': {'type': 'string'}, 'resolution': {'type': 'string'}, 'main_lesson': {'type': 'string'}, 'climax_event_id': {'type': 'string'}, 'first_imbalance': {'type': 'string'}}}, 'target_elo': {'type': 'integer', 'maximum': 3500, 'minimum': 400}, 'analysis_id': {'type': 'string'}, 'diagnostics': {'type': 'object', 'properties': {'degraded': {'type': 'boolean'}, 'cache_hit': {'type': 'boolean'}, 'runtime_ms': {'type': 'integer'}, 'output_format': {'type': 'string'}, 'stage_timings': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}}, 'branch_coverage': {'type': 'object', 'additionalProperties': True}, 'events_detected': {'type': 'integer'}, 'moments_selected': {'type': 'integer'}, 'positions_scanned': {'type': 'integer'}, 'opening_explanation': {'type': 'string'}}, 'additionalProperties': True}, 'human_model': {'type': 'object', 'properties': {'name': {'type': 'string'}, 'status': {'enum': ['available', 'degraded', 'unavailable'], 'type': 'string'}, 'version': {'type': 'string'}, 'target_elo': {'type': 'integer'}}}, 'main_lesson': {'type': 'string'}, 'verification': {'type': 'object', 'properties': {'warnings': {'type': 'array', 'items': {'type': 'string'}}, 'pgn_legal': {'type': 'boolean'}, 'claim_count': {'type': 'integer'}, 'branch_count': {'type': 'integer'}, 'branches_legal': {'type': 'boolean'}, 'mainline_legal': {'type': 'boolean'}, 'claims_verified': {'type': 'boolean'}, 'opening_verified': {'type': 'boolean'}, 'mainline_preserved': {'type': 'boolean'}, 'all_variations_legal': {'type': 'boolean'}, 'verified_claim_count': {'type': 'integer'}, 'branch_coverage_ratio': {'type': 'number'}, 'chapters_with_branches': {'type': 'integer'}, 'pedagogical_branch_count': {'type': 'integer'}, 'chapters_requiring_branches': {'type': 'integer'}}}, 'annotated_pgn': {'type': 'string', 'description': 'Legal annotated PGN when output_format includes annotated_pgn or both.'}, 'rendered_story': {'type': 'string'}, 'human_model_available': {'type': 'boolean'}}, 'description': 'Elo-aware game storyboard with optional annotated PGN, opening, story arc, ranked moments, and verification.'}
compare_moves
Compare candidate moves at a position for a learner (read-only analysis).
Read only Idempotent
Input schema
{'type': 'object', 'required': ['fen', 'moves', 'target_elo'], 'properties': {'fen': {'type': 'string', 'description': 'Position FEN'}, 'moves': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Candidate moves in SAN'}, 'target_elo': {'type': 'integer', 'maximum': 3500, 'minimum': 400, 'description': 'Learner Elo rating'}}}
Output schema
{'type': 'object', 'required': ['target_elo', 'fen', 'comparisons'], 'properties': {'fen': {'type': 'string'}, 'schema': {'type': 'string'}, 'target_elo': {'type': 'integer'}, 'comparisons': {'type': 'array', 'items': {'type': 'object', 'required': ['move_san', 'legal'], 'properties': {'task': {'type': 'object', 'additionalProperties': True}, 'legal': {'type': 'boolean'}, 'move_san': {'type': 'string'}, 'explanation': {'type': 'string'}, 'teaching_score': {'type': 'number'}}}}, 'diagnostics': {'type': 'object', 'additionalProperties': True}}, 'description': 'Pedagogical comparison of candidate moves at a position.'}
explain_game
Legacy alias for build_game_storyboard — Elo-aware game storyboard (read-only analysis; does not write files).
Read only Idempotent
Input schema
{'type': 'object', 'required': ['pgn', 'target_elo'], 'properties': {'pgn': {'type': 'string', 'description': 'Full game PGN'}, 'verbosity': {'enum': ['minimal', 'standard', 'detailed'], 'type': 'string', 'description': 'Storyboard chapter count: minimal (~3), standard (~5), detailed (~8).'}, 'target_elo': {'type': 'integer', 'maximum': 3500, 'minimum': 400, 'description': 'Learner Elo rating'}}}
Output schema
{'type': 'object', 'required': ['kind', 'target_elo', 'verification'], 'properties': {'game': {'type': 'object', 'properties': {'black': {'type': 'string'}, 'event': {'type': 'string'}, 'white': {'type': 'string'}, 'result': {'type': 'string'}}}, 'kind': {'enum': ['storyboard'], 'type': 'string'}, 'build': {'type': 'object', 'properties': {'git_sha': {'type': 'string'}, 'version': {'type': 'string'}, 'core_git_sha': {'type': 'string'}, 'deployment_id': {'type': 'string'}, 'adapter_git_sha': {'type': 'string'}, 'adapter_version': {'type': 'string'}, 'upstream_mcp_url': {'type': 'string'}, 'storyboard_pipeline_version': {'type': 'string'}}}, 'engine': {'type': 'object', 'properties': {'name': {'type': 'string'}, 'depth': {'type': 'integer'}, 'version': {'type': 'string'}}}, 'moments': {'type': 'array', 'items': {'type': 'object', 'properties': {'rank': {'type': 'integer'}, 'title': {'type': 'string'}, 'branches': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}}, 'category': {'type': 'string'}, 'event_id': {'type': 'string'}, 'sequence': {'type': 'object', 'additionalProperties': True}, 'anchor_ply': {'type': 'integer'}, 'move_label': {'type': 'string'}, 'reason_selected': {'type': 'string'}}}}, 'opening': {'type': 'object', 'properties': {'eco': {'type': 'string'}, 'name': {'type': 'string'}, 'family': {'type': 'string'}, 'source': {'type': 'string'}, 'variation': {'type': 'string'}, 'confidence': {'type': 'number'}, 'recognized': {'type': 'boolean'}, 'source_pin': {'type': 'string'}, 'matched_ply': {'type': 'integer'}}}, 'story_arc': {'type': 'object', 'properties': {'premise': {'type': 'string'}, 'resolution': {'type': 'string'}, 'main_lesson': {'type': 'string'}, 'climax_event_id': {'type': 'string'}, 'first_imbalance': {'type': 'string'}}}, 'target_elo': {'type': 'integer', 'maximum': 3500, 'minimum': 400}, 'analysis_id': {'type': 'string'}, 'diagnostics': {'type': 'object', 'properties': {'degraded': {'type': 'boolean'}, 'cache_hit': {'type': 'boolean'}, 'runtime_ms': {'type': 'integer'}, 'output_format': {'type': 'string'}, 'stage_timings': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}}, 'branch_coverage': {'type': 'object', 'additionalProperties': True}, 'events_detected': {'type': 'integer'}, 'moments_selected': {'type': 'integer'}, 'positions_scanned': {'type': 'integer'}, 'opening_explanation': {'type': 'string'}}, 'additionalProperties': True}, 'human_model': {'type': 'object', 'properties': {'name': {'type': 'string'}, 'status': {'enum': ['available', 'degraded', 'unavailable'], 'type': 'string'}, 'version': {'type': 'string'}, 'target_elo': {'type': 'integer'}}}, 'main_lesson': {'type': 'string'}, 'verification': {'type': 'object', 'properties': {'warnings': {'type': 'array', 'items': {'type': 'string'}}, 'pgn_legal': {'type': 'boolean'}, 'claim_count': {'type': 'integer'}, 'branch_count': {'type': 'integer'}, 'branches_legal': {'type': 'boolean'}, 'mainline_legal': {'type': 'boolean'}, 'claims_verified': {'type': 'boolean'}, 'opening_verified': {'type': 'boolean'}, 'mainline_preserved': {'type': 'boolean'}, 'all_variations_legal': {'type': 'boolean'}, 'verified_claim_count': {'type': 'integer'}, 'branch_coverage_ratio': {'type': 'number'}, 'chapters_with_branches': {'type': 'integer'}, 'pedagogical_branch_count': {'type': 'integer'}, 'chapters_requiring_branches': {'type': 'integer'}}}, 'annotated_pgn': {'type': 'string', 'description': 'Legal annotated PGN when output_format includes annotated_pgn or both.'}, 'rendered_story': {'type': 'string'}, 'human_model_available': {'type': 'boolean'}}, 'description': 'Elo-aware game storyboard with optional annotated PGN, opening, story arc, ranked moments, and verification.'}
explain_position
Explain a single position for a target learner Elo (read-only analysis).
Read only Idempotent
Input schema
{'type': 'object', 'required': ['fen', 'target_elo'], 'properties': {'fen': {'type': 'string', 'description': 'Position FEN'}, 'target_elo': {'type': 'integer', 'maximum': 3500, 'minimum': 400, 'description': 'Learner Elo rating'}}}
Output schema
{'type': 'object', 'required': ['target_elo', 'fen'], 'properties': {'fen': {'type': 'string'}, 'task': {'type': 'object', 'additionalProperties': True}, 'schema': {'type': 'string'}, 'evidence': {'type': 'object', 'additionalProperties': True}, 'target_elo': {'type': 'integer'}, 'diagnostics': {'type': 'object', 'additionalProperties': True}, 'explanation': {'type': 'string'}, 'teaching_reason': {'type': 'string'}}, 'description': 'Learner-specific position explanation.'}
find_teaching_moments
Legacy alias for build_game_storyboard — ranked storyboard chapters from a PGN (read-only analysis).
Read only Idempotent
Input schema
{'type': 'object', 'required': ['pgn', 'target_elo'], 'properties': {'pgn': {'type': 'string', 'description': 'Full game PGN'}, 'verbosity': {'enum': ['minimal', 'standard', 'detailed'], 'type': 'string', 'description': 'Storyboard chapter count: minimal (~3), standard (~5), detailed (~8).'}, 'target_elo': {'type': 'integer', 'maximum': 3500, 'minimum': 400, 'description': 'Learner Elo rating'}}}
Output schema
{'type': 'object', 'required': ['kind', 'target_elo', 'verification'], 'properties': {'game': {'type': 'object', 'properties': {'black': {'type': 'string'}, 'event': {'type': 'string'}, 'white': {'type': 'string'}, 'result': {'type': 'string'}}}, 'kind': {'enum': ['storyboard'], 'type': 'string'}, 'build': {'type': 'object', 'properties': {'git_sha': {'type': 'string'}, 'version': {'type': 'string'}, 'core_git_sha': {'type': 'string'}, 'deployment_id': {'type': 'string'}, 'adapter_git_sha': {'type': 'string'}, 'adapter_version': {'type': 'string'}, 'upstream_mcp_url': {'type': 'string'}, 'storyboard_pipeline_version': {'type': 'string'}}}, 'engine': {'type': 'object', 'properties': {'name': {'type': 'string'}, 'depth': {'type': 'integer'}, 'version': {'type': 'string'}}}, 'moments': {'type': 'array', 'items': {'type': 'object', 'properties': {'rank': {'type': 'integer'}, 'title': {'type': 'string'}, 'branches': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}}, 'category': {'type': 'string'}, 'event_id': {'type': 'string'}, 'sequence': {'type': 'object', 'additionalProperties': True}, 'anchor_ply': {'type': 'integer'}, 'move_label': {'type': 'string'}, 'reason_selected': {'type': 'string'}}}}, 'opening': {'type': 'object', 'properties': {'eco': {'type': 'string'}, 'name': {'type': 'string'}, 'family': {'type': 'string'}, 'source': {'type': 'string'}, 'variation': {'type': 'string'}, 'confidence': {'type': 'number'}, 'recognized': {'type': 'boolean'}, 'source_pin': {'type': 'string'}, 'matched_ply': {'type': 'integer'}}}, 'story_arc': {'type': 'object', 'properties': {'premise': {'type': 'string'}, 'resolution': {'type': 'string'}, 'main_lesson': {'type': 'string'}, 'climax_event_id': {'type': 'string'}, 'first_imbalance': {'type': 'string'}}}, 'target_elo': {'type': 'integer', 'maximum': 3500, 'minimum': 400}, 'analysis_id': {'type': 'string'}, 'diagnostics': {'type': 'object', 'properties': {'degraded': {'type': 'boolean'}, 'cache_hit': {'type': 'boolean'}, 'runtime_ms': {'type': 'integer'}, 'output_format': {'type': 'string'}, 'stage_timings': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}}, 'branch_coverage': {'type': 'object', 'additionalProperties': True}, 'events_detected': {'type': 'integer'}, 'moments_selected': {'type': 'integer'}, 'positions_scanned': {'type': 'integer'}, 'opening_explanation': {'type': 'string'}}, 'additionalProperties': True}, 'human_model': {'type': 'object', 'properties': {'name': {'type': 'string'}, 'status': {'enum': ['available', 'degraded', 'unavailable'], 'type': 'string'}, 'version': {'type': 'string'}, 'target_elo': {'type': 'integer'}}}, 'main_lesson': {'type': 'string'}, 'verification': {'type': 'object', 'properties': {'warnings': {'type': 'array', 'items': {'type': 'string'}}, 'pgn_legal': {'type': 'boolean'}, 'claim_count': {'type': 'integer'}, 'branch_count': {'type': 'integer'}, 'branches_legal': {'type': 'boolean'}, 'mainline_legal': {'type': 'boolean'}, 'claims_verified': {'type': 'boolean'}, 'opening_verified': {'type': 'boolean'}, 'mainline_preserved': {'type': 'boolean'}, 'all_variations_legal': {'type': 'boolean'}, 'verified_claim_count': {'type': 'integer'}, 'branch_coverage_ratio': {'type': 'number'}, 'chapters_with_branches': {'type': 'integer'}, 'pedagogical_branch_count': {'type': 'integer'}, 'chapters_requiring_branches': {'type': 'integer'}}}, 'annotated_pgn': {'type': 'string', 'description': 'Legal annotated PGN when output_format includes annotated_pgn or both.'}, 'rendered_story': {'type': 'string'}, 'human_model_available': {'type': 'boolean'}}, 'description': 'Elo-aware game storyboard with optional annotated PGN, opening, story arc, ranked moments, and verification.'}
Added
analyze_what_if
Sept. 17, 2026, 12:36 p.m.
Added
compare_moves
Sept. 17, 2026, 12:36 p.m.
Added
explain_position
Sept. 17, 2026, 12:36 p.m.
Added
find_teaching_moments
Sept. 17, 2026, 12:36 p.m.
Added
explain_game
Sept. 17, 2026, 12:36 p.m.
Added
build_game_storyboard
Sept. 17, 2026, 12:36 p.m.