Skip to main content
Glama

Server Details

Offline observational astronomy: positions, rise/set, moon phases, eclipses, and seasons.

If you are the author of this connector, you can claim ownership by verifying the domain or GitHub account it belongs to. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Uptime
100.0% over 61 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
Repository
cyanheads/astronomy-mcp-server
GitHub Stars
3
Server Listing
astronomy-mcp-server

TDQS

A4.6/5.0

Scored across 7 tools

Disambiguation5/5

Each tool has a clearly distinct purpose: event search, time-series ephemeris for small bodies, moon phase, rise/set/transit, satellite passes, single-body position, and a current-sky inventory. The only mild overlap (moon phase vs. sky position returning illuminated fraction) is resolved by the descriptions, which frame one as phase-focused and the other as position-focused. An agent can reliably select the right tool.

Naming Consistency5/5

All seven tools use the same astronomy_<verb>_<noun> pattern (find_events, get_ephemeris, get_moon_phase, get_rise_set, get_satellite_passes, get_sky_position, list_visible). The prefix and verb style are uniform throughout, with list_visible the only verb variation and still fully predictable.

Tool Count5/5

Seven tools is well-scoped for an observational astronomy server, and each covers a genuinely distinct capability (events, ephemeris, phases, rise/set, passes, positions, visible-now). No padding or redundancy; the count matches the breadth of the domain.

Completeness4/5

Coverage of the observation domain is strong and near-complete: event search, small-body ephemeris, phases, rise/set with twilight, satellite passes, single-body positions, and an all-sky visibility list. Minor gaps remain, such as no explicit star/constellation catalog lookup or body enumeration despite star names being accepted, and coordinate/place resolution is explicitly left to upstream callers.

Available Tools

7 tools
astronomy_find_eventsastronomy-mcp-server: find sky eventsA
Read-onlyIdempotent
Inspect

Search forward from a start time for the next occurrences of one sky-event class, selected by the event enum: solar_eclipse, lunar_eclipse, equinox, solstice, moon_quarter, opposition, conjunction, max_elongation, or perigee_apogee. Both eclipse classes take an optional observer (latitude and longitude together). solar_eclipse without one returns global eclipses — kind, peak time, obscuration, and for a total or annular eclipse the latitude/longitude where it is greatest; with one it returns only eclipses visible from that point, with local contact times, local_visible, and the Sun's altitude at each contact. lunar_eclipse returns geocentric contact times, the same instants everywhere on Earth; an observer adds local_visible and the Moon's altitude at each contact. Every other class is geocentric and ignores a location. The body-relative events (opposition, conjunction, max_elongation, perigee_apogee) require a body: opposition applies to the superior planets (mars through pluto), conjunction to any planet, max_elongation to mercury and venus, and perigee_apogee to the moon (perigee/apogee), earth, or a planet (perihelion/aphelion). conjunction with body alone is that planet's conjunction with the Sun. Add body2 for a conjunction of two bodies — the Moon or a planet with another: the instant they share one ecliptic longitude seen from Earth's center, with their separation_degrees at that instant. That separation is not always their closest approach, since two planets can pass closer days or weeks away, and listings that time conjunctions by right ascension differ by hours, or by days for slow pairs. Returns the next count occurrences (default 1), up to 20 per call: a larger count, up to 200, returns the first 20 and a notice naming the exact start and count that continue the series. Searches stop at the end of 2100, the close of the supported span; when that leaves fewer than count, a notice says so. Start defaults to now; pass an IANA timezone for observer-local timestamps.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyNoTarget body — required for opposition, conjunction, max_elongation, and perigee_apogee; ignored otherwise. "earth" is accepted only for perigee_apogee, which returns its perihelion and aphelion. With `body2`, the Moon or a planet.
body2NoSecond body for a conjunction of two bodies: the Moon or a planet, different from `body`. Accepted only with event "conjunction", where it replaces the conjunction of `body` with the Sun by the conjunction of `body` and `body2` in ecliptic longitude seen from Earth's center. For the Moon meeting the Sun, search moon_quarter for the new moon.
countNoNumber of forward occurrences to return. Default 1. At most 20 are computed per call; a count up to 200 returns the first 20 with a notice naming the `start` and `count` that continue the series.
eventYesWhich class of event to search for.
startNoSearch start as an ISO 8601 UTC string, e.g. "2024-01-01T00:00:00Z". Defaults to now. A value with no zone designator is read as UTC, not the local zone of the server process.
latitudeNoObserver latitude in decimal degrees, supplied together with longitude. Optional for solar_eclipse and lunar_eclipse, where it adds local circumstances; omit both for a global solar search. Ignored by every other event.
timezoneNoIANA timezone for localized output, e.g. "America/Los_Angeles". When omitted, output is UTC-only.
elevationNoObserver elevation in meters above sea level. Default 0.
longitudeNoObserver longitude in decimal degrees, supplied together with latitude. Optional for solar_eclipse and lunar_eclipse; ignored by every other event.

Output Schema

ParametersJSON Schema
NameRequiredDescription
capNoThe per-call event cap that was applied.
errorNoPresent when the call failed. Absent on success.
shownNoNumber of events returned when the cap applied.
eventsNoThe next occurrences of the requested event class, in chronological order.
noticeNoWhy the list is shorter than the requested count: either the per-call cap held events back, and the notice names the exact `start` and `count` to re-call with, or the search reached the end of the supported span (2100). Absent when every requested occurrence came back.
truncatedNoTrue when `count` exceeded the per-call cap and only the first events came back.
totalCountNoNumber of event occurrences returned.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover the safety profile (readOnly, idempotent, closed-world), and the description layers on real behavioral constraints: max 20 computed per call with a continuation notice naming the exact `start`/`count`, a hard stop at end of 2100 with a notice when fewer than `count` remain, count default 1 and cap 200, and start defaulting to now. These are non-obvious traits the schema does not state.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core action is front-loaded in the first sentence, and the dense enumeration of event-specific behavior is justified by the nine-parameter surface. It is long and somewhat repetitive against the schema's own descriptions, but nearly every sentence carries distinguishing information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

A high-complexity tool with 9 params, enums, and an output schema. The description covers observer optionality, body requirements, conjunction variants, pagination limits, and temporal bounds, so an agent has everything needed to call it correctly; return-value detail is largely delegated to the output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds genuine semantics beyond the schema: how `lat`/`lon` change eclipse output (global vs local contact times), what `body` alone means for conjunction, and the caveat that `separation_degrees` is not necessarily closest approach. Useful nuance, though much of it overlaps the parameter descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (search forward) and resource (next occurrences of one sky-event class) and enumerates the enum members it covers. It is immediately distinguishable from siblings like astronomy_get_moon_phase, astronomy_get_rise_set, and astronomy_get_sky_position, which each address a different kind of query.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives rich per-event conditions: which classes accept an observer, which require `body`, which `body` values are valid per event, and even routes the Moon–Sun new moon to moon_quarter. It lacks any explicit comparison to the sibling tools (e.g. when to use this over get_ephemeris), so it falls short of full when/when-not/alternatives guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

astronomy_get_ephemerisastronomy-mcp-server: get small-body ephemerisA
Read-onlyIdempotent
Inspect

Fetch a time-series ephemeris for a small body (asteroid or comet) or spacecraft from JPL Horizons — RA/Dec, distance, and apparent magnitude over a span, optionally with observer-relative altitude/azimuth. This covers objects the in-process major-body set cannot. The designation is passed to Horizons verbatim, so it must be in a form Horizons resolves to a single record: a numbered asteroid takes a trailing-semicolon record lookup (e.g. "433;" for Eros, "1;" for Ceres), and a periodic comet takes the DES + closest-apparition form (e.g. "DES=1P;CAP" for Halley). Spacecraft take their negative SPK-ID. Anything else goes through the Horizons name search: a bare name matching nothing (e.g. "433 Eros") or several records (e.g. "1P/Halley") is rejected, but one matching a single object succeeds even when that object is not the one meant — "Eros" resolves to Kerberos, a moon of Pluto — so compare target_name, the object Horizons resolved, with the one intended. A major-body name matching several bodies (e.g. "Mars") is rejected with the ID number of each body it matched — pass one, such as "499" for the planet. start and stop are ISO 8601 UTC dates in the Gregorian calendar, extended before 1582, in years 0100 through 9999; stop must not be before start, and a stop equal to start returns the single row at that instant. step is a count plus a unit of m, h, d, mo, or y, such as "1d", "1h", or "10m". Supplying observer latitude/longitude yields topocentric coordinates and adds alt/az — supply both or neither. This is a gated, network-backed extension (JPL Horizons is keyless but rate-limited and best-effort); large spans truncate inline at 200 rows, and the truncation notice names the exact start to resume from — one step past the last row returned, because Horizons includes the start instant in its output — so re-calling from there continues the series without repeating a sample. Splitting the range into smaller adjacent spans works too; keep the same step either way so no sample is lost.

ParametersJSON Schema
NameRequiredDescriptionDefault
stepNoStep size as a positive count up to 2147483647 plus a unit of m (minutes), h (hours), d (days), mo (months), or y (years), e.g. "10m", "1h", "1d". Default "1h".1h
stopNoEphemeris stop as an ISO 8601 UTC string in years 0100 through 9999, at or after start — equal to start returns the single row at that instant. Defaults to 24 hours after start. A value with no zone designator is read as UTC, not the local zone of the server process.
startNoEphemeris start as an ISO 8601 UTC string, e.g. "2024-01-01T00:00:00Z", in years 0100 through 9999 — the calendar years JPL Horizons reads. Dates are Gregorian, extended before 1582. Defaults to now. A value with no zone designator is read as UTC, not the local zone of the server process.
latitudeNoObserver latitude in decimal degrees — supply together with longitude for topocentric coordinates and alt/az. Supplying one without the other is rejected.
elevationNoObserver elevation in meters above sea level. Default 0. With latitude and longitude it must be greater than -20000 and less than 40000000 — the observer altitudes Horizons accepts; a geocentric request ignores it.
longitudeNoObserver longitude in decimal degrees. Supply together with latitude; one without the other is rejected.
designationYesJPL Horizons target, passed verbatim — use a form that resolves to one record. Numbered asteroid: trailing-semicolon record lookup, e.g. "433;" (Eros), "1;" (Ceres). Periodic comet: DES + closest-apparition flag, e.g. "DES=1P;CAP" (Halley), "DES=2P;CAP" (Encke). Spacecraft: negative SPK-ID, e.g. "-48" (Hubble). A bare name like "433 Eros" (no match) or "1P/Halley" (several records) is rejected, and "Mars" (several major bodies) is rejected with their ID numbers listed — the planet is "499" — but one matching a single object succeeds even when it is not the object meant — check `target_name` in the result. Earth ("399") is rejected, being the body the observer is on, and so is a name containing an apostrophe, which the Horizons search cannot match — "6P/d'Arrest" resolves as "DES=6P;CAP" — or any character outside printable ASCII, which Horizons refuses, such as an accent or a typographic apostrophe — "Šteins" resolves as "2867;". Look up designations at ssd.jpl.nasa.gov/tools/sbdb_lookup.html.

Output Schema

ParametersJSON Schema
NameRequiredDescription
capNoThe inline row cap that was applied.
errorNoPresent when the call failed. Absent on success.
shownNoNumber of ephemeris rows returned.
noticeNoCaveats on the returned series — how to retrieve rows omitted by the cap, and whether any rows were dropped. Absent when the whole span came back intact.
pointsNoTime-series of positions, one per step, in chronological order.
droppedNoRows Horizons returned that carried no usable time, position, or distance and were dropped. Present only when at least one row was dropped, in which case the series has gaps and is shorter than the requested step count.
truncatedNoTrue when the requested span continues past the returned rows; the notice names the start to resume from.
designationNoThe body designation echoed from the request.
target_nameNoThe object JPL Horizons resolved the designation to, from its 'Target body name' header — compare it with the intended object, since a bare name can resolve to a different one. Absent when Horizons' response names no target.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only cover safety (readOnly/openWorld/idempotent), and the description goes well beyond: it discloses the gated, network-backed, keyless-but-rate-limited best-effort nature of Horizons, the 200-row inline truncation and the exact resume semantics (one step past the last row), the both-or-neither rule for observer coordinates, and the subtle name-resolution failure mode where a single unintended match (e.g. 'Eros' → Kerberos) silently succeeds.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but front-loaded: purpose and scope come first, then designation grammar, then temporal parameters, then truncation behavior. Nearly every sentence carries operational value, though the designation discussion is dense enough to border on over-length for a single tool definition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and the description still supplies the critical return-side context (compare `target_name`, truncation notice names the resume `start`). For a 7-parameter, network-backed, gated tool with tricky identifier resolution, this is complete enough that an agent could call it correctly on the first attempt.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already 100%, so the baseline is 3. The description nonetheless adds semantics the schema cannot express: the registry-vs-name-search resolution paths for `designation`, the rejection rules for Earth/apostrophes/non-ASCII, comparing `target_name` against intent, and the truncation/resume behavior tied to `start`/`step`. It mostly reinforces the schema rather than introducing new field-level detail, so 4 rather than 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence names a specific verb (Fetch), resource (time-series ephemeris), the object classes it covers (small body or spacecraft), the source (JPL Horizons), and the returned quantities (RA/Dec, distance, apparent magnitude, optional alt/az). It also explicitly carves out its niche by noting it 'covers objects the in-process major-body set cannot', distinguishing it from sky-position/rise-set siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It clearly delimits scope — small bodies and spacecraft that the major-body set cannot handle — which implies when to reach for it over the major-body siblings. However, it never names an alternative tool (e.g. astronomy_get_sky_position) or states a positive 'use this when' for a specific user scenario, so differentiation is contextual rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

