{"ok":true,"site":{"host":"pitchlab-webmcp-rv45k2kgyq-uc.a.run.app","url":"https://pitchlab-webmcp-rv45k2kgyq-uc.a.run.app/","type":"live","desc":"An agent-ready biomechanics workspace where people and agents inspect, navigate, correct, and annotate the same motion evidence.","tools":[{"name":"list_pitch_sessions","kind":"answer","impl":"imperative","description":"Lists the pitch analyses available in this browser, with pitcher handedness, camera view, frame count, and whether each has been analysed yet. Start here: every other tool addresses a pitch by the sessionId returned from this list.","title":"List pitch sessions","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"get_session_overview","kind":"answer","impl":"imperative","description":"Returns what is on screen right now: the loaded pitch, the frame the viewer is scrubbed to, the joint in focus, the camera plane, which overlays are on, which events were detected, and how many notes are pinned. This is live browser state — call it before discussing anything so your words match what the human sees.","title":"Get session overview","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"sessionId":{"type":"string","description":"Defaults to the pitch currently on screen."}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"get_phase_events","kind":"answer","impl":"imperative","description":"Returns the three detected pitching events — lead foot contact, maximum external rotation, and ball release — with frame number, video timestamp, the signal each was detected from, its confidence, and whether a human corrected it. Every other measurement is anchored to these frames, so read them before interpreting any angle.","title":"Get phase events","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"sessionId":{"type":"string","description":"Defaults to the pitch currently on screen."}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"get_kinematics_at_event","kind":"answer","impl":"imperative","description":"Returns the joint angles measured at one pitching event (foot_contact | max_external_rotation | ball_release), each with its value in degrees, the published reference range where one exists, whether it sits inside that range, and its measurement confidence. One call gives a complete reference-anchored snapshot of that instant.","title":"Get kinematics at an event","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"event":{"type":"string","enum":["foot_contact","max_external_rotation","ball_release"],"description":"Which pitching event to measure at."},"sessionId":{"type":"string","description":"Defaults to the pitch currently on screen."}},"required":["event"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"get_joint_angle_series","kind":"answer","impl":"imperative","description":"Returns one joint angle sampled across the pitch, so you can reason about the shape of the movement rather than a single instant — when the peak happens and how sharp it is. Optionally restrict the window to between two events. Downsampled to maxPoints (default 40); the reported peak still comes from the full-resolution series.","title":"Get joint angle series","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"joint":{"type":"string","enum":["lead_knee_flexion","trail_knee_flexion","lead_hip_flexion","elbow_flexion","shoulder_abduction","shoulder_external_rotation","shoulder_horizontal_abduction","trunk_forward_tilt","trunk_lateral_tilt","hip_shoulder_separation","lead_foot_angle"],"description":"Which angle to trace, e.g. shoulder_external_rotation or lead_knee_flexion."},"fromEvent":{"type":"string","enum":["foot_contact","max_external_rotation","ball_release"],"description":"Window start. Default: clip start."},"toEvent":{"type":"string","enum":["foot_contact","max_external_rotation","ball_release"],"description":"Window end. Default: clip end."},"maxPoints":{"type":"integer","description":"Samples to return, 5–120. Default 40, which keeps the response inside the output budget."},"sessionId":{"type":"string","description":"Defaults to the pitch currently on screen."}},"required":["joint"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"get_kinematic_sequence","kind":"answer","impl":"imperative","description":"Returns a partial four-segment order: pelvis, trunk, upper arm and forearm peak angular speed. It is not a published full five-segment kinematic sequence or a quality score. Read literatureNote before judging the order: a different order is common and is not by itself a fault.","title":"Get kinematic sequence","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"sessionId":{"type":"string","description":"Defaults to the pitch currently on screen."}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"get_metric_definition","kind":"answer","impl":"imperative","description":"Explains one biomechanical metric: what it measures in plain language, exactly how this app computes it, its published reference ranges with citations, and the limits of measuring it from single-camera video. Use it before quoting any range — it is the only source of reference numbers here, and it also explains which quantities this reconstruction cannot produce at all.","title":"Get metric definition","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"metric":{"type":"string","description":"A metric name, e.g. hip_shoulder_separation, or a quantity you want to check is measurable."}},"required":["metric"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"compare_to_reference","kind":"act","impl":"imperative","description":"Answers plain-English questions such as “what stands out?” or “where did I mess up?” by comparing only construct-compatible angles, ranking observations, checking event reliability, and suggesting the existing viewer tools that can show the relevant moment and body part. It never treats a deviation as a diagnosis or proven cause.","title":"Compare to reference ranges","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"event":{"type":"string","enum":["foot_contact","max_external_rotation","ball_release"],"description":"Restrict to one event. Default: all three."},"includeWithinRange":{"type":"boolean","description":"Also return metrics that sit inside their range. Default false."},"sessionId":{"type":"string","description":"Defaults to the pitch currently on screen."}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"compare_pitches","kind":"act","impl":"imperative","description":"Compares two analysed sessions metric by metric at the same events and returns descriptive differences. It must not imply improvement or change between attempts unless athlete identity and capture comparability are established outside this data contract. The second session is analysed without changing the human view; read meta.caveats.","title":"Compare two pitches","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"sessionIdA":{"type":"string","description":"Baseline pitch. Defaults to the pitch on screen."},"sessionIdB":{"type":"string","description":"Pitch to compare against the baseline."},"event":{"type":"string","enum":["foot_contact","max_external_rotation","ball_release"],"description":"Restrict to one event. Default: all three."}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"seek_to_event","kind":"act","impl":"imperative","description":"Scrubs the 3D viewer to a named pitching event or to a specific frame, so the human is looking at the exact moment you are describing. Pass either event or frame, not both. The viewer moves before this returns.","title":"Seek the viewer to a moment","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{"event":{"type":"string","enum":["foot_contact","max_external_rotation","ball_release"],"description":"Move to this detected event."},"frame":{"type":"integer","description":"Move to this frame index instead of an event."}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"focus_joint","kind":"act","impl":"imperative","description":"Highlights a joint or segment in the 3D viewer, turns on its angle readout, and rotates the camera to the plane where that angle actually reads true — side-on for flexion, front-on for elevation, overhead for rotation. Accepts coaching names like \"front knee\", \"throwing shoulder\" or \"trunk\", and resolves handedness for you.","title":"Focus a joint in the viewer","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{"joint":{"type":"string","description":"What to look at, e.g. lead_knee, throwing_shoulder, trunk, pelvis, lead_foot."},"cameraPlane":{"type":"string","enum":["auto","sagittal","frontal","transverse","free"],"description":"Camera viewpoint. \"auto\" picks the plane the joint's angles live in."}},"required":["joint"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"set_overlay","kind":"act","impl":"imperative","description":"Turns one 3D viewer overlay on or off so you can stage the visual evidence for a point instead of describing it: segment_frames (anatomical triads), axial_dial (shoulder rotation dial), angle_readouts (numeric labels), motion_trail (throwing-hand path), event_markers (timeline markers).","title":"Toggle a viewer overlay","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{"overlay":{"type":"string","enum":["segment_frames","axial_dial","angle_readouts","motion_trail","event_markers"],"description":"Which overlay to change."},"enabled":{"type":"boolean","description":"true to show it, false to hide it."}},"required":["overlay","enabled"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"annotate_frame","kind":"act","impl":"imperative","description":"Pins a short labelled note to a frame and joint in the 3D viewer, where it stays visible to the human as part of the analysis and survives scrubbing. Use it to leave your observations where they belong — on the moment they describe. Give a frame or an event, and keep the label under 80 characters.","title":"Pin a note in the viewer","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"frame":{"type":"integer","description":"Frame to pin the note to."},"event":{"type":"string","enum":["foot_contact","max_external_rotation","ball_release"],"description":"Pin at this event instead of a frame."},"joint":{"type":"string","description":"Optional anchor, e.g. lead_knee or throwing_shoulder."},"label":{"type":"string","description":"The note. Max 80 characters; longer text is truncated."},"severity":{"type":"string","enum":["info","attention"],"description":"Default \"info\"."}},"required":["label"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"}],"category":"Health & Education","apiSurface":"spec","toolCount":13}}