Skip to main content
Glama

astronomy-mcp-server: find sky events

astronomy_find_events
Read-onlyIdempotent

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.

Input Schema

TableJSON 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

TableJSON Schema
NameRequiredDescriptionDefault
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.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed14 schema 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"
      +}
  2. Changed10 schema 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"
      +}
  3. Changed4 schema 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"
      +]
  4. Changed6 schema 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"
      -]
  5. Changed1 schema 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."
  6. First observed

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.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.