Skip to main content
Glama

astronomy-mcp-server: list visible bodies

astronomy_list_visible
Read-onlyIdempotent

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.

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "latitude": "<latitude>",
      "longitude": "<longitude>"
    },
    "name": "astronomy_list_visible"
  }
}

Input 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

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

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • 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\". 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."New value: +"Server-computed one-line headline from real values, e.g. \"Venus, mag -4.1, 12° above the W 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."
  2. Changed3 schema 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. Changed8 schema 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"
      +]
  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": [
      +      "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"
      -]
  5. Changed1 schema 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."
  6. First observed

TDQS

A4.1/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and openWorldHint=false, so the safety and side-effect profile is covered. The description adds genuine behavioral context beyond that: ranking order, the Sun-altitude gating into daylight/civil/nautical/twilight/dark, per-body visibility notes, and angular distance from the Sun. However, it does not mention result size, ordering ties, or failure modes for invalid coordinates.

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?

Front-loaded with the core answer ('one-call what is up right now answer') and then the pipeline in execution order. It is dense and long, but each clause carries operational information; only the repeated time/twilight framing is slightly redundant.

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

Completeness4/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 covers the workflow (coordinate resolution upstream, choosing an instant, gating the sky). What is missing is any note on result size or handling of edge cases such as polar latitudes where no astronomical darkness occurs.

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 coverage is 100%, so every parameter is already documented in structured form. The description reinforces the semantics of `time` (single instant, use rise-set to pick a value) and `min_altitude` (skip grazing objects) and explains why a timezone matters, but adds little syntax or meaning the schema does not already carry. Baseline 3 is appropriate.

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 capability with a precise verb chain: iterate naked-eye solar-system bodies (plus bundled bright stars with include_stars), compute altitude/azimuth, filter to above-horizon, rank brightest-and-highest, attach visibility notes. This is clearly differentiated from siblings like astronomy_get_sky_position (single body) and astronomy_get_rise_set (time windows), which the description implicitly references.

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

Usage Guidelines5/5

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

Explicitly says `time` is a single evaluation instant, not a window, and routes the agent to astronomy_get_rise_set on the sun to find astronomical dusk for a 'tonight' query. Also states the server does not geocode, so coordinates must be resolved upstream, and explains when to raise min_altitude.

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.