{"serverId":"mcp-registry/io.github.heavyblotto/caelus-mcp","tools":[{"name":"counterfactual_chart","fixed":{"name":"counterfactual_chart","description":"A birth chart, perturbed — a 'what if'. Give a base chart (date+lat+lon) and an edit: `shift_time` (e.g. '1h', '-30m', 'P1D') moves the instant (\"born an hour later\"), `move_lat`+`move_lon` recompute at another place, and/or `set_longitudes` moves bodies to new ecliptic degrees (\"Mars in the next sign\"). Returns the diff vs the original: bodies that changed sign or house, aspects gained or lost, and angles that changed sign. A time/place edit rotates the houses and angles while planets stay put;","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["date","lat","lon"],"properties":{"lat":{"type":"number","maximum":90,"minimum":-90,"description":"Latitude, north positive"},"lon":{"type":"number","maximum":180,"minimum":-180,"description":"Longitude, EAST positive (Americas are negative)"},"date":{"type":"string","description":"UTC date-time, ISO 8601, e.g. 1990-06-10T14:30:00Z. Convert local birth time to UTC first."},"zodiac":{"enum":["tropical","sidereal:lahiri","sidereal:fagan_bradley","sidereal:krishnamurti","sidereal:raman","sidereal:yukteshwar","sidereal:galcent_0sag","sidereal:true_citra"],"type":"string","default":"tropical","description":"tropical (default) or sidereal:<ayanamsa>"},"move_lat":{"$ref":"#/properties/lat","description":"Recompute at this latitude instead of the birth latitude"},"move_lon":{"$ref":"#/properties/lon","description":"Recompute at this longitude instead of the birth longitude"},"shift_time":{"type":"string","description":"Duration to shift the instant: '1h', '-30m', 'P1Y'"},"house_system":{"type":"string","default":"placidus","description":"House system (default placidus). Case- and spacing-insensitive; valid: placidus, whole_sign, equal, porphyry, koch, regiomontanus, campanus, alcabitius, morinus, meridian, polich_page, vehlow (aliases like \"whole sign\" also work)."},"set_longitudes":{"type":"object","description":"Move bodies to these ecliptic longitudes in degrees, e.g. { \"mars\": 45 }","additionalProperties":{"type":"number"}}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":591,"tokensAfter":591},{"name":"electional_search","fixed":{"name":"electional_search","description":"Rank moments in a window for an electional aim. Samples the window and scores each instant by how closely a set of wanted body-to-body aspects is satisfied (tighter and applying aspects score higher), optionally penalizing a void-of-course Moon. Returns the top moments with the aspects that matched. Body-to-body only; for aspects to the angles, compute the chart at a candidate moment.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["start","end","wanted"],"properties":{"end":{"type":"string","description":"UTC ISO end of the window"},"limit":{"type":"integer","default":10,"description":"max moments to return (default 10)","exclusiveMinimum":0},"start":{"type":"string","description":"UTC ISO start of the window"},"wanted":{"type":"array","items":{"type":"object","required":["a","b","aspect"],"properties":{"a":{"type":"string","description":"first body, snake_case"},"b":{"type":"string","description":"second body, snake_case"},"aspect":{"enum":["conjunction","sextile","square","trine","opposition"],"type":"string"}},"additionalProperties":false},"minItems":1,"description":"aspects to reward when close to exact"},"zodiac":{"enum":["tropical","sidereal:lahiri","sidereal:fagan_bradley","sidereal:krishnamurti","sidereal:raman","sidereal:yukteshwar","sidereal:galcent_0sag","sidereal:true_citra"],"type":"string","default":"tropical","description":"tropical (default) or sidereal:<ayanamsa>"},"step_hours":{"type":"number","default":6,"description":"sampling step in hours (default 6)","exclusiveMinimum":0},"avoid_void_moon":{"type":"boolean","default":false,"description":"penalize a void-of-course Moon"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":485,"tokensAfter":485},{"name":"find_aspect_dates","fixed":{"name":"find_aspect_dates","description":"Exact dates a transiting body makes an aspect, within a range: to a fixed longitude OR to another transiting body. Provide exactly one of target_lon / target_body. Includes retrograde re-hits. Body names are snake_case (mean_node, true_node).","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["body","aspect","start","end"],"properties":{"end":{"type":"string","description":"UTC ISO end date (convert from local first); range <= 50 years"},"body":{"enum":["sun","moon","mercury","venus","mars","jupiter","saturn","uranus","neptune","pluto","chiron","mean_node","true_node"],"type":"string","description":"Transiting body (snake_case, e.g. saturn, true_node)"},"start":{"type":"string","description":"UTC ISO start date (convert from local first)"},"aspect":{"enum":["conjunction","sextile","square","trine","opposition"],"type":"string"},"zodiac":{"enum":["tropical","sidereal:lahiri","sidereal:fagan_bradley","sidereal:krishnamurti","sidereal:raman","sidereal:yukteshwar","sidereal:galcent_0sag","sidereal:true_citra"],"type":"string","default":"tropical","description":"Zodiac for body and target_lon longitudes; tropical (default) or sidereal:<ayanamsa>"},"target_lon":{"type":"number","maximum":360,"minimum":0,"description":"Fixed natal longitude in degrees. Provide this OR target_body, not both."},"target_body":{"enum":["sun","moon","mercury","venus","mars","jupiter","saturn","uranus","neptune","pluto","chiron","mean_node","true_node"],"type":"string","description":"Another transiting body. Provide this OR target_lon, not both."}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":462,"tokensAfter":462},{"name":"sky_view","fixed":{"name":"sky_view","description":"Where the visible bodies land in a framed photo of the sky, for an image prompt. Give a place, a moment, an aim (compass direction and altitude), a lens, and an image size; get each in-frame body's pixel position, apparent size, brightness, the Moon's phase orientation, a sky-state summary (twilight, limiting magnitude, horizon row), the bright bodies just outside the frame, a ready-to-use prompt, and a machine-readable `renderPlan` (a body-free background-plate prompt plus the computed layers t","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["lat","lon","azimuth"],"properties":{"lat":{"type":"number","maximum":90,"minimum":-90,"description":"Latitude, north positive"},"lon":{"type":"number","maximum":180,"minimum":-180,"description":"Longitude, EAST positive (Americas are negative)"},"date":{"type":"string","description":"UTC ISO date-time (convert from local first); omit for now"},"lens":{"enum":["ultrawide","wide","standard","normal","portrait","telephoto","supertele"],"type":"string","default":"normal","description":"Lens preset; sets field of view and projection (ultrawide is fisheye, the rest rectilinear)"},"width":{"type":"integer","default":1024,"description":"Output image width in pixels","exclusiveMinimum":0},"bortle":{"type":"integer","maximum":9,"minimum":1,"description":"Dark-sky class, 1 (pristine) to 9 (inner city). Sets the night naked-eye limit and drives background star density and Milky Way visibility. Omit for a suburban default"},"height":{"type":"integer","default":683,"description":"Output image height in pixels","exclusiveMinimum":0},"azimuth":{"type":["number","string"],"description":"Center compass direction: degrees from true north (east positive) or a 16-point name like \"W\" or \"WNW\""},"altitude":{"type":"number","default":5,"maximum":90,"minimum":-10,"description":"Center altitude in degrees: 0 looks at the horizon, positive tilts up"},"overlays":{"type":"array","items":{"enum":["ecliptic","signs","houses","constellations"],"type":"string"},"description":"Reference-frame overlays to project (annotations, not photoreal): the ecliptic line, the zodiac signs, house cusps and angles, and constellation figures. Exact pixels returned in `overlays`"},"deep_field":{"type":"boolean","default":false,"description":"Pin the complete deep naked-eye star field (thousands of stars at exact pixels) instead of the bright catalog. Larger response; great for control images"},"elevation_m":{"type":"number","description":"Eye height above ground in meters (e.g. 9 for a third-floor window)"},"max_star_mag":{"type":"number","description":"Brightest-magnitude cutoff for stars (smaller is brighter); default 2.5, or the limiting magnitude when bortle is set"},"include_stars":{"type":"boolean","default":true,"description":"Include bright catalog stars when a star catalog is loaded"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":820,"tokensAfter":820},{"name":"sky_view_sequence","fixed":{"name":"sky_view_sequence","description":"A time sequence of sky frames for an animation: the same place, aim, and lens stepped through time. Returns a compact per-frame timeline (instant, twilight, Sun/Moon altitude, Moon phase + bright-limb, whether the Milky Way is in frame) plus the fixed celestial pole and the sky's sidereal rotation per frame. Each frame's full pixel-accurate spec comes from calling sky_view at that instant; this tool plans the timeline. Use for sunset-to-night transitions, star-trail planning, or Moon-phase progr","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["lat","lon","azimuth","frames","step_minutes"],"properties":{"lat":{"type":"number","maximum":90,"minimum":-90,"description":"Latitude, north positive"},"lon":{"type":"number","maximum":180,"minimum":-180,"description":"Longitude, EAST positive (Americas are negative)"},"date":{"type":"string","description":"First frame, UTC ISO date-time; omit for now"},"lens":{"enum":["ultrawide","wide","standard","normal","portrait","telephoto","supertele"],"type":"string","default":"normal"},"width":{"type":"integer","default":1024,"exclusiveMinimum":0},"bortle":{"type":"integer","maximum":9,"minimum":1,"description":"Dark-sky class 1-9"},"frames":{"type":"integer","maximum":60,"minimum":2,"description":"Number of frames (2-60)"},"height":{"type":"integer","default":683,"exclusiveMinimum":0},"azimuth":{"type":["number","string"],"description":"Center direction: degrees from true north or a compass name like \"W\""},"altitude":{"type":"number","default":20,"maximum":90,"minimum":-10,"description":"Center altitude in degrees"},"step_minutes":{"type":"number","description":"Minutes between frames","exclusiveMinimum":0}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":498,"tokensAfter":498},{"name":"synthetic_sky_view","fixed":{"name":"synthetic_sky_view","description":"Sky View for a mix of real and synthetic bodies: register the authored system on an ephemeral engine, then frame the visible sky like sky_view. Synthetic bodies can carry render attributes (sizeDeg, magnitude, color) that flow into the pixel spec and prompt. Real Sun/Moon/planets stay for twilight and context unless omitted from `bodies`.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["system","lat","lon","azimuth"],"properties":{"lat":{"type":"number","maximum":90,"minimum":-90,"description":"Latitude, north positive"},"lon":{"type":"number","maximum":180,"minimum":-180,"description":"Longitude, EAST positive (Americas are negative)"},"date":{"type":"string","description":"UTC ISO date-time; omit for now"},"lens":{"enum":["ultrawide","wide","standard","normal","portrait","telephoto","supertele"],"type":"string","default":"normal"},"width":{"type":"integer","default":1024,"exclusiveMinimum":0},"bodies":{"type":"array","items":{"type":"string"},"description":"Body ids to draw; defaults to Sun, Moon, planets, and every synthetic body"},"bortle":{"type":"integer","maximum":9,"minimum":1},"height":{"type":"integer","default":683,"exclusiveMinimum":0},"system":{"type":"object","required":["id","bodies"],"properties":{"id":{"type":"string"},"bodies":{"type":"array","items":{"anyOf":[{"type":"object","required":["id","mode","lonDeg"],"properties":{"id":{"type":"string"},"mode":{"type":"string","const":"placement"},"lonDeg":{"type":"number"}},"additionalProperties":false},{"type":"object","required":["id","mode","periodDays","phaseDeg"],"properties":{"id":{"type":"string"},"mode":{"type":"string","const":"periodic"},"epoch":{"type":"number"},"phaseDeg":{"type":"number"},"periodDays":{"type":"number","exclusiveMinimum":0}},"additionalProperties":false},{"type":"object","required":["id","mode","a","e","i","node","peri","M0","periodDays"],"properties":{"a":{"type":"number","exclusiveMinimum":0},"e":{"type":"number","minimum":0,"exclusiveMaximum":1},"i":{"type":"number"},"M0":{"type":"number"},"id":{"type":"string"},"mode":{"type":"string","const":"kepler"},"node":{"type":"number"},"peri":{"type":"number"},"epoch":{"type":"number"},"periodDays":{"type":"number","exclusiveMinimum":0}},"additionalProperties":false}]},"minItems":1},"render":{"type":"object","additionalProperties":{"type":"object","properties":{"color":{"type":"string"},"sizeDeg":{"type":"number"},"magnitude":{"type":"number"}},"additionalProperties":false}},"observer":{"type":"string"}},"additionalProperties":false},"azimuth":{"type":["number","string"],"description":"Center direction: degrees from true north or a compass name"},"altitude":{"type":"number","default":5,"maximum":90,"minimum":-10,"description":"Center altitude in degrees"},"elevation_m":{"type":"number","description":"Eye height above ground in meters"},"include_stars":{"type":"boolean","default":false,"description":"Include catalog stars (usually off for fictional skies)"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":853,"tokensAfter":853},{"name":"synthetic_validate","fixed":{"name":"synthetic_validate","description":"Check an authored synthetic celestial system for ill-defined inputs: duplicate body ids, non-positive periods, out-of-range eccentricity, or a dangling observer. Returns `impossible` and a list of problems — the same honesty pattern as compileForm.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["system"],"properties":{"system":{"type":"object","required":["id","bodies"],"properties":{"id":{"type":"string"},"bodies":{"type":"array","items":{"anyOf":[{"type":"object","required":["id","mode","lonDeg"],"properties":{"id":{"type":"string"},"mode":{"type":"string","const":"placement"},"lonDeg":{"type":"number"}},"additionalProperties":false},{"type":"object","required":["id","mode","periodDays","phaseDeg"],"properties":{"id":{"type":"string"},"mode":{"type":"string","const":"periodic"},"epoch":{"type":"number"},"phaseDeg":{"type":"number"},"periodDays":{"type":"number","exclusiveMinimum":0}},"additionalProperties":false},{"type":"object","required":["id","mode","a","e","i","node","peri","M0","periodDays"],"properties":{"a":{"type":"number","exclusiveMinimum":0},"e":{"type":"number","minimum":0,"exclusiveMaximum":1},"i":{"type":"number"},"M0":{"type":"number"},"id":{"type":"string"},"mode":{"type":"string","const":"kepler"},"node":{"type":"number"},"peri":{"type":"number"},"epoch":{"type":"number"},"periodDays":{"type":"number","exclusiveMinimum":0}},"additionalProperties":false}]},"minItems":1},"render":{"type":"object","additionalProperties":{"type":"object","properties":{"color":{"type":"string"},"sizeDeg":{"type":"number"},"magnitude":{"type":"number"}},"additionalProperties":false}},"observer":{"type":"string"}},"additionalProperties":false}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":498,"tokensAfter":498}],"toolsChanged":7,"tokensSaved":0,"todo":[{"tool":"find_aspect_dates","params":["aspect"]},{"tool":"sky_view_sequence","params":["lens","width","height"]},{"tool":"synthetic_positions","params":["system"]},{"tool":"synthetic_sky_view","params":["lens","width","bortle","height","system"]},{"tool":"synthetic_validate","params":["system"]}],"note":"Deterministic fixes. Changes marked verify need a human look before shipping (renames, inferred annotations, inferred types, removed text). Parameter descriptions in `todo` need to be written by someone who knows the API."}