astronomy_get_moon_phaseastronomy-mcp-server: get moon phaseA
Read-onlyIdempotent
Inspect

Report the Moon phase for an instant: illuminated fraction, phase name, synodic age in days since the new moon, phase longitude (the Moon–Sun ecliptic-longitude difference, 180° at full), and the next four quarter phases (new, first quarter, full, last quarter) with timestamps. Answers "what is the moon phase tonight" and "when is the next full moon" in one call without iteration. The time defaults to now; pass an IANA timezone to also receive observer-local timestamps. The phase is geocentric — no observer location is needed.

ParametersJSON Schema
NameRequiredDescriptionDefault
timeNoInstant to evaluate as an ISO 8601 UTC string, e.g. "2024-12-15T00:00:00Z". Defaults to now. A value with no zone designator is read as UTC, not the local zone of the server process.
timezoneNoIANA timezone for localized output, e.g. "America/Los_Angeles". When omitted, output is UTC-only.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
age_daysNoSynodic age in days since the previous new moon.
time_utcNoThe instant the phase was computed for, in ISO 8601 UTC.
phase_nameNoHuman-readable phase name (New Moon, Waxing Crescent, First Quarter, …, Waning Crescent).
time_localNoThe same instant in the observer-local timezone with offset, present only when a timezone was supplied.
next_quartersNoThe next four lunar quarter phases (new/first/full/last) in chronological order.
illuminated_fractionNoFraction of the lunar disc illuminated, 0 to 1.
phase_longitude_degreesNoThe Moon's ecliptic longitude minus the Sun's, in degrees [0,360): 0 = new, 90 = first quarter, 180 = full, 270 = last quarter. Not the Sun–body–observer phase angle astronomy_get_sky_position reports as phase_angle_degrees, which reads 0 at full moon.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and idempotentHint, so safety is covered. The description adds substantial behavioral context: time defaults to now, a value with no zone designator is read as UTC, timezone produces observer-local timestamps, and the phase is geocentric. It also spells out the output fields, which is valuable despite the output schema. No contradictions with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is moderately long but every sentence earns its place. It front-loads the core output list, then gives use cases, then parameter behavior. The structure is logical and not padded. It could be trimmed slightly but is well-organized.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's moderate complexity, the presence of an output schema, and the annotations, the description is fully complete. It covers parameters, defaults, timezone semantics, and the geocentric nature, leaving no ambiguity about how to call it or what to expect. An agent can confidently invoke it without further research.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. However, the description adds meaningful details beyond the schema: it clarifies the default for time, the UTC interpretation for missing zone designators, and the effect of timezone on output. These are practical nuances that help an agent use the parameters correctly, justifying a 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Report') and a clear resource ('Moon phase'), enumerating exactly what data it returns: illuminated fraction, phase name, synodic age, phase longitude, and next four quarter phases. This is far beyond a generic 'get moon phase' and distinguishes it from siblings like astronomy_get_ephemeris or astronomy_get_rise_set, which serve different purposes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly mentions typical queries ('what is the moon phase tonight' and 'when is the next full moon') and explains that a single call covers both without iteration. It also notes that the phase is geocentric and no observer location is needed, which implicitly tells agents when to prefer this over location-dependent tools. It stops short of explicitly naming alternative tools or exclusions, so it doesn't reach a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

astronomy_get_rise_setastronomy-mcp-server: get rise/set timesA
Read-onlyIdempotent
Inspect

Compute rise, set, and culmination (transit) times for a body at an observer location, plus the maximum altitude at culmination. For the Sun, also returns the three twilight pairs (civil −6°, nautical −12°, astronomical −18°) so a single call answers "when does the sun set and when is it truly dark." Each pair covers the night after the cycle's set (after its culmination when it has none) — dusk that evening, dawn the next morning — so the dawn listed beside a sunrise is the following day's. A depth a night never reaches (astronomical twilight around midsummer at mid-to-high latitudes) is null for that night. When start falls between sunset and sunrise, the first cycle opens at the next sunrise and night_in_progress carries the night already under way, dusk through dawn, including times before start that have passed; otherwise, for the dawn before a sunrise, read the previous cycle or start a day earlier. Searches forward from start (default today) and returns the next count cycles (default 1), up to 31 per call: a larger count, up to 366, returns the first 31 and a notice naming the exact start and count that continue the series, or saying no call can when the next cycle starts after 2100; a continuation started just past a sunset repeats in night_in_progress the night the last cycle of the previous call carried, while its cycles pick up without overlap. When the body is already above the horizon at start, the first cycle is the interval in progress: its set is the imminent one and its rise is null, since that rise precedes the search — so a set is never reported earlier than the rise beside it. Circumpolar or never-rises situations are reported as null rise/set fields with an explanatory note rather than an error — the fact is the answer. One cycle covers one day: a day the body neither rises nor sets on (polar night, midnight sun) is a cycle of its own, so consecutive cycles are consecutive days and each night appears in exactly one cycle. When start falls after the culmination of such a polar-night day, or after the last sunset before one, the first cycle is the rest of that day — rise, set, and transit null — carrying the twilight of that night, including times before start that have passed. Default elevation is 0 m; pass an IANA timezone for observer-local times. This server does not geocode — resolve coordinates upstream first.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyYesThe body to compute rise/set for. Twilight is included only when this is "sun".
countNoNumber of forward rise/set cycles to return. Default 1. At most 31 are computed per call; a count up to 366 returns the first 31 with a notice naming the `start` and `count` that continue the series.
startNoSearch start as an ISO 8601 UTC string, e.g. "2024-06-21T00:00:00Z". Defaults to now. A value with no zone designator is read as UTC, not the local zone of the server process.
latitudeYesObserver latitude in decimal degrees, north positive.
timezoneNoIANA timezone for localized output, e.g. "America/Los_Angeles". When omitted, output is UTC-only.
elevationNoObserver elevation in meters above sea level. Default 0.
longitudeYesObserver longitude in decimal degrees, east positive.

Output Schema

ParametersJSON Schema
NameRequiredDescription
capNoThe per-call cycle cap that was applied.
bodyNoThe body these rise/set cycles are for, echoed from the request.
errorNoPresent when the call failed. Absent on success.
shownNoNumber of cycles returned when the cap applied.
eventsNoOne entry per rise/set/transit cycle, searching forward from the start time.
noticeNoHow to retrieve the cycles the per-call cap held back: the exact `start` and `count` to re-call with, or — when the next cycle starts after 2100, the end of the supported span — that no call can continue the series. Absent when every requested cycle came back.
truncatedNoTrue when `count` exceeded the per-call cap and only the first cycles came back.
totalCountNoNumber of rise/set cycles returned.
night_in_progressNoThe night under way at `start`, present only when body is "sun", the Sun is below the horizon at `start`, it set since its last culmination and within the two days before, and it rises within the two days after. The first cycle then opens with the next day — at its sunrise, or its culmination when the Sun does not rise that day — and its twilight is the night after, so this field holds the night the caller is in: for each depth, dusk on the evening of that sunset and dawn before the day of the first cycle begins. Times earlier than `start` are included and have already passed. Each pair is searched only within that night, so a depth the night never reaches is null. Absent when a day the Sun never rose on fell between the last sunset and `start`: that sunset began an earlier night. A continuation call, started one second past the last set of the previous call, repeats here the night the last cycle of that call carried; its `events` do not repeat. Not one of `events` and not counted by `count`.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnly, idempotent, and openWorld annotations, the description discloses non-obvious behavior: twilight pairs are returned only for the Sun, polar-night and midnight-sun cases become null-valued cycles instead of errors, continuations repeat night_in_progress without overlap, and the server does not geocode. This is unusually rich behavioral disclosure for a read-only tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core purpose is front-loaded, but the description is very long and dense, covering many edge cases in continuous prose. Most statements are relevant for such a complex temporal tool, yet the lack of structure and repetition around cycle sequencing, polar cases, and continuations makes it less concise than ideal.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity, the description is highly complete: it explains cycle semantics, twilight pairs, null handling, continuation limits, start-boundary behavior, timezone and elevation defaults, and the no-geocoding caveat. An output schema exists, so the description does not need to detail return values, and it appropriately focuses on behavior and invocation context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds meaningful parameter semantics beyond the schema: count is capped at 31 per call even if up to 366 is requested and continuation notices name start and count; start defaults to today and can trigger night_in_progress behavior; timezone controls localized output; and body determines whether twilight is included.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Compute rise, set, and culmination (transit) times for a body at an observer location.' It adds distinguishing detail such as twilight pairs for the Sun, maximum altitude, and null behavior for circumpolar cases, allowing an agent to identify the tool apart from siblings like get_sky_position or find_events.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives rich context for when the tool applies, including how start, count, and continuation behave, and how night_in_progress should be read. However, it never names sibling tools or explicitly says when to choose this tool over alternatives such as astronomy_find_events or astronomy_get_sky_position, so it lacks the highest level of routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

astronomy_get_satellite_passesastronomy-mcp-server: get satellite passesA
Read-onlyIdempotent
Inspect

