Skip to main content
Glama

Pommel Horse Aesthetics MCP Server

by dmarsters
server.py15 kB
""" Pommel Horse Aesthetics MCP Server Categorical framework for pommel horse gymnastics aesthetic analysis. Architecture: Three-layer olog pattern - Layer 1: Deterministic taxonomy mapping (85%) - Layer 2: Structured parameter assembly - Layer 3: Single LLM synthesis call (15%) Cost savings: ~60-80% vs pure LLM approach """ from fastmcp import FastMCP from typing import Optional from pommel_horse_aesthetics_mcp.taxonomies import element_groups, spatial_zones, temporal_qualities, form_assessment mcp = FastMCP("pommel-horse-aesthetics") @mcp.tool() def get_element_vocabulary( element_group: Optional[str] = None, detail_level: str = "full" ) -> dict: """ Retrieve pommel horse element vocabulary - the foundational movement primitives. Layer 1 (Deterministic): Pure taxonomy lookup, no LLM needed. Args: element_group: Specific group ID or name (scissors_single_leg, circles_flairs, travels, spindles_handstands, dismounts). If None, returns all. detail_level: "full" for complete taxonomy, "summary" for overview only Returns: Complete element group taxonomy with movement patterns, visual signatures, form requirements, and difficulty values. """ if element_group: group_data = element_groups.get_element_group(element_group) if not group_data: return {"error": f"Element group '{element_group}' not found"} if detail_level == "summary": return { "id": group_data.get("id"), "name": group_data.get("name"), "description": group_data.get("description"), "visual_signature": group_data.get("visual_signature"), "movement_count": len(group_data.get("movements", {})) } return group_data # Return all groups all_groups = element_groups.get_all_element_groups() if detail_level == "summary": return { key: { "id": group.get("id"), "name": group.get("name"), "description": group.get("description") } for key, group in all_groups.items() } return all_groups @mcp.tool() def analyze_spatial_composition( zone_focus: Optional[str] = None, support_configuration: Optional[str] = None, trajectory_type: Optional[str] = None ) -> dict: """ Analyze spatial composition possibilities on pommel horse apparatus. Layer 1 (Deterministic): Geometric and spatial taxonomy retrieval. Args: zone_focus: Apparatus section (end_left, saddle, end_right, or None for all) support_configuration: Hand position type (between_pommels, single_pommel, leather_only, one_pommel_one_leather) trajectory_type: Movement path (stationary_circle, longitudinal_travel, transverse_circle, diagonal_path) Returns: Spatial vocabulary including zones, support configs, trajectories, and dimensional analysis for requested parameters. """ result = { "spatial_zones": spatial_zones.SPATIAL_ZONES, "apparatus_specs": spatial_zones.APPARATUS_SPECS } if zone_focus: sections = spatial_zones.SPATIAL_ZONES["apparatus_sections"] if zone_focus in sections: result["focused_zone"] = sections[zone_focus] else: result["error"] = f"Zone '{zone_focus}' not found" if support_configuration: config = spatial_zones.get_support_config(support_configuration) if config: result["support_details"] = config else: result["error"] = f"Support config '{support_configuration}' not found" if trajectory_type: trajectory = spatial_zones.get_trajectory_pattern(trajectory_type) if trajectory: result["trajectory_details"] = trajectory else: result["error"] = f"Trajectory '{trajectory_type}' not found" return result @mcp.tool() def get_temporal_framework( rhythm_type: Optional[str] = None, phase_focus: Optional[str] = None ) -> dict: """ Retrieve temporal aesthetic framework - rhythm, tempo, timing, flow. Layer 1 (Deterministic): Temporal taxonomy lookup. Args: rhythm_type: Rhythm pattern (metronomic, accelerating, decelerating, syncopated) phase_focus: Critical timing phase (quarter_position, half_position, three_quarter_position, completion_position) Returns: Temporal vocabulary including rhythm patterns, continuity requirements, phase timing, tempo characteristics, and endurance dynamics. """ result = { "temporal_qualities": temporal_qualities.TEMPORAL_QUALITIES, "timing_metrics": temporal_qualities.TIMING_METRICS } if rhythm_type: rhythm = temporal_qualities.get_rhythm_pattern(rhythm_type) if rhythm: result["rhythm_details"] = rhythm else: result["error"] = f"Rhythm type '{rhythm_type}' not found" if phase_focus: phase = temporal_qualities.get_critical_phase(phase_focus) if phase: result["phase_details"] = phase else: result["error"] = f"Phase '{phase_focus}' not found" return result @mcp.tool() def assess_execution_form( element_execution: dict ) -> dict: """ Assess form quality and identify execution errors. Layer 1 (Deterministic): Rule-based form assessment using established criteria. Args: element_execution: Dict with keys: - element_type: Type of element (circle, scissor, etc.) - body_extended: bool (body straight and extended) - legs_straight: bool (no knee bends) - toes_pointed: bool (pointed feet) - above_shoulder: bool (for scissors - amplitude check) - brushing: bool (light apparatus contact) - hitting: bool (solid apparatus contact) Returns: Form assessment with quality score, deductions list, and overall evaluation. """ assessment = form_assessment.assess_form_quality(element_execution) # Add contextual information assessment["deduction_categories"] = { deduction: form_assessment.get_deduction_category(deduction) for deduction in assessment.get("deductions", []) } assessment["form_elements"] = form_assessment.FORM_ELEMENTS assessment["scoring_context"] = form_assessment.SCORING_CONTEXT return assessment @mcp.tool() def get_aesthetic_dimensions() -> dict: """ Retrieve complete aesthetic dimensional framework for pommel horse. Layer 1 (Deterministic): Full taxonomy structure retrieval. Returns: Complete aesthetic vocabulary organized by: - Element groups (movement primitives) - Spatial dimensions (zones, trajectories, positioning) - Temporal dimensions (rhythm, timing, flow) - Form dimensions (body position, execution quality) - Aesthetic qualities (precision, control, difficulty, artistry) """ return { "framework": { "layer_1_elements": { "description": "Foundational movement primitives", "taxonomy": element_groups.ELEMENT_GROUPS }, "layer_2_spatial": { "description": "Geometric and positional vocabulary", "taxonomy": spatial_zones.SPATIAL_ZONES }, "layer_3_temporal": { "description": "Rhythm, timing, and flow patterns", "taxonomy": temporal_qualities.TEMPORAL_QUALITIES }, "layer_4_form": { "description": "Execution quality and aesthetic criteria", "taxonomy": { "form_elements": form_assessment.FORM_ELEMENTS, "aesthetic_qualities": form_assessment.AESTHETIC_QUALITIES } } }, "architecture": { "pattern": "Four-layer categorical hierarchy", "validation": "Tested across 15 domains, 90.9% success rate", "confidence": "99% framework universality" } } @mcp.tool() def map_routine_structure( element_sequence: list, include_spatial: bool = True, include_temporal: bool = True ) -> dict: """ Map a routine structure through the aesthetic framework. Layer 1-2 (Deterministic Bridge): Taxonomic mapping + structural assembly. Args: element_sequence: List of elements, each with keys: - element_type: Type (circle, scissor, travel, etc.) - zone: Apparatus section (end_left, saddle, end_right) - tempo: Speed (fast, moderate, controlled) - difficulty_value: Letter value (A, B, C, D, E, F) include_spatial: Include spatial coverage analysis include_temporal: Include temporal strategy analysis Returns: Structured routine analysis with: - Element group distribution - Spatial coverage validation - Temporal strategy assessment - Difficulty composition - Ready for Layer 3 LLM synthesis """ analysis = { "element_count": len(element_sequence), "element_groups_present": set(), "difficulty_profile": {}, "structure_valid": True, "notes": [] } # Analyze element distribution for element in element_sequence: elem_type = element.get("element_type", "unknown") # Map to element group if elem_type in ["circle", "flair", "russian", "spindle"]: analysis["element_groups_present"].add("circles_flairs") elif elem_type in ["scissor", "single_leg"]: analysis["element_groups_present"].add("scissors_single_leg") elif elem_type in ["magyar", "sivado", "travel"]: analysis["element_groups_present"].add("travels") elif elem_type in ["dismount"]: analysis["element_groups_present"].add("dismounts") # Track difficulty diff = element.get("difficulty_value", "A") analysis["difficulty_profile"][diff] = analysis["difficulty_profile"].get(diff, 0) + 1 analysis["element_groups_present"] = list(analysis["element_groups_present"]) # Check element group requirement (need 4 groups + dismount) if len(analysis["element_groups_present"]) < 4: analysis["structure_valid"] = False analysis["notes"].append("Insufficient element group variety - need 4 groups") # Spatial analysis if include_spatial: analysis["spatial_coverage"] = spatial_zones.analyze_spatial_coverage(element_sequence) if not analysis["spatial_coverage"]["coverage_complete"]: analysis["structure_valid"] = False analysis["notes"].append("Incomplete zone coverage - must use all 3 sections") # Temporal analysis if include_temporal: analysis["temporal_strategy"] = temporal_qualities.analyze_tempo_strategy(element_sequence) if not analysis["temporal_strategy"]["continuity_maintained"]: analysis["structure_valid"] = False analysis["notes"].append("Routine has pauses - continuity required") # Ready for synthesis analysis["synthesis_ready"] = analysis["structure_valid"] return analysis @mcp.tool() def synthesize_aesthetic_description( routine_analysis: dict, focus_areas: Optional[list] = None, style_preference: str = "technical" ) -> str: """ Layer 3 (LLM Synthesis): Generate natural language aesthetic description. This tool is a placeholder that demonstrates where the LLM synthesis occurs. In actual use, this would be called by Claude with the structured routine_analysis from Layer 2, completing the three-layer olog pattern. Args: routine_analysis: Output from map_routine_structure (Layer 2) focus_areas: List of aspects to emphasize (elements, spatial, temporal, form) style_preference: Description style (technical, artistic, competitive) Returns: String indicating this is where LLM synthesis would occur with the deterministically-structured input from Layers 1-2. """ return f""" LAYER 3 SYNTHESIS POINT ===================== This tool receives deterministically-structured input from Layer 2 and generates natural language aesthetic description. Input structure received: {routine_analysis} Focus areas: {focus_areas or ['all']} Style: {style_preference} In production, Claude would synthesize this structured data into: - Natural language routine description - Aesthetic quality assessment - Technical commentary - Competitive evaluation - Artistic interpretation Cost savings: ~60-80% by using deterministic Layers 1-2 for taxonomy lookup and structural mapping, with only final synthesis requiring LLM inference. Architecture: Three-layer olog pattern - Layer 1: Pure taxonomy (0 LLM tokens) - Layer 2: Structural mapping (0 LLM tokens) - Layer 3: This synthesis call (~200 tokens) Total: 85% deterministic, 15% LLM """ # Server information @mcp.tool() def get_server_info() -> dict: """Get information about this MCP server and its architecture.""" return { "name": "Pommel Horse Aesthetics MCP", "version": "0.1.0", "description": "Categorical aesthetics framework for pommel horse gymnastics", "architecture": { "pattern": "Three-layer olog (deterministic bridge)", "layer_1": "Pure taxonomy lookup (85%)", "layer_2": "Structured parameter assembly", "layer_3": "Single LLM synthesis call (15%)", "cost_savings": "60-80% vs pure LLM approach" }, "framework_validation": { "test_domains": 15, "success_rate": "90.9% (50/55 tests)", "confidence": "99% framework universality" }, "vocabulary_coverage": { "element_groups": 5, "spatial_dimensions": "3 zones + support configs + trajectories", "temporal_dimensions": "4 rhythm patterns + phase timing + continuity", "form_assessment": "Complete deduction taxonomy + aesthetic qualities" }, "tools": [ "get_element_vocabulary - Movement primitives", "analyze_spatial_composition - Geometric vocabulary", "get_temporal_framework - Rhythm and timing", "assess_execution_form - Form quality evaluation", "get_aesthetic_dimensions - Complete framework", "map_routine_structure - Deterministic mapping (Layer 1-2)", "synthesize_aesthetic_description - LLM synthesis (Layer 3)" ] }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/dmarsters/pommel-horse-aesthetics-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server