Predict visible passes of a satellite (e.g. the ISS, NORAD 25544) over an observer in the next days. Identify the satellite by exactly one of norad_id or name — supplying both, or neither, is rejected. A few well-known common names resolve directly to their catalog numbers, ignoring case: ISS or International Space Station (25544), Hubble, Hubble Space Telescope, or HST (20580), and Tiangong, CSS, or Chinese Space Station (48274). Any other name is matched as a case-insensitive substring of CelesTrak's catalog names, so it resolves only when it picks out a single object: a broader query comes back with the matching objects and their catalog numbers to choose from. Either way the result echoes the query that resolved it as resolved_from_name. Fetches the object's current GP element set from CelesTrak, propagates it with SGP4 in-process, and returns each pass's rise, peak, and set times with azimuths and the peak elevation, plus the stretch of the pass visible to the naked eye: visible_start_utc through visible_end_utc, with the elevation and azimuth at each end. A pass is returned when that visible stretch — the satellite above the horizon and sunlit while the Sun is below −6° for the observer — reaches 10° elevation, wherever in the pass it falls. sunlit reports illumination at the peak instant, so it is false on a pass seen only before it enters Earth's shadow or after it leaves. Rise, set, and the visible-stretch edges are within 1 s of the true instants; the peak is the highest sample of a 30-second scan. Every returned pass rises in the requested window or in the 30 s before start: a pass up longer than that at start is omitted rather than reported with start as its rise, so back up start to see it, while a pass still up when the window ends is reported through its actual set. Searches at most 10 days per call: a larger days, up to 30, searches the first 10 and returns a notice naming the exact start and days that continue the search with no pass repeated or skipped, while that start stays within about a month of the element set's epoch. A start further than about a month from the element set's epoch is rejected as out of range on that distance alone, and an element set that will not propagate to a window inside that horizon is rejected as a reentry — so an empty passes means only that nothing was visible. CelesTrak publishes only current element sets, so in practice start must be within about a month of today. NORAD catalog numbers and catalog names are found at celestrak.org or heavens-above.com. This is a gated, network-backed extension (CelesTrak is keyless but rate-limited; element sets are cached briefly). Default elevation 0 m; pass an IANA timezone for observer-local pass times.

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNoNumber of days ahead to search for passes. Default 7. At most 10 are searched per call; a value up to 30 searches the first 10 with a notice naming the `start` and `days` that continue the search.
nameNoSatellite name to resolve, e.g. "ISS (ZARYA)". The common names ISS, International Space Station, Hubble, Hubble Space Telescope, HST, Tiangong, CSS, and Chinese Space Station resolve directly to their catalog numbers, ignoring case and surrounding whitespace. Any other name is matched against CelesTrak as a case-insensitive substring of the catalog name, so give the fullest name you have — a short one matches many objects and is rejected as ambiguous. Mutually exclusive with `norad_id` — supply exactly one.
startNoSearch start as an ISO 8601 UTC string, within about a month of the current element set's epoch — for a tracked object that epoch is hours old, so in practice within about a month of today. A start further out is rejected rather than answered from elements that no longer describe the orbit. Defaults to now. A value with no zone designator is read as UTC, not the local zone of the server process.
latitudeYesObserver latitude in decimal degrees, north positive.
norad_idNoNORAD catalog number of the satellite, e.g. 25544 for the ISS. Found at celestrak.org or heavens-above.com. Mutually exclusive with `name` — supply exactly one.
timezoneNoIANA timezone for localized pass times, e.g. "America/Los_Angeles". When omitted, output is UTC-only.
elevationNoObserver elevation in meters above sea level. Default 0.
longitudeYesObserver longitude in decimal degrees, east positive.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
noticeNoHow to search the days the per-call cap held back: the exact `start` and `days` to re-call with, or — when that start would lie more than about a month from the element set's epoch — that no call can search them. Absent when every requested day was searched.
passesNoPasses whose visible stretch — the satellite above the horizon and sunlit while the Sun is below −6° for the observer — reaches 10° elevation, in the window searched, chronological.
norad_idNoThe NORAD catalog number echoed from the request.
totalCountNoNumber of visible passes found in the window searched.
satellite_nameNoSatellite name as CelesTrak catalogs it (the element set's OBJECT_NAME).
resolved_from_nameNoThe name query that resolved this object. Present only when the request supplied `name` rather than `norad_id`.

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Far exceeds what the readOnly/openWorld/idempotent annotations convey: it discloses CelesTrak fetch + in-process SGP4 propagation, brief element-set caching, keyless but rate-limited network dependency, rejection modes (out-of-range epoch, reentry), 1 s timing accuracy with a 30 s peak scan, and the exact visibility criterion (10° elevation, sun below −6°). This is exactly the mutation/limitation context annotations cannot supply.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and the mutually-exclusive-key rule are front-loaded correctly, and few sentences are pure filler. But the body is a dense, run-on wall of text with heavily nested clauses ('a pass up longer than that at `start`...'), which strains scannability for an agent deciding whether to call it.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 8-parameter, network-backed prediction tool with an output schema, everything needed to call it correctly is present: inputs, exclusivity constraints, time-window footguns, failure semantics, and the meaning of an empty `passes`. Return-value details are covered by the output schema, so nothing material is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3, and the description largely restates the schema's own parameter text (name resolution rules, mutual exclusivity, days cap, start horizon, timezone, elevation default). The one genuinely additive point is that an over-broad name comes back with candidate catalog numbers, but that is already in the schema's `name` description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb and resource: 'Predict visible passes of a satellite over an observer,' with the key scope qualifier ('visible') and a concrete example (ISS, NORAD 25544). It is clearly separable from siblings like astronomy_get_rise_set or astronomy_get_sky_position, which do not predict pass windows.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives strong situational guidance: how to supply name vs norad_id, when a name resolution fails ambiguously, when to back up `start` to catch an in-progress pass, and how the 10-day per-call cap is continued. However, it never explicitly routes the agent away from or toward any named sibling tool, so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

astronomy_get_sky_positionastronomy-mcp-server: get sky positionA
Read-onlyIdempotent
Inspect

Compute the apparent topocentric position of one solar-system body (sun, moon, mercury through neptune, pluto) or a named bright star for an observer location and instant. Returns equatorial (RA/Dec), refraction-corrected horizontal (altitude/azimuth), and ecliptic coordinates, plus distance, apparent magnitude, angular diameter, phase angle, illuminated fraction, angular distance from the Sun, and the constellation it falls in. For a solar-system body it also returns that body card — classification, mean radius, naked-eye visibility — the same values served at astronomy://body/{body}, so a client without resource support does not need a second surface to reach them; a catalog star has no card and the field is absent. Positions are parallax- and aberration-corrected for the given observer; default elevation is 0 m and the default time is now. Supply star (e.g. "Sirius", "Polaris") instead of body to target a catalog star; body is ignored when star is set. Pass an IANA timezone to also receive the observer-local time. This server does not geocode — resolve a place name to latitude/longitude upstream first.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyNoSolar-system body to locate. Omit when targeting a named star via `star`.
starNoNamed star to locate, from a bundled catalog of 32 stars — about 30 of the brightest naked-eye stars plus Polaris, not an arbitrary star. Accepts a common name or Bayer designation, with the Greek letter spelled out or as a symbol and the constellation as its genitive or IAU abbreviation (e.g. "Sirius", "Alpha Centauri", "α CMa"). A name outside the catalog fails with the full list of catalog stars. Takes precedence over `body`.
timeNoInstant of observation as an ISO 8601 UTC string, e.g. "2024-04-08T18:00:00Z". Defaults to now. A value with no zone designator is read as UTC, not the local zone of the server process.
latitudeYesObserver latitude in decimal degrees, north positive.
timezoneNoIANA timezone for localized output, e.g. "America/Los_Angeles". When omitted, output is UTC-only.
elevationNoObserver elevation in meters above sea level. Default 0.
longitudeYesObserver longitude in decimal degrees, east positive.

Output Schema

ParametersJSON Schema
NameRequiredDescription
bodyNoThe body or star this position is for, echoed from the request.
errorNoPresent when the call failed. Absent on success.
eclipticNoEcliptic-of-date coordinates of the body.
time_utcNoThe instant of the observation in ISO 8601 UTC.
magnitudeNoApparent visual magnitude (lower is brighter). Null for bodies where the engine cannot compute it.
equatorialNoApparent equatorial coordinates, corrected for precession, nutation, parallax, and aberration.
horizontalNoRefraction-corrected horizontal coordinates as seen from the observer.
time_localNoThe same instant in the observer-local timezone with offset, present only when a timezone was supplied.
body_metadataNoThe body card also served at astronomy://body/{body}, copied here so a client without resource support can reach it. Present for the ten solar-system bodies; absent for a catalog star, which has no card.
constellationNoThe constellation the body currently falls within.
phase_angle_degreesNoSun-body-observer phase angle in degrees. Null when not applicable (e.g. stars).
illuminated_fractionNoFraction of the disc illuminated, 0 to 1. Null when not applicable.
sun_elongation_degreesNoAngular distance from the Sun in degrees [0,180], seen from Earth's center. A body within about 15° of the Sun is lost in its glare. 0 for the Sun itself.
angular_diameter_arcsecNoApparent angular diameter of the disc in arcseconds. Null for point-source convention bodies.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and idempotentHint=true, but the description adds substantial behavioral context: positions are parallax- and aberration-corrected, default elevation is 0 m, default time is now, `body` is ignored when `star` is set, timezone affects output local time, catalog stars produce no body card, and invalid star names fail with a full list. These details go well beyond the structured annotations and are consistent with them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but warranted for a 7-parameter tool with many outputs. It is front-loaded with the core purpose, then output details, then defaults and precedence, and ends with a practical geocoding note. Each sentence carries necessary information; the length is justified by complexity, but it is not as tight as a two-sentence minimal description.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that an output schema exists, the description does not need to document return shapes, but it still lists all returned quantities (including body-card details). It covers defaults, star/body precedence, timezone behavior, catalog constraints, and the no-geocoding limitation. For a tool of this complexity, there are no obvious gaps an agent would need to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds meaningful interplay between `body` and `star` (precedence), explains the effect of `timezone` on output, and clarifies that latitude/longitude must be pre-resolved (no geocoding). This extra semantics raises it above baseline, though it does not radically rewrite parameter meanings.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Compute the apparent topocentric position of one solar-system body ... or a named bright star for an observer location and instant.' It enumerates the exact output quantities (RA/Dec, horizontal, ecliptic, distance, magnitude, etc.) and scopes the tool to a single body or star at a single instant. This clearly distinguishes it from siblings like astronomy_get_ephemeris (time series) or astronomy_get_moon_phase (only lunar phase).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context: this tool targets a single body/star for one observer location and instant, and it explicitly tells users to geocode upstream ('This server does not geocode — resolve a place name to latitude/longitude upstream first.'). It also explains the star-vs-body precedence. However, it never names sibling tools or states when to prefer one of them, so it falls short of full explicit when/when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

astronomy_list_visibleastronomy-mcp-server: list visible bodiesA
Read-onlyIdempotent
Inspect

The one-call "what is up right now" answer. For an observer location and instant, iterate every naked-eye solar-system body (and, with include_stars, the bundled bright stars), compute altitude and azimuth, keep those above the horizon, rank them brightest-and-highest first, and attach a plain-language visibility note to each, along with its angular distance from the Sun. The whole sky is gated by the Sun's altitude into daylight / civil / nautical / astronomical twilight / dark, returned alongside the list, and each note says when daylight, civil twilight, or the Sun's glare hides or dims that body. time is a single evaluation instant, not a window — for "tonight" pass a time after astronomical dusk (use astronomy_get_rise_set on the sun to find it). Default elevation 0 m; use min_altitude to skip objects grazing the horizon. This server does not geocode — resolve coordinates upstream first; pass an IANA timezone for observer-local times on each body.

ParametersJSON Schema
NameRequiredDescriptionDefault
timeNoEvaluation instant as an ISO 8601 UTC string, e.g. "2024-08-12T05:00:00Z". Defaults to now. A single instant, not a window. A value with no zone designator is read as UTC, not the local zone of the server process.
latitudeYesObserver latitude in decimal degrees, north positive.
timezoneNoIANA timezone for localized output, e.g. "America/Los_Angeles". When omitted, output is UTC-only.
elevationNoObserver elevation in meters above sea level. Default 0.
longitudeYesObserver longitude in decimal degrees, east positive.
min_altitudeNoMinimum altitude in degrees to include a body. Default 0 (above the horizon); use e.g. 5 to require clearance.
include_starsNoInclude the bundled bright stars alongside planets. Default false.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
bodiesNoEvery body (and optional star) above the minimum-altitude filter, ranked brightest-and-highest first.
total_countNoNumber of bodies returned above the minimum-altitude filter.
sky_conditionNoSky condition derived from the Sun's altitude — the gate for whether faint objects are observable.
sun_altitude_degreesNoThe Sun's altitude in degrees that produced the sky condition.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnly/idempotent annotations, the description explains how the sky is gated by the Sun's altitude into daylight/twilight/dark, how visibility notes are generated, that time is a single instant not a window, that unzoned times are read as UTC, and that the server does not geocode. This gives the agent exactly the operational context it needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence carries distinct information: scope, ranking/notes, time semantics, defaults, and geocoding constraint. It is front-loaded with the core purpose and scales naturally to the complexity of a 7-parameter tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the rich annotations, the 100%-covered input schema, and the existence of an output schema, the description supplies the remaining context: timezone behavior, no-geocoding limitation, twilight gating, and how to plan 'tonight' observations. Nothing an agent needs to invoke this tool correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds meaningful operational meaning: time must be a single instant, min_altitude is for skipping horizon-grazing objects, elevation defaults to 0 m, and timezone controls observer-local output. This raises it above baseline while the schema still carries the formal definitions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb and resource ('list visible bodies' for an observer location and instant) and immediately frames it as the one-call 'what is up right now' answer, which distinguishes it from ephemeris, rise/set, and event tools. It clearly specifies scope: naked-eye solar-system bodies, optional bright stars, horizon filtering, ranking, and visibility notes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives concrete conditions: use a single evaluation instant, pass a time after astronomical dusk for 'tonight', and consult astronomy_get_rise_set on the sun to find that time. It also tells users to geocode upstream and to use min_altitude to avoid horizon-grazing objects. It does not enumerate when every sibling should be chosen instead, so it falls just short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 4 tool updates
    • Changedastronomy_find_events14 fields changed
      • changedInput schema / properties / body / description
        Previous value: -"Target body — required for opposition, conjunction, max_elongation, and perigee_apogee; ignored otherwise. \"earth\" is accepted only for perigee_apogee, which returns its perihelion and aphelion."New value: +"Target body — required for opposition, conjunction, max_elongation, and perigee_apogee; ignored otherwise. \"earth\" is accepted only for perigee_apogee, which returns its perihelion and aphelion. With `body2`, the Moon or a planet."
      • addedInput schema / properties / body2
        Added value: +{
        +  "description": "Second body for a conjunction of two bodies: the Moon or a planet, different from `body`. Accepted only with event \"conjunction\", where it replaces the conjunction of `body` with the Sun by the conjunction of `body` and `body2` in ecliptic longitude seen from Earth's center. For the Moon meeting the Sun, search moon_quarter for the new moon.",
        +  "enum": [
        +    "moon",
        +    "mercury",
        +    "venus",
        +    "mars",
        +    "jupiter",
        +    "saturn",
        +    "uranus",
        +    "neptune",
        +    "pluto"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / count / description
        Previous value: -"Number of forward occurrences to return. Default 1, max 20."New value: +"Number of forward occurrences to return. Default 1. At most 20 are computed per call; a count up to 200 returns the first 20 with a notice naming the `start` and `count` that continue the series."
      • changedInput schema / properties / count / maximum
        Previous value: -20New value: +200
      • addedOutput schema / properties / cap
        Added value: +{
        +  "description": "The per-call event cap that was applied.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `incomplete_observer`: A solar_eclipse or lunar_eclipse was requested with only one of latitude and longitude. `body_required`: A body-relative event was requested without a target body. `body_not_supported`: The body has no such event — opposition for the Sun, Moon, Earth, or an inner planet; conjunction for the Sun, Moon, or Earth; max_elongation for anything but mercury or venus; perigee_apogee for the Sun. `invalid_time`: The `start` value is not a parseable ISO 8601 instant, or names a calendar date that does not exist (e.g. 2026-02-30). `time_out_of_range`: The requested start instant is outside the engine's high-accuracy span (≈1900–2100). `invalid_timezone`: The `timezone` value is not an IANA zone this runtime knows. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `incomplete_observer`: A solar_eclipse or lunar_eclipse was requested with only one of latitude and longitude. `body_required`: A body-relative event was requested without a target body. `body_not_supported`: The body has no such event — opposition for the Sun, Moon, Earth, or an inner planet; conjunction without `body2` for the Sun, Moon, or Earth; max_elongation for anything but mercury or venus; perigee_apogee for the Sun. `invalid_body_pair`: `body2` was supplied with an event other than conjunction, names the same body as `body`, or is paired with a `body` of sun or earth. `invalid_time`: The `start` value is not a parseable ISO 8601 instant, or names a calendar date that does not exist (e.g. 2026-02-30). `time_out_of_range`: The requested start instant is outside the engine's high-accuracy span (≈1900–2100). `invalid_timezone`: The `timezone` value is not an IANA zone this runtime knows. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "incomplete_observer",
        -  "body_required",
        -  "body_not_supported",
        -  "invalid_time",
        -  "time_out_of_range",
        -  "invalid_timezone"
        -]New value: +[
        +  "incomplete_observer",
        +  "body_required",
        +  "body_not_supported",
        +  "invalid_body_pair",
        +  "invalid_time",
        +  "time_out_of_range",
        +  "invalid_timezone"
        +]
      • changedOutput schema / properties / events / items / properties / body / description
        Previous value: -"The target body. Present for opposition/conjunction/max_elongation/perigee_apogee."New value: +"The target body — the first of the pair for a two-body conjunction. Present for opposition/conjunction/max_elongation/perigee_apogee."
      • addedOutput schema / properties / events / items / properties / body2
        Added value: +{
        +  "description": "The second body of a two-body conjunction, as requested. Present only when `body2` was supplied.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / events / items / properties / conjunction_kind / description
        Previous value: -"Whether the planet passes between Earth and the Sun (inferior) or behind the Sun (superior). Present only for mercury and venus conjunctions, the two bodies that reach both."New value: +"Whether the planet passes between Earth and the Sun (inferior) or behind the Sun (superior). Present only for mercury and venus conjunctions with the Sun, the two bodies that reach both."
      • addedOutput schema / properties / events / items / properties / separation_degrees
        Added value: +{
        +  "description": "Angular separation in degrees between body and body2 seen from Earth's center at the conjunction instant. Not always their closest approach: two planets can pass closer days or weeks away. Present only for a two-body conjunction.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / notice / description
        Previous value: -"Why the list is shorter than the requested count: the search reached the end of the supported span (2100). Absent when every requested occurrence came back."New value: +"Why the list is shorter than the requested count: either the per-call cap held events back, and the notice names the exact `start` and `count` to re-call with, or the search reached the end of the supported span (2100). Absent when every requested occurrence came back."
      • addedOutput schema / properties / shown
        Added value: +{
        +  "description": "Number of events returned when the cap applied.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "description": "True when `count` exceeded the per-call cap and only the first events came back.",
        +  "type": "boolean"
        +}
    • Changedastronomy_get_ephemeris10 fields changed
      • changedInput schema / properties / designation / description
        Previous value: -"JPL Horizons target, passed verbatim — use a form that resolves to one record. Numbered asteroid: trailing-semicolon record lookup, e.g. \"433;\" (Eros), \"1;\" (Ceres). Periodic comet: DES + closest-apparition flag, e.g. \"DES=1P;CAP\" (Halley), \"DES=2P;CAP\" (Encke). Spacecraft: negative SPK-ID, e.g. \"-48\" (Hubble). A bare name like \"433 Eros\" (no match) or \"1P/Halley\" (several records) is rejected, but one matching a single object succeeds even when it is not the object meant — check `target_name` in the result. Look up designations at ssd.jpl.nasa.gov/tools/sbdb_lookup.html."New value: +"JPL Horizons target, passed verbatim — use a form that resolves to one record. Numbered asteroid: trailing-semicolon record lookup, e.g. \"433;\" (Eros), \"1;\" (Ceres). Periodic comet: DES + closest-apparition flag, e.g. \"DES=1P;CAP\" (Halley), \"DES=2P;CAP\" (Encke). Spacecraft: negative SPK-ID, e.g. \"-48\" (Hubble). A bare name like \"433 Eros\" (no match) or \"1P/Halley\" (several records) is rejected, and \"Mars\" (several major bodies) is rejected with their ID numbers listed — the planet is \"499\" — but one matching a single object succeeds even when it is not the object meant — check `target_name` in the result. Earth (\"399\") is rejected, being the body the observer is on, and so is a name containing an apostrophe, which the Horizons search cannot match — \"6P/d'Arrest\" resolves as \"DES=6P;CAP\" — or any character outside printable ASCII, which Horizons refuses, such as an accent or a typographic apostrophe — \"Šteins\" resolves as \"2867;\". Look up designations at ssd.jpl.nasa.gov/tools/sbdb_lookup.html."
      • removedInput schema / properties / designation / minLength
        Removed value: -1
      • addedInput schema / properties / designation / pattern
        Added value: +"\\S"
      • changedInput schema / properties / elevation / description
        Previous value: -"Observer elevation in meters above sea level. Default 0."New value: +"Observer elevation in meters above sea level. Default 0. With latitude and longitude it must be greater than -20000 and less than 40000000 — the observer altitudes Horizons accepts; a geocentric request ignores it."
      • changedInput schema / properties / start / description
        Previous value: -"Ephemeris start as an ISO 8601 UTC string, e.g. \"2024-01-01T00:00:00Z\". Defaults to now. A value with no zone designator is read as UTC, not the local zone of the server process."New value: +"Ephemeris start as an ISO 8601 UTC string, e.g. \"2024-01-01T00:00:00Z\", in years 0100 through 9999 — the calendar years JPL Horizons reads. Dates are Gregorian, extended before 1582. Defaults to now. A value with no zone designator is read as UTC, not the local zone of the server process."
      • changedInput schema / properties / step / description
        Previous value: -"Step size as a positive count plus a unit of m (minutes), h (hours), d (days), mo (months), or y (years), e.g. \"10m\", \"1h\", \"1d\". Default \"1h\"."New value: +"Step size as a positive count up to 2147483647 plus a unit of m (minutes), h (hours), d (days), mo (months), or y (years), e.g. \"10m\", \"1h\", \"1d\". Default \"1h\"."
      • changedInput schema / properties / stop / description
        Previous value: -"Ephemeris stop as an ISO 8601 UTC string, and must be later than start. Defaults to 24 hours after start. A value with no zone designator is read as UTC, not the local zone of the server process."New value: +"Ephemeris stop as an ISO 8601 UTC string in years 0100 through 9999, at or after start — equal to start returns the single row at that instant. Defaults to 24 hours after start. A value with no zone designator is read as UTC, not the local zone of the server process."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `invalid_time`: The start or stop timestamp is not a parseable ISO 8601 instant, or names a calendar date that does not exist (e.g. 2026-02-30). `invalid_time_range`: The resolved stop instant is at or before the resolved start instant. `incomplete_observer`: Exactly one of latitude and longitude was supplied. `invalid_step`: The step is not a positive count followed by a unit of m, h, d, mo, or y. `time_out_of_range`: The requested span falls outside the target's Horizons data span. The message names the bound Horizons reported, e.g. after A.D. 2599-DEC-31 for Mars. `body_not_found`: JPL Horizons has no match for the designation, or the designation is ambiguous (a bare comet name matches multiple apparition records). `horizons_unavailable`: The JPL Horizons API failed after retries. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_time`: The start or stop timestamp is not a parseable ISO 8601 instant, names a calendar date that does not exist (e.g. 2026-02-30), or falls outside years 0100 through 9999, the calendar years JPL Horizons reads. `invalid_time_range`: The resolved stop instant is before the resolved start instant. `incomplete_observer`: Exactly one of latitude and longitude was supplied. `invalid_elevation`: An observer (latitude and longitude) was supplied with an elevation of -20000 m or less, or 40000000 m or more — outside the observer altitudes JPL Horizons accepts. `invalid_step`: The step is not a positive count followed by a unit of m, h, d, mo, or y, its count is past 2147483647, or Horizons reports it longer than the span of data it holds for the target. `time_out_of_range`: The requested span falls outside the target's Horizons data span. The message names the bound Horizons reported, e.g. after A.D. 2599-DEC-31 for Mars. `body_not_found`: JPL Horizons has no match for the designation, the designation is ambiguous (a bare comet name matches multiple apparition records), it contains an apostrophe, which the Horizons search cannot match (e.g. \"6P/d'Arrest\"), or it contains a character outside printable ASCII, which Horizons refuses (e.g. \"Šteins\", \"6P/d’Arrest\"). `ambiguous_designation`: A major-body or spacecraft name matches several Horizons bodies (e.g. \"Mars\" matches the planet, its barycenter, and spacecraft). The message lists the candidates with their ID numbers, at most 20, and names the total when there are more. `observer_is_target`: The designation resolves to Earth (e.g. \"399\"), the body every request here observes from. `request_rejected`: JPL Horizons refused a request parameter value with HTTP 400 — the same answer on every attempt. The message names the input that parameter carries. `horizons_unavailable`: The JPL Horizons API failed after retries. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "invalid_time",
        -  "invalid_time_range",
        -  "incomplete_observer",
        -  "invalid_step",
        -  "time_out_of_range",
        -  "body_not_found",
        -  "horizons_unavailable"
        -]New value: +[
        +  "invalid_time",
        +  "invalid_time_range",
        +  "incomplete_observer",
        +  "invalid_elevation",
        +  "invalid_step",
        +  "time_out_of_range",
        +  "body_not_found",
        +  "ambiguous_designation",
        +  "observer_is_target",
        +  "request_rejected",
        +  "horizons_unavailable"
        +]
      • changedOutput schema / properties / truncated / description
        Previous value: -"True when Horizons returned more rows than the inline cap."New value: +"True when the requested span continues past the returned rows; the notice names the start to resume from."
    • Changedastronomy_get_rise_set22 fields changed
      • changedInput schema / properties / count / description
        Previous value: -"Number of forward rise/set cycles to return. Default 1, max 31."New value: +"Number of forward rise/set cycles to return. Default 1. At most 31 are computed per call; a count up to 366 returns the first 31 with a notice naming the `start` and `count` that continue the series."
      • changedInput schema / properties / count / maximum
        Previous value: -31New value: +366
      • addedOutput schema / properties / cap
        Added value: +{
        +  "description": "The per-call cycle cap that was applied.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / events / items / properties / rise_utc / description
        Previous value: -"Rise time in ISO 8601 UTC, or null when the body does not rise in this cycle — because it is circumpolar, or because it was already above the horizon at the search start, whose rise precedes the search. The accompanying note says which."New value: +"Rise time in ISO 8601 UTC, or null when the body does not rise in this cycle — because it is circumpolar, or because it was already above the horizon when the cycle opened (at the search start, or after a day it never set on), so its rise precedes the cycle. The accompanying note says which."
      • changedOutput schema / properties / events / items / properties / transit_utc / description
        Previous value: -"Culmination (highest point) time in ISO 8601 UTC, or null when not found."New value: +"Culmination (highest point) time in ISO 8601 UTC, or null when it falls outside this cycle — before its rise, after its set, or before the search start."
      • changedOutput schema / properties / events / items / properties / twilight / description
        Previous value: -"The three twilight pairs, present only when body is \"sun\". Each pair spans one night: dusk is the evening of this cycle's set and dawn is the following morning, so a cycle's dawn falls a day after its rise. The dawn before a given sunrise is in the previous cycle's pair — start the search a day earlier to get it."New value: +"The three twilight pairs, present only when body is \"sun\". Each pair spans one night: dusk is the evening of this cycle's set — or, in a cycle with no set, the evening after its culmination — and dawn is the following morning, so a cycle's dawn falls a day after its rise. Each is searched only up to the start of the next cycle's day (its sunrise, or its culmination when it has no rise), so a depth the night never reaches is null. A first cycle with no rise, set, or transit is the rest of the day the search started in, inside or at the edge of a polar night; its pairs can include times before `start` that have passed. The dawn before a given sunrise is in the previous cycle's pair; before the first cycle's sunrise it is in `night_in_progress` when `start` falls in a night that began with a sunset, and otherwise start the search a day earlier to get it."
      • changedOutput schema / properties / events / items / properties / twilight / properties / astronomical / properties / dawn_local / description
        Previous value: -"Dawn in observer-local time — the morning after the cycle's set — present only when a timezone was supplied."New value: +"Dawn in observer-local time — the morning that ends the night — present only when a timezone was supplied."
      • changedOutput schema / properties / events / items / properties / twilight / properties / astronomical / properties / dawn_utc / description
        Previous value: -"Dawn (Sun ascending through the depth) in ISO 8601 UTC, or null if it does not occur. This is the morning after the cycle's set, ending the night that begins at the dusk beside it — a day later than the cycle's rise, not the dawn before it."New value: +"Dawn (Sun ascending through the depth) in ISO 8601 UTC, or null when the night never reaches the depth. It ends the night that begins at the dusk beside it: in a cycle, the morning after that cycle's set, or after its culmination when it has no set — a day later than the cycle's rise, not the dawn before it."
      • changedOutput schema / properties / events / items / properties / twilight / properties / astronomical / properties / dusk_local / description
        Previous value: -"Dusk in observer-local time — the evening of the cycle's set — present only when a timezone was supplied."New value: +"Dusk in observer-local time — the evening that begins the night — present only when a timezone was supplied."
      • changedOutput schema / properties / events / items / properties / twilight / properties / astronomical / properties / dusk_utc / description
        Previous value: -"Dusk (Sun descending through the depth) in ISO 8601 UTC, or null if it does not occur. This is the evening of the cycle's set."New value: +"Dusk (Sun descending through the depth) in ISO 8601 UTC, or null when the night never reaches the depth. It is the evening the night begins: in a cycle, the evening of that cycle's set, or after its culmination when it has no set."
      • changedOutput schema / properties / events / items / properties / twilight / properties / civil / properties / dawn_local / description
        Previous value: -"Dawn in observer-local time — the morning after the cycle's set — present only when a timezone was supplied."New value: +"Dawn in observer-local time — the morning that ends the night — present only when a timezone was supplied."
      • changedOutput schema / properties / events / items / properties / twilight / properties / civil / properties / dawn_utc / description
        Previous value: -"Dawn (Sun ascending through the depth) in ISO 8601 UTC, or null if it does not occur. This is the morning after the cycle's set, ending the night that begins at the dusk beside it — a day later than the cycle's rise, not the dawn before it."New value: +"Dawn (Sun ascending through the depth) in ISO 8601 UTC, or null when the night never reaches the depth. It ends the night that begins at the dusk beside it: in a cycle, the morning after that cycle's set, or after its culmination when it has no set — a day later than the cycle's rise, not the dawn before it."
      • changedOutput schema / properties / events / items / properties / twilight / properties / civil / properties / dusk_local / description
        Previous value: -"Dusk in observer-local time — the evening of the cycle's set — present only when a timezone was supplied."New value: +"Dusk in observer-local time — the evening that begins the night — present only when a timezone was supplied."
      • changedOutput schema / properties / events / items / properties / twilight / properties / civil / properties / dusk_utc / description
        Previous value: -"Dusk (Sun descending through the depth) in ISO 8601 UTC, or null if it does not occur. This is the evening of the cycle's set."New value: +"Dusk (Sun descending through the depth) in ISO 8601 UTC, or null when the night never reaches the depth. It is the evening the night begins: in a cycle, the evening of that cycle's set, or after its culmination when it has no set."
      • changedOutput schema / properties / events / items / properties / twilight / properties / nautical / properties / dawn_local / description
        Previous value: -"Dawn in observer-local time — the morning after the cycle's set — present only when a timezone was supplied."New value: +"Dawn in observer-local time — the morning that ends the night — present only when a timezone was supplied."
      • changedOutput schema / properties / events / items / properties / twilight / properties / nautical / properties / dawn_utc / description
        Previous value: -"Dawn (Sun ascending through the depth) in ISO 8601 UTC, or null if it does not occur. This is the morning after the cycle's set, ending the night that begins at the dusk beside it — a day later than the cycle's rise, not the dawn before it."New value: +"Dawn (Sun ascending through the depth) in ISO 8601 UTC, or null when the night never reaches the depth. It ends the night that begins at the dusk beside it: in a cycle, the morning after that cycle's set, or after its culmination when it has no set — a day later than the cycle's rise, not the dawn before it."
      • changedOutput schema / properties / events / items / properties / twilight / properties / nautical / properties / dusk_local / description
        Previous value: -"Dusk in observer-local time — the evening of the cycle's set — present only when a timezone was supplied."New value: +"Dusk in observer-local time — the evening that begins the night — present only when a timezone was supplied."
      • changedOutput schema / properties / events / items / properties / twilight / properties / nautical / properties / dusk_utc / description
        Previous value: -"Dusk (Sun descending through the depth) in ISO 8601 UTC, or null if it does not occur. This is the evening of the cycle's set."New value: +"Dusk (Sun descending through the depth) in ISO 8601 UTC, or null when the night never reaches the depth. It is the evening the night begins: in a cycle, the evening of that cycle's set, or after its culmination when it has no set."
      • addedOutput schema / properties / night_in_progress
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "The night under way at `start`, present only when body is \"sun\", the Sun is below the horizon at `start`, it set since its last culmination and within the two days before, and it rises within the two days after. The first cycle then opens with the next day — at its sunrise, or its culmination when the Sun does not rise that day — and its twilight is the night after, so this field holds the night the caller is in: for each depth, dusk on the evening of that sunset and dawn before the day of the first cycle begins. Times earlier than `start` are included and have already passed. Each pair is searched only within that night, so a depth the night never reaches is null. Absent when a day the Sun never rose on fell between the last sunset and `start`: that sunset began an earlier night. A continuation call, started one second past the last set of the previous call, repeats here the night the last cycle of that call carried; its `events` do not repeat. Not one of `events` and not counted by `count`.",
        +  "properties": {
        +    "astronomical": {
        +      "additionalProperties": false,
        +      "description": "Astronomical twilight (Sun at −18°): dusk and the following dawn, bounding the dark-sky window.",
        +      "properties": {
        +        "dawn_local": {
        +          "description": "Dawn in observer-local time — the morning that ends the night — present only when a timezone was supplied.",
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "dawn_utc": {
        +          "description": "Dawn (Sun ascending through the depth) in ISO 8601 UTC, or null when the night never reaches the depth. It ends the night that begins at the dusk beside it: in a cycle, the morning after that cycle's set, or after its culmination when it has no set — a day later than the cycle's rise, not the dawn before it.",
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "dusk_local": {
        +          "description": "Dusk in observer-local time — the evening that begins the night — present only when a timezone was supplied.",
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "dusk_utc": {
        +          "description": "Dusk (Sun descending through the depth) in ISO 8601 UTC, or null when the night never reaches the depth. It is the evening the night begins: in a cycle, the evening of that cycle's set, or after its culmination when it has no set.",
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        }
        +      },
        +      "required": [
        +        "dawn_utc",
        +        "dusk_utc"
        +      ],
        +      "type": "object"
        +    },
        +    "civil": {
        +      "additionalProperties": false,
        +      "description": "Civil twilight (Sun at −6°): dusk and the following dawn.",
        +      "properties": {
        +        "dawn_local": {
        +          "description": "Dawn in observer-local time — the morning that ends the night — present only when a timezone was supplied.",
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "dawn_utc": {
        +          "description": "Dawn (Sun ascending through the depth) in ISO 8601 UTC, or null when the night never reaches the depth. It ends the night that begins at the dusk beside it: in a cycle, the morning after that cycle's set, or after its culmination when it has no set — a day later than the cycle's rise, not the dawn before it.",
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "dusk_local": {
        +          "description": "Dusk in observer-local time — the evening that begins the night — present only when a timezone was supplied.",
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "dusk_utc": {
        +          "description": "Dusk (Sun descending through the depth) in ISO 8601 UTC, or null when the night never reaches the depth. It is the evening the night begins: in a cycle, the evening of that cycle's set, or after its culmination when it has no set.",
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        }
        +      },
        +      "required": [
        +        "dawn_utc",
        +        "dusk_utc"
        +      ],
        +      "type": "object"
        +    },
        +    "nautical": {
        +      "additionalProperties": false,
        +      "description": "Nautical twilight (Sun at −12°): dusk and the following dawn.",
        +      "properties": {
        +        "dawn_local": {
        +          "description": "Dawn in observer-local time — the morning that ends the night — present only when a timezone was supplied.",
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "dawn_utc": {
        +          "description": "Dawn (Sun ascending through the depth) in ISO 8601 UTC, or null when the night never reaches the depth. It ends the night that begins at the dusk beside it: in a cycle, the morning after that cycle's set, or after its culmination when it has no set — a day later than the cycle's rise, not the dawn before it.",
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "dusk_local": {
        +          "description": "Dusk in observer-local time — the evening that begins the night — present only when a timezone was supplied.",
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "dusk_utc": {
        +          "description": "Dusk (Sun descending through the depth) in ISO 8601 UTC, or null when the night never reaches the depth. It is the evening the night begins: in a cycle, the evening of that cycle's set, or after its culmination when it has no set.",
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        }
        +      },
        +      "required": [
        +        "dawn_utc",
        +        "dusk_utc"
        +      ],
        +      "type": "object"
        +    }
        +  },
        +  "required": [
        +    "civil",
        +    "nautical",
        +    "astronomical"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "How to retrieve the cycles the per-call cap held back: the exact `start` and `count` to re-call with, or — when the next cycle starts after 2100, the end of the supported span — that no call can continue the series. Absent when every requested cycle came back.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / shown
        Added value: +{
        +  "description": "Number of cycles returned when the cap applied.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "description": "True when `count` exceeded the per-call cap and only the first cycles came back.",
        +  "type": "boolean"
        +}
    • Changedastronomy_get_satellite_passes24 fields changed
      • changedInput schema / properties / days / description
        Previous value: -"Number of days ahead to search for passes. Default 7, max 10."New value: +"Number of days ahead to search for passes. Default 7. At most 10 are searched per call; a value up to 30 searches the first 10 with a notice naming the `start` and `days` that continue the search."
      • changedInput schema / properties / days / maximum
        Previous value: -10New value: +30
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `invalid_time`: The start timestamp is not a parseable ISO 8601 instant, or names a calendar date that does not exist (e.g. 2026-02-30). `time_out_of_range`: The start instant is outside the SGP4 high-accuracy span (≈1900–2100), or more than about a month from the epoch of the current element set — checked on the epoch distance itself, since SGP4 keeps returning positions well past the point where the mean elements describe the orbit. `invalid_timezone`: The `timezone` value is not an IANA zone this runtime knows. `invalid_target`: Neither `norad_id` nor `name` was supplied, or both were. `tle_not_found`: CelesTrak has no current element set for the NORAD ID. `satellite_name_not_found`: No current CelesTrak object has a name containing the `name` value. `ambiguous_satellite_name`: The `name` value matches more than one current object and none of them carries it as their whole name. The error names the match count and lists the matching objects with their catalog numbers, capped when there are more than the list holds. A capped list carries a hint leading with narrowing instead of with the list, since the wanted object need not be among the ones shown. `object_decayed`: A current element set will not propagate to a window near its own epoch — the signature of an object that has reentered. `celestrak_unavailable`: The element-set fetch failed after retries, or returned a body that is not JSON at all. `malformed_element_set`: CelesTrak answered with parsable JSON whose GP record does not carry the fields an OMM element set requires — a permanent property of that record, not the transient outage celestrak_unavailable covers. The same request returns the same record, so retrying it can only fail again. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_time`: The start timestamp is not a parseable ISO 8601 instant, or names a calendar date that does not exist (e.g. 2026-02-30). `time_out_of_range`: The start instant falls outside the years 1900–2100, or more than about a month from the epoch of the current element set — checked on the epoch distance itself, since SGP4 keeps returning positions well past the point where the mean elements describe the orbit. `invalid_timezone`: The `timezone` value is not an IANA zone this runtime knows. `invalid_target`: Neither `norad_id` nor `name` was supplied, or both were. `tle_not_found`: CelesTrak has no current element set for the NORAD ID. `satellite_name_not_found`: No current CelesTrak object has a name containing the `name` value. `ambiguous_satellite_name`: The `name` value matches more than one current object and none of them carries it as their whole name. The error names the match count and lists the matching objects with their catalog numbers, capped when there are more than the list holds. A capped list carries a hint leading with narrowing instead of with the list, since the wanted object need not be among the ones shown. `object_decayed`: A current element set will not propagate to a window near its own epoch — the signature of an object that has reentered. `celestrak_unavailable`: The element-set fetch failed after retries, or returned a body that is not JSON at all. `malformed_element_set`: CelesTrak answered with parsable JSON whose GP record does not carry the fields an OMM element set requires — a permanent property of that record, not the transient outage celestrak_unavailable covers. The same request returns the same record, so retrying it can only fail again. Other values are possible when a failure originates below the handler."
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "How to search the days the per-call cap held back: the exact `start` and `days` to re-call with, or — when that start would lie more than about a month from the element set's epoch — that no call can search them. Absent when every requested day was searched.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / passes / description
        Previous value: -"Visible passes (sunlit satellite over a dark-enough sky) in the requested window, chronological."New value: +"Passes whose visible stretch — the satellite above the horizon and sunlit while the Sun is below −6° for the observer — reaches 10° elevation, in the window searched, chronological."
      • changedOutput schema / properties / passes / items / description
        Previous value: -"One visible pass with rise/peak/set geometry and illumination."New value: +"One visible pass: horizon-to-horizon rise/peak/set geometry, illumination at peak, and the stretch of the pass that is visible to the naked eye."
      • changedOutput schema / properties / passes / items / properties / duration_seconds / description
        Previous value: -"Pass duration from rise to set, in seconds."New value: +"Pass duration from `rise_utc` to `set_utc`, in seconds."
      • changedOutput schema / properties / passes / items / properties / peak_altitude_degrees / description
        Previous value: -"Maximum elevation angle during the pass, in degrees."New value: +"Maximum elevation angle during the pass, in degrees, as sampled every 30 seconds."
      • changedOutput schema / properties / passes / items / properties / peak_utc / description
        Previous value: -"Time of maximum elevation in ISO 8601 UTC."New value: +"Time of maximum elevation in ISO 8601 UTC, the highest sample of a 30-second scan."
      • changedOutput schema / properties / passes / items / properties / rise_azimuth_degrees / description
        Previous value: -"Azimuth at rise, in degrees (0=N, 90=E, 180=S, 270=W)."New value: +"Azimuth at `rise_utc`, in degrees (0=N, 90=E, 180=S, 270=W)."
      • changedOutput schema / properties / passes / items / properties / rise_utc / description
        Previous value: -"Acquisition of signal (rise above horizon) in ISO 8601 UTC."New value: +"Rise above the horizon in ISO 8601 UTC, within 1 s of the true crossing. Can fall up to 30 s before `start` when the satellite rose inside the 30-second scan step ending at `start`."
      • changedOutput schema / properties / passes / items / properties / set_azimuth_degrees / description
        Previous value: -"Azimuth at set, in degrees."New value: +"Azimuth at `set_utc`, in degrees."
      • changedOutput schema / properties / passes / items / properties / set_utc / description
        Previous value: -"Loss of signal (set below horizon) in ISO 8601 UTC."New value: +"Set below the horizon in ISO 8601 UTC, within 1 s of the true crossing."
      • changedOutput schema / properties / passes / items / properties / sunlit / description
        Previous value: -"True when the satellite is in sunlight at peak — a precondition for naked-eye visibility."New value: +"True when the satellite is in sunlight at the peak instant. False on a pass that enters Earth's shadow before its peak or leaves it after — the visible_* fields say when it can be seen."
      • addedOutput schema / properties / passes / items / properties / visible_end_altitude_degrees
        Added value: +{
        +  "description": "Elevation where the visible stretch ends, in degrees — 0 when it ends at the set.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / passes / items / properties / visible_end_azimuth_degrees
        Added value: +{
        +  "description": "Azimuth where the visible stretch ends, in degrees.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / passes / items / properties / visible_end_local
        Added value: +{
        +  "description": "Visible-stretch end in observer-local time, present only when a timezone was supplied.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / passes / items / properties / visible_end_utc
        Added value: +{
        +  "description": "End of the visible stretch in ISO 8601 UTC. Equals `set_utc` when the pass is visible until it sets; otherwise within 1 s of the moment it enters Earth's shadow or the sky brightens.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / passes / items / properties / visible_start_altitude_degrees
        Added value: +{
        +  "description": "Elevation where the visible stretch starts, in degrees — 0 when it starts at the rise.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / passes / items / properties / visible_start_azimuth_degrees
        Added value: +{
        +  "description": "Azimuth where the visible stretch starts, in degrees — where to look first.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / passes / items / properties / visible_start_local
        Added value: +{
        +  "description": "Visible-stretch start in observer-local time, present only when a timezone was supplied.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / passes / items / properties / visible_start_utc
        Added value: +{
        +  "description": "Start of the visible stretch — above the horizon, sunlit, over a dark sky — in ISO 8601 UTC. Equals `rise_utc` when the pass is visible from its rise; otherwise within 1 s of the moment it leaves Earth's shadow or the sky darkens.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / passes / items / required
        Previous value: -[
        -  "rise_utc",
        -  "peak_utc",
        -  "set_utc",
        -  "peak_altitude_degrees",
        -  "rise_azimuth_degrees",
        -  "set_azimuth_degrees",
        -  "peak_azimuth_degrees",
        -  "duration_seconds",
        -  "sunlit"
        -]New value: +[
        +  "rise_utc",
        +  "peak_utc",
        +  "set_utc",
        +  "peak_altitude_degrees",
        +  "rise_azimuth_degrees",
        +  "set_azimuth_degrees",
        +  "peak_azimuth_degrees",
        +  "duration_seconds",
        +  "sunlit",
        +  "visible_start_utc",
        +  "visible_end_utc",
        +  "visible_start_altitude_degrees",
        +  "visible_end_altitude_degrees",
        +  "visible_start_azimuth_degrees",
        +  "visible_end_azimuth_degrees"
        +]
      • changedOutput schema / properties / totalCount / description
        Previous value: -"Number of visible passes found in the window."New value: +"Number of visible passes found in the window searched."
  2. 4 tool updates
    • Changedastronomy_get_moon_phase3 fields changed
      • changedOutput schema / anyOf
        Previous value: -[
        -  {
        -    "not": {
        -      "required": [
        -        "error"
        -      ]
        -    },
        -    "required": [
        -      "time_utc",
        -      "phase_angle_degrees",
        -      "illuminated_fraction",
        -      "phase_name",
        -      "age_days",
        -      "next_quarters"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "error"
        -    ]
        -  }
        -]New value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "time_utc",
        +      "phase_longitude_degrees",
        +      "illuminated_fraction",
        +      "phase_name",
        +      "age_days",
        +      "next_quarters"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • removedOutput schema / properties / phase_angle_degrees
        Removed value: -{
        -  "description": "Moon phase angle in degrees: 0 = new, 90 = first quarter, 180 = full, 270 = last quarter.",
        -  "type": "number"
        -}
      • addedOutput schema / properties / phase_longitude_degrees
        Added value: +{
        +  "description": "The Moon's ecliptic longitude minus the Sun's, in degrees [0,360): 0 = new, 90 = first quarter, 180 = full, 270 = last quarter. Not the Sun–body–observer phase angle astronomy_get_sky_position reports as phase_angle_degrees, which reads 0 at full moon.",
        +  "type": "number"
        +}
    • Changedastronomy_get_rise_set16 fields changed
      • changedOutput schema / properties / events / items / properties / twilight / description
        Previous value: -"The three twilight pairs. Present only when body is \"sun\"."New value: +"The three twilight pairs, present only when body is \"sun\". Each pair spans one night: dusk is the evening of this cycle's set and dawn is the following morning, so a cycle's dawn falls a day after its rise. The dawn before a given sunrise is in the previous cycle's pair — start the search a day earlier to get it."
      • changedOutput schema / properties / events / items / properties / twilight / properties / astronomical / description
        Previous value: -"Astronomical twilight (Sun at −18°) dawn and dusk — the dark-sky window."New value: +"Astronomical twilight (Sun at −18°): dusk and the following dawn, bounding the dark-sky window."
      • changedOutput schema / properties / events / items / properties / twilight / properties / astronomical / properties / dawn_local / description
        Previous value: -"Dawn in observer-local time, present only when a timezone was supplied."New value: +"Dawn in observer-local time — the morning after the cycle's set — present only when a timezone was supplied."
      • changedOutput schema / properties / events / items / properties / twilight / properties / astronomical / properties / dawn_utc / description
        Previous value: -"Dawn (Sun ascending through the depth) in ISO 8601 UTC, or null if it does not occur."New value: +"Dawn (Sun ascending through the depth) in ISO 8601 UTC, or null if it does not occur. This is the morning after the cycle's set, ending the night that begins at the dusk beside it — a day later than the cycle's rise, not the dawn before it."
      • changedOutput schema / properties / events / items / properties / twilight / properties / astronomical / properties / dusk_local / description
        Previous value: -"Dusk in observer-local time, present only when a timezone was supplied."New value: +"Dusk in observer-local time — the evening of the cycle's set — present only when a timezone was supplied."
      • changedOutput schema / properties / events / items / properties / twilight / properties / astronomical / properties / dusk_utc / description
        Previous value: -"Dusk (Sun descending through the depth) in ISO 8601 UTC, or null if it does not occur."New value: +"Dusk (Sun descending through the depth) in ISO 8601 UTC, or null if it does not occur. This is the evening of the cycle's set."
      • changedOutput schema / properties / events / items / properties / twilight / properties / civil / description
        Previous value: -"Civil twilight (Sun at −6°) dawn and dusk."New value: +"Civil twilight (Sun at −6°): dusk and the following dawn."
      • changedOutput schema / properties / events / items / properties / twilight / properties / civil / properties / dawn_local / description
        Previous value: -"Dawn in observer-local time, present only when a timezone was supplied."New value: +"Dawn in observer-local time — the morning after the cycle's set — present only when a timezone was supplied."
      • changedOutput schema / properties / events / items / properties / twilight / properties / civil / properties / dawn_utc / description
        Previous value: -"Dawn (Sun ascending through the depth) in ISO 8601 UTC, or null if it does not occur."New value: +"Dawn (Sun ascending through the depth) in ISO 8601 UTC, or null if it does not occur. This is the morning after the cycle's set, ending the night that begins at the dusk beside it — a day later than the cycle's rise, not the dawn before it."
      • changedOutput schema / properties / events / items / properties / twilight / properties / civil / properties / dusk_local / description
        Previous value: -"Dusk in observer-local time, present only when a timezone was supplied."New value: +"Dusk in observer-local time — the evening of the cycle's set — present only when a timezone was supplied."
      • changedOutput schema / properties / events / items / properties / twilight / properties / civil / properties / dusk_utc / description
        Previous value: -"Dusk (Sun descending through the depth) in ISO 8601 UTC, or null if it does not occur."New value: +"Dusk (Sun descending through the depth) in ISO 8601 UTC, or null if it does not occur. This is the evening of the cycle's set."
      • changedOutput schema / properties / events / items / properties / twilight / properties / nautical / description
        Previous value: -"Nautical twilight (Sun at −12°) dawn and dusk."New value: +"Nautical twilight (Sun at −12°): dusk and the following dawn."
      • changedOutput schema / properties / events / items / properties / twilight / properties / nautical / properties / dawn_local / description
        Previous value: -"Dawn in observer-local time, present only when a timezone was supplied."New value: +"Dawn in observer-local time — the morning after the cycle's set — present only when a timezone was supplied."
      • changedOutput schema / properties / events / items / properties / twilight / properties / nautical / properties / dawn_utc / description
        Previous value: -"Dawn (Sun ascending through the depth) in ISO 8601 UTC, or null if it does not occur."New value: +"Dawn (Sun ascending through the depth) in ISO 8601 UTC, or null if it does not occur. This is the morning after the cycle's set, ending the night that begins at the dusk beside it — a day later than the cycle's rise, not the dawn before it."
      • changedOutput schema / properties / events / items / properties / twilight / properties / nautical / properties / dusk_local / description
        Previous value: -"Dusk in observer-local time, present only when a timezone was supplied."New value: +"Dusk in observer-local time — the evening of the cycle's set — present only when a timezone was supplied."
      • changedOutput schema / properties / events / items / properties / twilight / properties / nautical / properties / dusk_utc / description
        Previous value: -"Dusk (Sun descending through the depth) in ISO 8601 UTC, or null if it does not occur."New value: +"Dusk (Sun descending through the depth) in ISO 8601 UTC, or null if it does not occur. This is the evening of the cycle's set."
    • Changedastronomy_get_sky_position4 fields changed
      • changedInput schema / properties / star / description
        Previous value: -"Named bright star to locate (common name or Bayer designation, e.g. \"Sirius\", \"Alpha Centauri\"). Takes precedence over `body`."New value: +"Named star to locate, from a bundled catalog of 32 stars — about 30 of the brightest naked-eye stars plus Polaris, not an arbitrary star. Accepts a common name or Bayer designation, with the Greek letter spelled out or as a symbol and the constellation as its genitive or IAU abbreviation (e.g. \"Sirius\", \"Alpha Centauri\", \"α CMa\"). A name outside the catalog fails with the full list of catalog stars. Takes precedence over `body`."
      • changedOutput schema / anyOf
        Previous value: -[
        -  {
        -    "not": {
        -      "required": [
        -        "error"
        -      ]
        -    },
        -    "required": [
        -      "body",
        -      "time_utc",
        -      "equatorial",
        -      "horizontal",
        -      "ecliptic",
        -      "magnitude",
        -      "angular_diameter_arcsec",
        -      "phase_angle_degrees",
        -      "illuminated_fraction",
        -      "constellation"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "error"
        -    ]
        -  }
        -]New value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "body",
        +      "time_utc",
        +      "equatorial",
        +      "horizontal",
        +      "ecliptic",
        +      "magnitude",
        +      "angular_diameter_arcsec",
        +      "phase_angle_degrees",
        +      "illuminated_fraction",
        +      "sun_elongation_degrees",
        +      "constellation"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `invalid_time`: The `time` value is not a parseable ISO 8601 instant, or names a calendar date that does not exist (e.g. 2026-02-30). `time_out_of_range`: The requested instant is outside the engine's high-accuracy span (≈1900–2100). `invalid_timezone`: The `timezone` value is not an IANA zone this runtime knows. `star_not_found`: The `star` name is not present in the bundled bright-star catalog. `body_required`: Neither a `body` nor a `star` was supplied. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_time`: The `time` value is not a parseable ISO 8601 instant, or names a calendar date that does not exist (e.g. 2026-02-30). `time_out_of_range`: The requested instant is outside the engine's high-accuracy span (≈1900–2100). `invalid_timezone`: The `timezone` value is not an IANA zone this runtime knows. `star_not_found`: The `star` name is not present in the bundled bright-star catalog. The error lists every catalog star, in the message and as `catalog_stars`. `body_required`: Neither a `body` nor a `star` was supplied. Other values are possible when a failure originates below the handler."
      • addedOutput schema / properties / sun_elongation_degrees
        Added value: +{
        +  "description": "Angular distance from the Sun in degrees [0,180], seen from Earth's center. A body within about 15° of the Sun is lost in its glare. 0 for the Sun itself.",
        +  "type": "number"
        +}
    • Changedastronomy_list_visible3 fields changed
      • addedOutput schema / properties / bodies / items / properties / sun_elongation_degrees
        Added value: +{
        +  "description": "Angular distance from the Sun in degrees [0,180], seen from Earth's center. A body within about 15° of the Sun is lost in its glare. 0 for the Sun itself.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / bodies / items / properties / visibility_note / description
        Previous value: -"Server-computed one-line headline from real values, e.g. \"Venus, mag -4.1, 12° above the WSW horizon — very bright\"."New value: +"Server-computed one-line headline from real values, e.g. \"Venus, mag -4.1, 12° above the WSW horizon — very bright\". It states when the conditions hide a body: \"daylight, not naked-eye visible\" when the Sun is up, \"N° from the Sun, lost in glare\" within 15° of the Sun, and \"civil twilight, sky still bright\" in civil twilight. The Moon and a negative-magnitude Venus take no daylight or twilight caveat, being visible in a blue sky; the Sun takes none."
      • changedOutput schema / properties / bodies / items / required
        Previous value: -[
        -  "body",
        -  "time_utc",
        -  "equatorial",
        -  "horizontal",
        -  "ecliptic",
        -  "magnitude",
        -  "angular_diameter_arcsec",
        -  "phase_angle_degrees",
        -  "illuminated_fraction",
        -  "constellation",
        -  "rank",
        -  "visibility_note"
        -]New value: +[
        +  "body",
        +  "time_utc",
        +  "equatorial",
        +  "horizontal",
        +  "ecliptic",
        +  "magnitude",
        +  "angular_diameter_arcsec",
        +  "phase_angle_degrees",
        +  "illuminated_fraction",
        +  "sun_elongation_degrees",
        +  "constellation",
        +  "rank",
        +  "visibility_note"
        +]
  3. 2 tool updates
    • Changedastronomy_get_ephemeris4 fields changed
      • changedInput schema / properties / designation / description
        Previous value: -"JPL Horizons target, passed verbatim — use a form that resolves to one record. Numbered asteroid: trailing-semicolon record lookup, e.g. \"433;\" (Eros), \"1;\" (Ceres). Periodic comet: DES + closest-apparition flag, e.g. \"DES=1P;CAP\" (Halley), \"DES=2P;CAP\" (Encke). Spacecraft: negative SPK-ID, e.g. \"-48\" (Hubble). A bare name like \"433 Eros\" or \"1P/Halley\" fails. Look up designations at ssd.jpl.nasa.gov/tools/sbdb_lookup.html."New value: +"JPL Horizons target, passed verbatim — use a form that resolves to one record. Numbered asteroid: trailing-semicolon record lookup, e.g. \"433;\" (Eros), \"1;\" (Ceres). Periodic comet: DES + closest-apparition flag, e.g. \"DES=1P;CAP\" (Halley), \"DES=2P;CAP\" (Encke). Spacecraft: negative SPK-ID, e.g. \"-48\" (Hubble). A bare name like \"433 Eros\" (no match) or \"1P/Halley\" (several records) is rejected, but one matching a single object succeeds even when it is not the object meant — check `target_name` in the result. Look up designations at ssd.jpl.nasa.gov/tools/sbdb_lookup.html."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `invalid_time`: The start or stop timestamp is not a parseable ISO 8601 instant, or names a calendar date that does not exist (e.g. 2026-02-30). `invalid_time_range`: The resolved stop instant is at or before the resolved start instant. `incomplete_observer`: Exactly one of latitude and longitude was supplied. `invalid_step`: The step is not a positive count followed by a unit of m, h, d, mo, or y. `body_not_found`: JPL Horizons has no match for the designation, or the designation is ambiguous (a bare comet name matches multiple apparition records). `horizons_unavailable`: The JPL Horizons API failed after retries. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_time`: The start or stop timestamp is not a parseable ISO 8601 instant, or names a calendar date that does not exist (e.g. 2026-02-30). `invalid_time_range`: The resolved stop instant is at or before the resolved start instant. `incomplete_observer`: Exactly one of latitude and longitude was supplied. `invalid_step`: The step is not a positive count followed by a unit of m, h, d, mo, or y. `time_out_of_range`: The requested span falls outside the target's Horizons data span. The message names the bound Horizons reported, e.g. after A.D. 2599-DEC-31 for Mars. `body_not_found`: JPL Horizons has no match for the designation, or the designation is ambiguous (a bare comet name matches multiple apparition records). `horizons_unavailable`: The JPL Horizons API failed after retries. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "invalid_time",
        -  "invalid_time_range",
        -  "incomplete_observer",
        -  "invalid_step",
        -  "body_not_found",
        -  "horizons_unavailable"
        -]New value: +[
        +  "invalid_time",
        +  "invalid_time_range",
        +  "incomplete_observer",
        +  "invalid_step",
        +  "time_out_of_range",
        +  "body_not_found",
        +  "horizons_unavailable"
        +]
      • addedOutput schema / properties / target_name
        Added value: +{
        +  "description": "The object JPL Horizons resolved the designation to, from its 'Target body name' header — compare it with the intended object, since a bare name can resolve to a different one. Absent when Horizons' response names no target.",
        +  "type": "string"
        +}
    • Changedastronomy_get_satellite_passes1 field changed
      • changedInput schema / properties / name / description
        Previous value: -"Satellite name to resolve against CelesTrak, e.g. \"ISS (ZARYA)\". Matched as a case-insensitive substring of the catalog name, so give the fullest name you have — a short one matches many objects and is rejected as ambiguous. Mutually exclusive with `norad_id` — supply exactly one."New value: +"Satellite name to resolve, e.g. \"ISS (ZARYA)\". The common names ISS, International Space Station, Hubble, Hubble Space Telescope, HST, Tiangong, CSS, and Chinese Space Station resolve directly to their catalog numbers, ignoring case and surrounding whitespace. Any other name is matched against CelesTrak as a case-insensitive substring of the catalog name, so give the fullest name you have — a short one matches many objects and is rejected as ambiguous. Mutually exclusive with `norad_id` — supply exactly one."
  4. 1 tool update
    • Changedastronomy_find_events10 fields changed
      • changedInput schema / properties / latitude / description
        Previous value: -"Observer latitude in decimal degrees — required for solar_eclipse to get local circumstances, ignored by every other event."New value: +"Observer latitude in decimal degrees, supplied together with longitude. Optional for solar_eclipse and lunar_eclipse, where it adds local circumstances; omit both for a global solar search. Ignored by every other event."
      • changedInput schema / properties / longitude / description
        Previous value: -"Observer longitude in decimal degrees — required for solar_eclipse, ignored by every other event."New value: +"Observer longitude in decimal degrees, supplied together with latitude. Optional for solar_eclipse and lunar_eclipse; ignored by every other event."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `observer_required`: A solar_eclipse event was requested without observer latitude/longitude. `body_required`: A body-relative event was requested without a target body. `body_not_supported`: The body has no such event — opposition for the Sun, Moon, Earth, or an inner planet; conjunction for the Sun, Moon, or Earth; max_elongation for anything but mercury or venus; perigee_apogee for the Sun. `invalid_time`: The `start` value is not a parseable ISO 8601 instant, or names a calendar date that does not exist (e.g. 2026-02-30). `time_out_of_range`: The requested start instant is outside the engine's high-accuracy span (≈1900–2100). `invalid_timezone`: The `timezone` value is not an IANA zone this runtime knows. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `incomplete_observer`: A solar_eclipse or lunar_eclipse was requested with only one of latitude and longitude. `body_required`: A body-relative event was requested without a target body. `body_not_supported`: The body has no such event — opposition for the Sun, Moon, Earth, or an inner planet; conjunction for the Sun, Moon, or Earth; max_elongation for anything but mercury or venus; perigee_apogee for the Sun. `invalid_time`: The `start` value is not a parseable ISO 8601 instant, or names a calendar date that does not exist (e.g. 2026-02-30). `time_out_of_range`: The requested start instant is outside the engine's high-accuracy span (≈1900–2100). `invalid_timezone`: The `timezone` value is not an IANA zone this runtime knows. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "observer_required",
        -  "body_required",
        -  "body_not_supported",
        -  "invalid_time",
        -  "time_out_of_range",
        -  "invalid_timezone"
        -]New value: +[
        +  "incomplete_observer",
        +  "body_required",
        +  "body_not_supported",
        +  "invalid_time",
        +  "time_out_of_range",
        +  "invalid_timezone"
        +]
      • addedOutput schema / properties / events / items / properties / contact_altitudes_degrees
        Added value: +{
        +  "additionalProperties": {
        +    "type": [
        +      "number",
        +      "null"
        +    ]
        +  },
        +  "description": "Apparent altitude in degrees of the eclipsed body (the Sun for solar_eclipse, the Moon for lunar_eclipse) above the observer's horizon at each contact, keyed by bare phase name: partial_begin, total_begin, peak, total_end, partial_end, plus penumbral_begin and penumbral_end for a lunar eclipse. Negative means below the horizon; null marks a phase this eclipse does not reach. Present only when latitude/longitude are supplied.",
        +  "propertyNames": {
        +    "type": "string"
        +  },
        +  "type": "object"
        +}
      • changedOutput schema / properties / events / items / properties / contacts / description
        Previous value: -"Eclipse contact times in ISO 8601 UTC keyed by phase (e.g. partial_begin_utc, peak_utc); a phase that does not occur is null."New value: +"Eclipse contact times in ISO 8601 UTC keyed by phase (e.g. partial_begin_utc, peak_utc); a phase that does not occur is null. A global solar eclipse carries peak_utc only."
      • changedOutput schema / properties / events / items / properties / local_visible / description
        Previous value: -"True when the eclipsed Sun is above the observer's horizon at peak. Present for solar eclipses only — lunar eclipses are geocentric and report no local visibility."New value: +"True when the eclipsed body — the Sun for solar_eclipse, the Moon for lunar_eclipse — is above the observer's horizon at any contact. Present only when latitude/longitude are supplied. A solar result with an observer is always true, because the local search returns only eclipses with the Sun up at first or last contact; contact_altitudes_degrees tells an eclipse at sunrise or sunset from one at midday."
      • addedOutput schema / properties / events / items / properties / peak_latitude_degrees
        Added value: +{
        +  "description": "Geographic latitude in degrees where a total or annular solar eclipse is greatest. Present for a solar_eclipse searched without an observer; absent for a partial eclipse, whose shadow axis misses Earth.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / events / items / properties / peak_longitude_degrees
        Added value: +{
        +  "description": "Geographic longitude in degrees where a total or annular solar eclipse is greatest. Present for a solar_eclipse searched without an observer; absent for a partial eclipse.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Why the list is shorter than the requested count: the search reached the end of the supported span (2100). Absent when every requested occurrence came back.",
        +  "type": "string"
        +}
  5. 5 tool updates
    • Changedastronomy_find_events4 fields changed
      • removedOutput schema / properties / events / items / properties / contacts / additionalProperties / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / events / items / properties / contacts / additionalProperties / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / events / items / properties / obscuration / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / events / items / properties / obscuration / type
        Added value: +[
        +  "number",
        +  "null"
        +]
    • Changedastronomy_get_ephemeris2 fields changed
      • removedOutput schema / properties / points / items / properties / magnitude / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / points / items / properties / magnitude / type
        Added value: +[
        +  "number",
        +  "null"
        +]
    • Changedastronomy_get_rise_set32 fields changed
      • removedOutput schema / properties / events / items / properties / rise_utc / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / events / items / properties / rise_utc / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / events / items / properties / set_utc / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / events / items / properties / set_utc / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / events / items / properties / transit_altitude_degrees / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / events / items / properties / transit_altitude_degrees / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / events / items / properties / transit_utc / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / events / items / properties / transit_utc / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / events / items / properties / twilight / properties / astronomical / properties / dawn_local / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / events / items / properties / twilight / properties / astronomical / properties / dawn_local / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / events / items / properties / twilight / properties / astronomical / properties / dawn_utc / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / events / items / properties / twilight / properties / astronomical / properties / dawn_utc / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / events / items / properties / twilight / properties / astronomical / properties / dusk_local / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / events / items / properties / twilight / properties / astronomical / properties / dusk_local / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / events / items / properties / twilight / properties / astronomical / properties / dusk_utc / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / events / items / properties / twilight / properties / astronomical / properties / dusk_utc / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / events / items / properties / twilight / properties / civil / properties / dawn_local / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / events / items / properties / twilight / properties / civil / properties / dawn_local / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / events / items / properties / twilight / properties / civil / properties / dawn_utc / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / events / items / properties / twilight / properties / civil / properties / dawn_utc / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / events / items / properties / twilight / properties / civil / properties / dusk_local / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / events / items / properties / twilight / properties / civil / properties / dusk_local / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / events / items / properties / twilight / properties / civil / properties / dusk_utc / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / events / items / properties / twilight / properties / civil / properties / dusk_utc / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / events / items / properties / twilight / properties / nautical / properties / dawn_local / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / events / items / properties / twilight / properties / nautical / properties / dawn_local / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / events / items / properties / twilight / properties / nautical / properties / dawn_utc / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / events / items / properties / twilight / properties / nautical / properties / dawn_utc / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / events / items / properties / twilight / properties / nautical / properties / dusk_local / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / events / items / properties / twilight / properties / nautical / properties / dusk_local / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / events / items / properties / twilight / properties / nautical / properties / dusk_utc / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / events / items / properties / twilight / properties / nautical / properties / dusk_utc / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedastronomy_get_sky_position8 fields changed
      • removedOutput schema / properties / angular_diameter_arcsec / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / angular_diameter_arcsec / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / illuminated_fraction / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / illuminated_fraction / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / magnitude / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / magnitude / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / phase_angle_degrees / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / phase_angle_degrees / type
        Added value: +[
        +  "number",
        +  "null"
        +]
    • Changedastronomy_list_visible8 fields changed
      • removedOutput schema / properties / bodies / items / properties / angular_diameter_arcsec / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / bodies / items / properties / angular_diameter_arcsec / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / bodies / items / properties / illuminated_fraction / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / bodies / items / properties / illuminated_fraction / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / bodies / items / properties / magnitude / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / bodies / items / properties / magnitude / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / bodies / items / properties / phase_angle_degrees / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / bodies / items / properties / phase_angle_degrees / type
        Added value: +[
        +  "number",
        +  "null"
        +]
  6. 7 tool updates
    • Changedastronomy_find_events6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "events",
        +      "totalCount"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `observer_required`: A solar_eclipse event was requested without observer latitude/longitude. `body_required`: A body-relative event was requested without a target body. `body_not_supported`: The body has no such event — opposition for the Sun, Moon, Earth, or an inner planet; conjunction for the Sun, Moon, or Earth; max_elongation for anything but mercury or venus; perigee_apogee for the Sun. `invalid_time`: The `start` value is not a parseable ISO 8601 instant, or names a calendar date that does not exist (e.g. 2026-02-30). `time_out_of_range`: The requested start instant is outside the engine's high-accuracy span (≈1900–2100). `invalid_timezone`: The `timezone` value is not an IANA zone this runtime knows. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "observer_required",
        +            "body_required",
        +            "body_not_supported",
        +            "invalid_time",
        +            "time_out_of_range",
        +            "invalid_timezone"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "events",
        -  "totalCount"
        -]
    • Changedastronomy_get_ephemeris6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "designation",
        +      "points",
        +      "truncated",
        +      "shown",
        +      "cap"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `invalid_time`: The start or stop timestamp is not a parseable ISO 8601 instant, or names a calendar date that does not exist (e.g. 2026-02-30). `invalid_time_range`: The resolved stop instant is at or before the resolved start instant. `incomplete_observer`: Exactly one of latitude and longitude was supplied. `invalid_step`: The step is not a positive count followed by a unit of m, h, d, mo, or y. `body_not_found`: JPL Horizons has no match for the designation, or the designation is ambiguous (a bare comet name matches multiple apparition records). `horizons_unavailable`: The JPL Horizons API failed after retries. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "invalid_time",
        +            "invalid_time_range",
        +            "incomplete_observer",
        +            "invalid_step",
        +            "body_not_found",
        +            "horizons_unavailable"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "designation",
        -  "points",
        -  "truncated",
        -  "shown",
        -  "cap"
        -]
    • Changedastronomy_get_moon_phase6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "time_utc",
        +      "phase_angle_degrees",
        +      "illuminated_fraction",
        +      "phase_name",
        +      "age_days",
        +      "next_quarters"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `invalid_time`: The `time` value is not a parseable ISO 8601 instant, or names a calendar date that does not exist (e.g. 2026-02-30). `time_out_of_range`: The requested instant is outside the engine's high-accuracy span (≈1900–2100). `invalid_timezone`: The `timezone` value is not an IANA zone this runtime knows. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "invalid_time",
        +            "time_out_of_range",
        +            "invalid_timezone"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "time_utc",
        -  "phase_angle_degrees",
        -  "illuminated_fraction",
        -  "phase_name",
        -  "age_days",
        -  "next_quarters"
        -]
    • Changedastronomy_get_rise_set6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "body",
        +      "events",
        +      "totalCount"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `invalid_time`: The `start` value is not a parseable ISO 8601 instant, or names a calendar date that does not exist (e.g. 2026-02-30). `time_out_of_range`: The requested start instant is outside the engine's high-accuracy span (≈1900–2100). `invalid_timezone`: The `timezone` value is not an IANA zone this runtime knows. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "invalid_time",
        +            "time_out_of_range",
        +            "invalid_timezone"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "body",
        -  "events",
        -  "totalCount"
        -]
    • Changedastronomy_get_satellite_passes6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "norad_id",
        +      "passes",
        +      "totalCount"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `invalid_time`: The start timestamp is not a parseable ISO 8601 instant, or names a calendar date that does not exist (e.g. 2026-02-30). `time_out_of_range`: The start instant is outside the SGP4 high-accuracy span (≈1900–2100), or more than about a month from the epoch of the current element set — checked on the epoch distance itself, since SGP4 keeps returning positions well past the point where the mean elements describe the orbit. `invalid_timezone`: The `timezone` value is not an IANA zone this runtime knows. `invalid_target`: Neither `norad_id` nor `name` was supplied, or both were. `tle_not_found`: CelesTrak has no current element set for the NORAD ID. `satellite_name_not_found`: No current CelesTrak object has a name containing the `name` value. `ambiguous_satellite_name`: The `name` value matches more than one current object and none of them carries it as their whole name. The error names the match count and lists the matching objects with their catalog numbers, capped when there are more than the list holds. A capped list carries a hint leading with narrowing instead of with the list, since the wanted object need not be among the ones shown. `object_decayed`: A current element set will not propagate to a window near its own epoch — the signature of an object that has reentered. `celestrak_unavailable`: The element-set fetch failed after retries, or returned a body that is not JSON at all. `malformed_element_set`: CelesTrak answered with parsable JSON whose GP record does not carry the fields an OMM element set requires — a permanent property of that record, not the transient outage celestrak_unavailable covers. The same request returns the same record, so retrying it can only fail again. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "invalid_time",
        +            "time_out_of_range",
        +            "invalid_timezone",
        +            "invalid_target",
        +            "tle_not_found",
        +            "satellite_name_not_found",
        +            "ambiguous_satellite_name",
        +            "object_decayed",
        +            "celestrak_unavailable",
        +            "malformed_element_set"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "norad_id",
        -  "passes",
        -  "totalCount"
        -]
    • Changedastronomy_get_sky_position6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "body",
        +      "time_utc",
        +      "equatorial",
        +      "horizontal",
        +      "ecliptic",
        +      "magnitude",
        +      "angular_diameter_arcsec",
        +      "phase_angle_degrees",
        +      "illuminated_fraction",
        +      "constellation"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `invalid_time`: The `time` value is not a parseable ISO 8601 instant, or names a calendar date that does not exist (e.g. 2026-02-30). `time_out_of_range`: The requested instant is outside the engine's high-accuracy span (≈1900–2100). `invalid_timezone`: The `timezone` value is not an IANA zone this runtime knows. `star_not_found`: The `star` name is not present in the bundled bright-star catalog. `body_required`: Neither a `body` nor a `star` was supplied. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "invalid_time",
        +            "time_out_of_range",
        +            "invalid_timezone",
        +            "star_not_found",
        +            "body_required"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "body",
        -  "time_utc",
        -  "equatorial",
        -  "horizontal",
        -  "ecliptic",
        -  "magnitude",
        -  "angular_diameter_arcsec",
        -  "phase_angle_degrees",
        -  "illuminated_fraction",
        -  "constellation"
        -]
    • Changedastronomy_list_visible6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "sky_condition",
        +      "sun_altitude_degrees",
        +      "total_count",
        +      "bodies"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `invalid_time`: The `time` value is not a parseable ISO 8601 instant, or names a calendar date that does not exist (e.g. 2026-02-30). `time_out_of_range`: The requested instant is outside the engine's high-accuracy span (≈1900–2100). `invalid_timezone`: The `timezone` value is not an IANA zone this runtime knows. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "invalid_time",
        +            "time_out_of_range",
        +            "invalid_timezone"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "sky_condition",
        -  "sun_altitude_degrees",
        -  "total_count",
        -  "bodies"
        -]
  7. 7 tool updates
    • Changedastronomy_find_events1 field changed
      • changedInput schema / properties / start / description
        Previous value: -"Search start as an ISO 8601 UTC string, e.g. \"2024-01-01T00:00:00Z\". Defaults to now."New value: +"Search start as an ISO 8601 UTC string, e.g. \"2024-01-01T00:00:00Z\". Defaults to now. A value with no zone designator is read as UTC, not the local zone of the server process."
    • Changedastronomy_get_ephemeris2 fields changed
      • changedInput schema / properties / start / description
        Previous value: -"Ephemeris start as an ISO 8601 UTC string, e.g. \"2024-01-01T00:00:00Z\". Defaults to now."New value: +"Ephemeris start as an ISO 8601 UTC string, e.g. \"2024-01-01T00:00:00Z\". Defaults to now. A value with no zone designator is read as UTC, not the local zone of the server process."
      • changedInput schema / properties / stop / description
        Previous value: -"Ephemeris stop as an ISO 8601 UTC string, and must be later than start. Defaults to 24 hours after start."New value: +"Ephemeris stop as an ISO 8601 UTC string, and must be later than start. Defaults to 24 hours after start. A value with no zone designator is read as UTC, not the local zone of the server process."
    • Changedastronomy_get_moon_phase1 field changed
      • changedInput schema / properties / time / description
        Previous value: -"Instant to evaluate as an ISO 8601 UTC string, e.g. \"2024-12-15T00:00:00Z\". Defaults to now."New value: +"Instant to evaluate as an ISO 8601 UTC string, e.g. \"2024-12-15T00:00:00Z\". Defaults to now. A value with no zone designator is read as UTC, not the local zone of the server process."
    • Changedastronomy_get_rise_set2 fields changed
      • changedInput schema / properties / start / description
        Previous value: -"Search start as an ISO 8601 UTC string, e.g. \"2024-06-21T00:00:00Z\". Defaults to now."New value: +"Search start as an ISO 8601 UTC string, e.g. \"2024-06-21T00:00:00Z\". Defaults to now. A value with no zone designator is read as UTC, not the local zone of the server process."
      • changedOutput schema / properties / events / items / properties / rise_utc / description
        Previous value: -"Rise time in ISO 8601 UTC, or null when the body does not rise in this cycle (e.g. circumpolar)."New value: +"Rise time in ISO 8601 UTC, or null when the body does not rise in this cycle — because it is circumpolar, or because it was already above the horizon at the search start, whose rise precedes the search. The accompanying note says which."
    • Changedastronomy_get_satellite_passes1 field changed
      • changedInput schema / properties / start / description
        Previous value: -"Search start as an ISO 8601 UTC string, within about a month of the current element set's epoch — for a tracked object that epoch is hours old, so in practice within about a month of today. A start further out is rejected rather than answered from elements that no longer describe the orbit. Defaults to now."New value: +"Search start as an ISO 8601 UTC string, within about a month of the current element set's epoch — for a tracked object that epoch is hours old, so in practice within about a month of today. A start further out is rejected rather than answered from elements that no longer describe the orbit. Defaults to now. A value with no zone designator is read as UTC, not the local zone of the server process."
    • Changedastronomy_get_sky_position2 fields changed
      • changedInput schema / properties / time / description
        Previous value: -"Instant of observation as an ISO 8601 UTC string, e.g. \"2024-04-08T18:00:00Z\". Defaults to now."New value: +"Instant of observation as an ISO 8601 UTC string, e.g. \"2024-04-08T18:00:00Z\". Defaults to now. A value with no zone designator is read as UTC, not the local zone of the server process."
      • addedOutput schema / properties / body_metadata
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "The body card also served at astronomy://body/{body}, copied here so a client without resource support can reach it. Present for the ten solar-system bodies; absent for a catalog star, which has no card.",
        +  "properties": {
        +    "mean_radius_km": {
        +      "description": "Mean radius in kilometers, from IAU/NASA fact sheets.",
        +      "type": "number"
        +    },
        +    "naked_eye": {
        +      "description": "True when the body is typically visible to the naked eye.",
        +      "type": "boolean"
        +    },
        +    "type": {
        +      "description": "Classification of the body.",
        +      "enum": [
        +        "star",
        +        "planet",
        +        "moon",
        +        "dwarf"
        +      ],
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "type",
        +    "mean_radius_km",
        +    "naked_eye"
        +  ],
        +  "type": "object"
        +}
    • Changedastronomy_list_visible1 field changed
      • changedInput schema / properties / time / description
        Previous value: -"Evaluation instant as an ISO 8601 UTC string, e.g. \"2024-08-12T05:00:00Z\". Defaults to now. A single instant, not a window."New value: +"Evaluation instant as an ISO 8601 UTC string, e.g. \"2024-08-12T05:00:00Z\". Defaults to now. A single instant, not a window. A value with no zone designator is read as UTC, not the local zone of the server process."
  8. 1 tool update
    • Changedastronomy_get_satellite_passes1 field changed
      • changedInput schema / properties / start / description
        Previous value: -"Search start as an ISO 8601 UTC string, within about a month of today — the current element set cannot be propagated further. Defaults to now."New value: +"Search start as an ISO 8601 UTC string, within about a month of the current element set's epoch — for a tracked object that epoch is hours old, so in practice within about a month of today. A start further out is rejected rather than answered from elements that no longer describe the orbit. Defaults to now."
  9. 1 tool update
    • Changedastronomy_get_satellite_passes6 fields changed
      • addedInput schema / oneOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "name"
        +      ]
        +    },
        +    "required": [
        +      "norad_id"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "not": {
        +      "required": [
        +        "norad_id"
        +      ]
        +    },
        +    "required": [
        +      "name"
        +    ],
        +    "type": "object"
        +  }
        +]
      • addedInput schema / properties / name
        Added value: +{
        +  "description": "Satellite name to resolve against CelesTrak, e.g. \"ISS (ZARYA)\". Matched as a case-insensitive substring of the catalog name, so give the fullest name you have — a short one matches many objects and is rejected as ambiguous. Mutually exclusive with `norad_id` — supply exactly one.",
        +  "type": "string"
        +}
      • changedInput schema / properties / norad_id / description
        Previous value: -"NORAD catalog number of the satellite, e.g. 25544 for the ISS. Found at celestrak.org or heavens-above.com."New value: +"NORAD catalog number of the satellite, e.g. 25544 for the ISS. Found at celestrak.org or heavens-above.com. Mutually exclusive with `name` — supply exactly one."
      • changedInput schema / required
        Previous value: -[
        -  "norad_id",
        -  "latitude",
        -  "longitude"
        -]New value: +[
        +  "latitude",
        +  "longitude"
        +]
      • addedOutput schema / properties / resolved_from_name
        Added value: +{
        +  "description": "The name query that resolved this object. Present only when the request supplied `name` rather than `norad_id`.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / satellite_name / description
        Previous value: -"Satellite name from the TLE header, when present."New value: +"Satellite name as CelesTrak catalogs it (the element set's OBJECT_NAME)."
  10. 7 tool updates
    • First observedastronomy_find_events
    • First observedastronomy_get_ephemeris
    • First observedastronomy_get_moon_phase
    • First observedastronomy_get_rise_set
    • First observedastronomy_get_satellite_passes
    • First observedastronomy_get_sky_position
    • First observedastronomy_list_visible

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    F
    maintenance
    Provides authoritative astronomical data including moon phases, solar eclipses, and sun/moon rise and set times using the US Navy API or offline Skyfield calculations. It enables users to query Earth's seasons and celestial events for any location and date.
    8
    1
    Apache 2.0
  • A
    license
    Not graded
    quality
    B
    maintenance
    Provides solar eclipse predictions, local eclipse circumstances, Moon phases, and seasons from the US Naval Observatory's Astronomical Applications API.
    8 npm
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Enables users and language models to compute Western tropical astrology data offline, including natal charts, transits, synastry, Mercury retrograde periods, annual profections, and moon phases, with deterministic structured output.
    6
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.