Skip to main content
Glama
IBM

chuk-mcp-celestial

by IBM

chuk-mcp-celestial

Python 3.11+

Astronomical & Celestial Data MCP Server

An MCP (Model Context Protocol) server providing moon phases, sun/moon rise/set times, solar eclipse predictions, Earth's seasons, planetary positions/events, and all-sky summaries from the US Navy Astronomical Applications Department API and local Skyfield calculations.

This is a demonstration project provided as-is for learning and testing purposes.

🌐 Try it now - Hosted version available! - No installation required.

Features

🌙 Comprehensive Celestial Data:

  • Moon phases with exact timing (New Moon, First Quarter, Full Moon, Last Quarter)

  • Sun and moon rise/set/transit times for any location

  • Solar eclipse predictions with local circumstances

  • Earth's seasons (equinoxes, solstices, perihelion, aphelion)

  • Planetary positions (altitude, azimuth, distance, magnitude, constellation, RA/Dec, elongation, visibility)

  • Planetary events (rise, set, transit times)

Flexible Providers:

  • Navy API - Authoritative US Navy data, all features

  • Skyfield - 28x faster, offline calculations, research-grade accuracy (included by default)

  • Hybrid mode - Mix providers per-tool (e.g., Skyfield for moon phases, Navy for eclipses)

  • S3 storage - Cloud-based ephemeris storage via chuk-virtual-fs

  • Artifact storage - Computation results persisted via chuk-artifacts (S3, filesystem, memory)

  • GeoJSON output - Location-based responses follow GeoJSON Feature spec

🔒 Type-Safe & Robust:

  • Pydantic v2 models for all responses - no dictionary goop!

  • Enums for all constants - no magic strings!

  • Full async/await support with httpx

  • Comprehensive error handling

🔗 Multi-Server Integration:

  • Works seamlessly with time and weather servers

  • Combine celestial + time + weather for comprehensive astronomical intelligence

  • Answer complex questions like "Will the moon be visible tonight with current weather?"

Quality Assured:

  • 70%+ test coverage with pytest

  • GitHub Actions CI/CD

  • Automated releases to PyPI

  • Type checking with mypy

  • Code quality with ruff

Related MCP server: astronomy-mcp-server

Installation

Comparison of Installation Methods

Method

Setup Time

Requires Internet

Updates

Best For

Hosted

Instant

Yes

Automatic

Quick testing, production use

uvx

Instant

Yes (first run)

Automatic

No local install, always latest

Local

1-2 min

Only for install

Manual

Offline use, custom deployments

No installation needed! Use our public hosted version:

{
  "mcpServers": {
    "celestial": {
      "url": "https://celestial.chukai.io/mcp"
    }
  }
}

Option 2: Install via uvx (No Installation Required)

Run directly without installing:

{
  "mcpServers": {
    "celestial": {
      "command": "uvx",
      "args": ["chuk-mcp-celestial"]
    }
  }
}

Option 3: Install Locally

# With pip
pip install chuk-mcp-celestial

# Or with uv (recommended)
uv pip install chuk-mcp-celestial

# Or with pipx (isolated installation)
pipx install chuk-mcp-celestial

Skyfield and NumPy are included by default — all 7 tools work out of the box.

With S3 artifact storage (optional):

pip install "chuk-mcp-celestial[s3]"

Then configure in your MCP client:

{
  "mcpServers": {
    "celestial": {
      "command": "chuk-mcp-celestial"
    }
  }
}

Optional: Configure hybrid provider mode (create celestial.yaml):

# Use Skyfield for fast queries, Navy API for everything else
default_provider: navy_api
providers:
  moon_phases: skyfield     # 28x faster
  earth_seasons: skyfield   # 33x faster

Quick Start

Install

# No installation required (runs directly)
uvx chuk-mcp-celestial

# Or install from PyPI
uv pip install chuk-mcp-celestial

# Or install from source with dev tools
git clone https://github.com/chuk-ai/chuk-mcp-celestial.git
cd chuk-mcp-celestial
uv pip install -e ".[dev]"

Claude Desktop Configuration

{
  "mcpServers": {
    "celestial": {
      "url": "https://celestial.chukai.io/mcp"
    }
  }
}

Or run locally:

{
  "mcpServers": {
    "celestial": {
      "command": "uvx",
      "args": ["chuk-mcp-celestial"]
    }
  }
}

Run

# STDIO mode (Claude Desktop, mcp-cli)
chuk-mcp-celestial stdio

# HTTP mode (API access)
chuk-mcp-celestial http --port 8080

Supported Providers

Provider

Speed

Offline

Features

Navy API (default)

~700ms

No

Moon, sun/moon, eclipses, seasons. Official US government source.

Skyfield

~25ms

Yes

Moon phases, seasons, planet position, planet events. JPL ephemeris.

Both providers are included by default — no extras needed.

Tools

Moon Phases (1 tool)

Tool

Description

get_moon_phases

Upcoming moon phases with exact timing (UT1)

Sun & Moon (1 tool)

Tool

Description

get_sun_moon_data

Rise/set/transit times, twilight, moon phase, illumination for a location

Solar Eclipses (2 tools)

Tool

Description

get_solar_eclipse_by_date

Local eclipse circumstances (type, magnitude, obscuration, timing)

get_solar_eclipses_by_year

All solar eclipses in a year

Earth Seasons (1 tool)

Tool

Description

get_earth_seasons

Equinoxes, solstices, perihelion, aphelion for a year

Planets (2 tools)

Tool

Description

get_planet_position

Altitude, azimuth, distance, magnitude, constellation, RA/Dec, elongation, visibility

get_planet_events

Rise, set, and transit times for a planet on a given date

Supported: Mercury, Venus, Mars, Jupiter, Saturn, Uranus, Neptune, Pluto

Sky Summary (1 tool)

Tool

Description

get_sky

All-sky summary: every planet's position, moon phase, darkness check — one call

Environment Variables

Variable

Required

Default

Description

CELESTIAL_PROVIDER

No

navy_api

Default provider

CELESTIAL_MOON_PHASES_PROVIDER

No

default

Provider for moon phases

CELESTIAL_EARTH_SEASONS_PROVIDER

No

default

Provider for Earth seasons

CELESTIAL_PLANET_POSITION_PROVIDER

No

skyfield

Provider for planet position

CELESTIAL_PLANET_EVENTS_PROVIDER

No

skyfield

Provider for planet events

CELESTIAL_SKY_PROVIDER

No

skyfield

Provider for sky summary

CELESTIAL_CONFIG_PATH

No

Path to celestial.yaml

SKYFIELD_STORAGE_BACKEND

No

s3

Ephemeris storage: local, s3, memory

SKYFIELD_S3_BUCKET

No

chuk-celestial-ephemeris

S3 bucket for ephemeris

NAVY_API_TIMEOUT

No

30.0

Request timeout (seconds)

Hybrid Provider Mode

Create celestial.yaml to mix providers per-tool:

default_provider: navy_api
providers:
  moon_phases: skyfield      # 28x faster, offline
  earth_seasons: skyfield    # 33x faster, offline
  sun_moon_data: navy_api    # Full features
  solar_eclipse_date: navy_api
  solar_eclipse_year: navy_api
  planet_position: skyfield     # Only provider with planet support
  planet_events: skyfield
  sky: skyfield                # All-sky summary

Development

# Install with dev dependencies
uv pip install -e ".[dev]"

# Run tests
make test

# Run tests with coverage
make test-cov

# Lint and format
make lint
make format

# All checks
make check

Deployment

Hosted Version

No installation required:

{
  "mcpServers": {
    "celestial": {
      "url": "https://celestial.chukai.io/mcp"
    }
  }
}

Docker

make docker-build
make docker-run

Fly.io

fly launch
fly secrets set AWS_ACCESS_KEY_ID=your_key AWS_SECRET_ACCESS_KEY=your_secret
make fly-deploy

Cross-Server Workflows

chuk-mcp-celestial integrates with the broader chuk MCP ecosystem:

  • Celestial + Time — Timezone-aware astronomy (sunrise in local time, time until next event)

  • Celestial + Weather — Observation planning (moon phase + cloud cover forecast)

  • Celestial + Tides — Coastal photography (golden hour + tide level)

  • Celestial + Weather — Eclipse viewing (eclipse visibility + weather forecast)

{
  "mcpServers": {
    "celestial": { "url": "https://celestial.chukai.io/mcp" },
    "time": { "url": "https://time.chukai.io/mcp" },
    "weather": { "url": "https://weather.chukai.io/mcp" }
  }
}

License

Apache License 2.0 - See LICENSE for details.

Credits

Available Tools

8 tools
get_earth_seasonsA

Get Earth's seasons and orbital events for a year.

Returns dates and times for equinoxes (equal day/night), solstices (longest/shortest days), and Earth's perihelion (closest to sun) and aphelion (farthest from sun).

Args: year: Year to query (1700-2100) timezone: Timezone offset from UTC in hours. If not provided, UTC (0) is used. dst: Whether to apply daylight saving time adjustment.

Returns: SeasonsResponse with equinoxes, solstices, perihelion, and aphelion.

Tips for LLMs: - Typically 6 events per year (2 equinoxes, 2 solstices, perihelion, aphelion) - Seasons are opposite in Northern and Southern hemispheres - Earth's 23.5 degree axial tilt causes seasons, not distance from sun

Example: seasons = await get_earth_seasons(2024) for event in seasons.data: print(f"{event.phenom}: {event.month}/{event.day}/{event.year} at {event.time}")

ParametersJSON Schema
NameRequiredDescriptionDefault
yearYes
timezoneNo
dstNo

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It effectively describes what the tool returns (dates and times for specific astronomical events), includes practical tips about event frequency and hemispheric differences, and provides an example of usage and output format. However, it doesn't mention potential limitations like computational constraints or error conditions.

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 well-structured with clear sections (purpose, returns, args, tips, example) and front-loaded with the core functionality. While comprehensive, some information in the 'Tips for LLMs' section (like the explanation of axial tilt) could be considered slightly beyond what's strictly necessary for tool invocation.

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?

Given the complexity (astronomical calculations with 3 parameters) and no annotations or output schema, the description provides substantial context including parameter details, return value explanation, usage tips, and an example. However, without an output schema, the description doesn't fully document the SeasonsResponse structure beyond listing its components.

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

Parameters5/5

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

With 0% schema description coverage, the description fully compensates by providing detailed parameter documentation in the 'Args' section. It explains each parameter's purpose (year to query, timezone offset, DST adjustment), provides value ranges (1700-2100 for year), and default behavior (UTC if timezone not provided). This adds significant meaning beyond the bare schema.

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 clearly states the tool's purpose: 'Get Earth's seasons and orbital events for a year' with specific resources (equinoxes, solstices, perihelion, aphelion). It distinguishes from siblings like get_moon_phases or get_planet_events by focusing exclusively on Earth's seasonal and orbital 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?

The description provides clear context for when to use this tool (for Earth's seasons and orbital events), but doesn't explicitly state when not to use it or name specific alternatives among siblings. The 'Tips for LLMs' section implies usage scenarios but doesn't provide explicit exclusion criteria.

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

get_moon_phasesA

Get upcoming moon phases starting from a given date.

Returns the next N moon phase occurrences (New Moon, First Quarter, Full Moon, Last Quarter) with exact times. Useful for planning astronomical observations, photography, or understanding lunar cycles.

Args: date: Start date in YYYY-MM-DD format. No leading zeros required (e.g., "2024-1-5" is valid). Valid range: 1700-01-01 to 2100-12-31 num_phases: Number of phases to return (1-99). Default is 12 (about 3 months of phases). Each lunar cycle has 4 phases, so 12 phases = 3 complete cycles.

Returns: MoonPhasesResponse: Contains: - phasedata: List of phase occurrences with exact dates and times - Each phase includes: phase name, year, month, day, time (in UT1)

Tips for LLMs: - All times are in Universal Time (UT1), not local time - A complete lunar cycle is about 29.5 days (4 phases) - Use num_phases=4 for the next month, 12 for next quarter, 48 for next year - Moon phases are useful for: astronomy, photography (full moon lighting), fishing/hunting (activity patterns), gardening (traditional planting cycles)

Example: # Get next 12 moon phases starting from May 3, 2009 phases = await get_moon_phases("2009-5-3", num_phases=12) for phase in phases.phasedata: print(f"{phase.phase} on {phase.year}-{phase.month}-{phase.day} at {phase.time} UT")

ParametersJSON Schema
NameRequiredDescriptionDefault
dateYes
num_phasesNo

TDQS

A4.8/5.0
Behavior4/5

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

With no annotations provided, the description carries full burden and does an excellent job disclosing behavioral traits. It explains the return format (MoonPhasesResponse with phasedata list), time format (UT1, not local time), lunar cycle duration (29.5 days), and practical applications. The only minor gap is it doesn't mention error handling or rate limits, but otherwise provides comprehensive behavioral context.

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 well-structured and appropriately sized. It starts with the core purpose, then provides usage context, followed by detailed parameter documentation, return format, practical tips, and a complete example. Every section adds value with zero redundant information, and the information is front-loaded with the most important details first.

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 (2 parameters, no output schema, no annotations), the description provides complete context. It covers purpose, usage guidelines, parameter details, return format, time zone considerations, lunar cycle context, practical applications, and includes a working example. No additional information is needed for effective tool use.

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

Parameters5/5

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

With 0% schema description coverage, the description fully compensates by providing detailed parameter semantics. It explains the date format (YYYY-MM-DD, no leading zeros required), valid range (1700-01-01 to 2100-12-31), num_phases range (1-99), default value (12), and relationship to lunar cycles (12 phases = 3 complete cycles, each cycle has 4 phases). This adds significant value beyond the bare schema.

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 clearly states the tool's purpose: 'Get upcoming moon phases starting from a given date' with specific details about what it returns (next N moon phase occurrences with exact times). It distinguishes from siblings by focusing specifically on moon phases rather than earth seasons, planet events, solar eclipses, or general sky/sun-moon data.

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?

The description provides explicit guidance on when to use this tool: 'Useful for planning astronomical observations, photography, or understanding lunar cycles.' It also includes a 'Tips for LLMs' section with specific use cases (astronomy, photography, fishing/hunting, gardening) and alternative parameter values for different timeframes (num_phases=4 for next month, 12 for next quarter, 48 for next year).

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

get_planet_eventsA

Get rise, set, and transit times for a planet on a given day at a location.

Returns the times a planet rises above the horizon, transits the meridian (highest point), and sets below the horizon. Essential for planning when to observe a planet.

Args: planet: Planet name. One of: Mercury, Venus, Mars, Jupiter, Saturn, Uranus, Neptune, Pluto date: Date in YYYY-MM-DD format (e.g., "2025-6-15") latitude: Observer's latitude in decimal degrees (-90 to 90) longitude: Observer's longitude in decimal degrees (-180 to 180) timezone: Timezone offset from UTC in hours (e.g., -8 for PST). When provided, event times are in local time. dst: Whether to apply daylight saving time adjustment.

Returns: PlanetEventsResponse: GeoJSON Feature containing: - geometry: Observer location - properties.data: - planet: Planet name - date: Query date - events: List of rise/set/transit events with times - constellation: Current constellation - magnitude: Apparent visual magnitude - artifact_ref: Reference to stored computation (if artifact store configured)

Tips for LLMs: - Events may be empty if the planet doesn't rise/set that day (polar regions) - Transit time is when the planet is highest — best viewing time - Use with get_planet_position to get full details at a specific time - Outer planets (Jupiter, Saturn) are above the horizon for ~12 hours - Inner planets (Mercury, Venus) are only visible near sunrise or sunset

Example: events = await get_planet_events( planet="Jupiter", date="2025-6-15", latitude=51.5, longitude=-0.1, timezone=1 ) for event in events.properties.data.events: print(f"Jupiter {event.phen} at {event.time}")

ParametersJSON Schema
NameRequiredDescriptionDefault
planetYes
dateYes
latitudeYes
longitudeYes
timezoneNo
dstNo

TDQS

A4.7/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It does an excellent job describing what the tool returns (GeoJSON Feature with specific properties), edge cases ('Events may be empty if the planet doesn't rise/set that day'), and practical implications ('Transit time is when the planet is highest — best viewing time'). It also mentions artifact storage behavior when configured.

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 well-structured with clear sections (purpose, args, returns, tips, example) and front-loaded with the core functionality. While comprehensive, every sentence earns its place by providing essential information. The example is particularly helpful for understanding usage patterns.

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 (6 parameters, astronomical calculations) and lack of both annotations and output schema, the description provides complete context. It explains what the tool does, how to use it, what parameters mean, what to expect in return, edge cases, and relationships to sibling tools. The return value documentation effectively substitutes for a missing output schema.

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

Parameters5/5

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

With 0% schema description coverage, the description fully compensates by providing comprehensive parameter documentation. Each of the 6 parameters is clearly explained with examples, valid values, ranges, and practical meaning. The description adds significant value beyond what the bare schema provides, including enumerated planet names, date format examples, coordinate ranges, and timezone usage details.

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 clearly states the tool's purpose with specific verbs ('Get rise, set, and transit times') and resources ('for a planet on a given day at a location'). It distinguishes from siblings by focusing specifically on planetary events rather than seasons, moon phases, positions, or other astronomical data.

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?

The description provides explicit guidance on when to use this tool versus alternatives: 'Use with get_planet_position to get full details at a specific time' directly names a sibling tool for complementary use. The 'Tips for LLMs' section offers additional context about when events might be empty and viewing characteristics of different planet types.

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

get_planet_positionA

Get position and observational data for a planet at a specific time and location.

Returns altitude, azimuth, distance, phase illumination, apparent magnitude, constellation, equatorial coordinates (RA/Dec), elongation from the sun, and visibility status. Essential for planning astronomical observations and answering "where is [planet] tonight?" questions.

Args: planet: Planet name. One of: Mercury, Venus, Mars, Jupiter, Saturn, Uranus, Neptune, Pluto date: Date in YYYY-MM-DD format (e.g., "2025-6-15") time: Time in HH:MM format, 24-hour (e.g., "22:30"). Interpreted as UTC unless timezone is specified. latitude: Observer's latitude in decimal degrees (-90 to 90) longitude: Observer's longitude in decimal degrees (-180 to 180) timezone: Timezone offset from UTC in hours (e.g., -8 for PST, 1 for CET). When provided, the time parameter is interpreted as local time.

Returns: PlanetPositionResponse: GeoJSON Feature containing: - geometry: Observer location - properties.data: Planet position data: - altitude: Degrees above horizon (negative = below horizon) - azimuth: Degrees clockwise from north (0=N, 90=E, 180=S, 270=W) - distance_au / distance_km: Distance from observer - illumination: Phase illumination percentage (0-100) - magnitude: Apparent visual magnitude (lower = brighter) - constellation: IAU constellation abbreviation - right_ascension / declination: Equatorial coordinates (J2000) - elongation: Angular distance from sun in degrees - visibility: "visible", "below_horizon", or "lost_in_sunlight" - artifact_ref: Reference to stored computation (if artifact store configured)

Tips for LLMs: - Lower magnitude = brighter. Venus can reach -4.4, Jupiter -2.7 - Elongation < 10-15 degrees means planet is too close to the sun to see - altitude > 0 means the planet is above the horizon - azimuth tells you where to look: 0=North, 90=East, 180=South, 270=West - For "where is Mars tonight?", use time="21:00" with appropriate timezone - Mercury is hardest to see (small elongation), Venus and Jupiter are easiest

Example: pos = await get_planet_position( planet="Mars", date="2025-6-15", time="22:00", latitude=47.6, longitude=-122.3, timezone=-7 ) data = pos.properties.data if data.visibility == "visible": print(f"Mars is at {data.altitude}° altitude, {data.azimuth}° azimuth") print(f"Magnitude: {data.magnitude}, in {data.constellation}")

ParametersJSON Schema
NameRequiredDescriptionDefault
planetYes
dateYes
timeYes
latitudeYes
longitudeYes
timezoneNo

TDQS

A4.7/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It does an excellent job describing what the tool returns (altitude, azimuth, distance, etc.), interpretation of values (e.g., 'altitude > 0 means the planet is above the horizon'), and practical constraints ('Elongation < 10-15 degrees means planet is too close to the sun to see'). However, it doesn't mention potential limitations like computational complexity, error conditions, or rate limits, keeping it from a perfect score.

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 well-structured with clear sections (purpose, returns, args, tips, example) and every sentence adds value. However, at approximately 400 words, it's quite lengthy for a tool description. While all content is useful, some information in the 'Tips for LLMs' section could potentially be streamlined or moved to documentation, preventing a perfect score for conciseness.

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 (6 parameters, astronomical calculations), no annotations, and no output schema, the description provides exceptional completeness. It explains what the tool does, when to use it, all parameter details, return data structure with field explanations, practical examples, and interpretation guidance. The example shows exactly how to invoke the tool and use the results, making this description self-contained and comprehensive.

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

Parameters5/5

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

With 0% schema description coverage, the description fully compensates by providing comprehensive parameter semantics. Each of the 6 parameters is clearly explained with examples, valid ranges, and interpretation rules (e.g., 'timezone: Timezone offset from UTC in hours... When provided, the time parameter is interpreted as local time'). The planet parameter even lists all valid values (Mercury through Pluto), and date/time formats are specified with examples.

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 clearly states the tool's purpose: 'Get position and observational data for a planet at a specific time and location.' It specifies the verb ('Get'), resource ('position and observational data for a planet'), and scope ('at a specific time and location'), distinguishing it from sibling tools like get_earth_seasons or get_moon_phases. The detailed return data list further clarifies the exact information provided.

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?

The description provides explicit usage guidance with named alternatives and specific contexts. It states: 'Essential for planning astronomical observations and answering "where is [planet] tonight?" questions,' and includes practical tips like 'For "where is Mars tonight?", use time="21:00" with appropriate timezone.' This clearly indicates when to use this tool versus other astronomical tools in the sibling set.

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

get_skyA

Get a complete sky summary — all planets, moon phase, and darkness — in one call.

Returns which planets are visible, their positions and brightness, the current moon phase, and whether the sky is dark enough for observation. This is the recommended tool for "what's in the sky tonight?" questions.

Args: date: Date in YYYY-MM-DD format (e.g., "2026-2-10") time: Time in HH:MM format, 24-hour (e.g., "21:00"). UTC unless timezone specified. latitude: Observer's latitude in decimal degrees (-90 to 90) longitude: Observer's longitude in decimal degrees (-180 to 180) timezone: Timezone offset from UTC in hours (e.g., 0 for GMT, -5 for EST, 1 for CET). When provided, the time parameter is interpreted as local time.

Returns: SkyResponse: GeoJSON Feature containing: - properties.data.visible_planets: Planets above horizon and not lost in sunlight, sorted brightest first. Each has altitude, azimuth, direction, magnitude, constellation, and visibility status. - properties.data.all_planets: All 8 planets regardless of visibility - properties.data.moon: Current phase and illumination percentage - properties.data.is_dark: True if sun is below -6 degrees (civil twilight) - properties.data.summary: One-line text summary for quick display

Tips for LLMs: - Use this instead of calling get_planet_position 8 times - The summary field gives a quick human-readable answer - visible_planets are sorted brightest first (lowest magnitude) - direction field gives compass bearing: "S" = look south, "NE" = northeast - is_dark=False means it's daytime or twilight — planets may not be visible even if above horizon - Combine with weather forecast to check if skies are clear enough to observe

Example: sky = await get_sky( date="2026-2-10", time="21:00", latitude=51.99, longitude=0.84, timezone=0 ) for p in sky.properties.data.visible_planets: print(f"{p.planet}: {p.direction}, magnitude {p.magnitude}, in {p.constellation}") print(sky.properties.data.summary)

ParametersJSON Schema
NameRequiredDescriptionDefault
dateYes
timeYes
latitudeYes
longitudeYes
timezoneNo

TDQS

A4.8/5.0
Behavior4/5

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

With no annotations, the description carries full burden and provides substantial behavioral context: it explains what data is returned (planets, moon phase, darkness indicator), sorting order ('brightest first'), interpretation of fields ('is_dark=False means daytime or twilight'), and practical implications for observation. It doesn't cover rate limits or authentication needs, but offers rich operational guidance.

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?

Well-structured and front-loaded: purpose first, then returns, args, tips, and example. Every sentence adds value—no fluff. The tips section efficiently addresses common LLM usage scenarios without redundancy.

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 no annotations and no output schema, the description provides complete context: it explains the tool's behavior, parameters, return structure (including nested GeoJSON details), and practical usage tips. It covers all necessary aspects for effective tool invocation without relying on structured fields.

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

Parameters5/5

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

Schema description coverage is 0%, but the description fully compensates by detailing all 5 parameters with clear semantics, formats, and usage rules (e.g., 'UTC unless timezone specified', ranges for latitude/longitude, timezone offset examples). It adds meaning beyond the bare schema, making parameters fully understandable.

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 clearly states the tool's purpose with specific verbs ('Get a complete sky summary') and resources ('all planets, moon phase, and darkness'), distinguishing it from sibling tools like get_planet_position by emphasizing it's a comprehensive alternative to multiple individual calls.

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?

Explicit guidance is provided: 'This is the recommended tool for "what's in the sky tonight?" questions' and 'Use this instead of calling get_planet_position 8 times.' It also mentions when to combine with weather forecasts, giving clear context for usage versus alternatives.

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

get_solar_eclipse_by_dateA

Get local solar eclipse circumstances for a specific date and location.

Calculates whether a solar eclipse is visible from a given location on a specific date, and if so, provides detailed timing and positional information for all eclipse phases.

Args: date: Date of the eclipse in YYYY-MM-DD format. Valid range: 1800-01-01 to 2050-12-31 latitude: Observer's latitude in decimal degrees (-90 to 90) longitude: Observer's longitude in decimal degrees (-180 to 180) height: Observer's height above mean sea level in meters. Default is 0. Range: -200 to 10000 meters.

Returns: SolarEclipseByDateResponse: GeoJSON Feature with eclipse type, magnitude, obscuration, duration, and local circumstances.

Tips for LLMs: - If description is "No Eclipse at this Location", the eclipse isn't visible here - magnitude >= 1.0 indicates total eclipse; < 1.0 is partial - altitude must be > 0 for eclipse to be visible (sun above horizon) - Use get_solar_eclipses_by_year first to find eclipse dates

Example: eclipse = await get_solar_eclipse_by_date( date="2017-8-21", latitude=46.67, longitude=-122.65, height=15 ) print(f"Eclipse type: {eclipse.properties.description}")

ParametersJSON Schema
NameRequiredDescriptionDefault
dateYes
latitudeYes
longitudeYes
heightNo

TDQS

A4.7/5.0
Behavior4/5

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

With no annotations provided, the description carries full burden and delivers substantial behavioral context. It explains what happens when no eclipse is visible (returns specific description text), defines magnitude thresholds for eclipse types, specifies visibility conditions (sun altitude > 0), and describes the return format (GeoJSON Feature with specific properties). However, it doesn't mention error handling for invalid inputs or performance characteristics like rate limits.

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 well-structured and appropriately sized. It begins with a clear purpose statement, follows with detailed calculation behavior, then provides organized sections for Args, Returns, Tips, and Example. Every sentence adds value - no redundant or vague phrasing. The information is front-loaded with the core functionality stated first.

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?

For a tool with 4 parameters, 0% schema coverage, no annotations, and no output schema, the description provides excellent coverage of inputs, behavior, and return format. It explains what the tool calculates, parameter constraints, interpretation of results, and includes a practical example. The only minor gap is lack of explicit error handling documentation for edge cases like invalid date formats.

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

Parameters5/5

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

Given 0% schema description coverage, the description fully compensates by providing detailed parameter semantics beyond the bare schema. It explains each parameter's purpose, format constraints (date format, valid ranges for latitude/longitude/height), and the height parameter's default value. The example demonstrates proper parameter usage with realistic values.

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 clearly states the tool's purpose with specific verbs ('Get local solar eclipse circumstances', 'Calculates whether a solar eclipse is visible') and resources ('for a specific date and location'). It distinguishes from siblings by focusing exclusively on solar eclipse calculations for a given date/location, unlike get_solar_eclipses_by_year (year-based) or get_sun_moon_data (general sun/moon data).

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?

The description provides explicit guidance on when to use this tool versus alternatives: 'Use get_solar_eclipses_by_year first to find eclipse dates' establishes a clear workflow dependency. The 'Tips for LLMs' section includes exclusion criteria ('If description is "No Eclipse at this Location", the eclipse isn't visible here') and prerequisites ('altitude must be > 0 for eclipse to be visible').

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

get_solar_eclipses_by_yearA

Get a list of all solar eclipses occurring in a specific year.

Returns all solar eclipses (total, annular, partial, and hybrid) that occur worldwide in the specified year. Use this to find eclipse dates, then use get_solar_eclipse_by_date to get detailed local circumstances.

Args: year: Year to query (1800-2050)

Returns: SolarEclipseByYearResponse with list of eclipse events.

Tips for LLMs: - Most years have 2 solar eclipses, some have 3, rarely 4 - After finding an eclipse date, use get_solar_eclipse_by_date to check visibility

Example: eclipses = await get_solar_eclipses_by_year(2024) for eclipse in eclipses.eclipses_in_year: print(f"{eclipse.event} on {eclipse.year}-{eclipse.month}-{eclipse.day}")

ParametersJSON Schema
NameRequiredDescriptionDefault
yearYes

TDQS

A4.8/5.0
Behavior4/5

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

With no annotations provided, the description carries full burden and does well by disclosing key behavioral traits: the year range constraint (1800-2050), typical output volume (2-4 eclipses per year), and the return type (SolarEclipseByYearResponse). It doesn't mention error handling or rate limits, but covers essential operational context.

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?

Well-structured with clear sections: purpose statement, usage guidance, args/returns documentation, practical tips, and an example. Every sentence adds value - no redundancy or fluff. The information is front-loaded with the core purpose first.

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 a single-parameter query tool with no output schema, the description provides excellent context: clear purpose, usage guidelines, parameter semantics, behavioral expectations, and an example. The 'Tips for LLMs' section adds practical guidance that helps the agent use the tool effectively within the broader toolset.

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

Parameters5/5

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

The schema has 0% description coverage, so the description must compensate fully. It does so by clearly explaining the 'year' parameter's purpose ('Year to query'), providing the valid range (1800-2050), and showing usage in the example. This adds substantial meaning beyond the bare schema.

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 clearly states the verb 'Get' and resource 'list of all solar eclipses occurring in a specific year', specifying the scope (worldwide) and types (total, annular, partial, hybrid). It distinguishes from sibling get_solar_eclipse_by_date by indicating this tool returns a list for a year while that one provides detailed circumstances for a specific date.

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 states when to use this tool ('to find eclipse dates') and when to use an alternative ('then use get_solar_eclipse_by_date to get detailed local circumstances'). The 'Tips for LLMs' section reinforces this workflow, providing clear guidance on tool sequencing.

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

get_sun_moon_dataA

Get complete sun and moon data for one day at a specific location.

Provides rise, set, and transit times for the sun and moon, twilight times, moon phase, and illumination percentage. Essential for planning outdoor activities, photography, navigation, and astronomical observations.

Args: date: Date in YYYY-MM-DD format. No leading zeros required. latitude: Latitude in decimal degrees. Range: -90 to 90 (negative = South, positive = North) longitude: Longitude in decimal degrees. Range: -180 to 180 (negative = West, positive = East) timezone: Timezone offset from UTC in hours (e.g., -8 for PST, 1 for CET). Positive = East of UTC, Negative = West of UTC. If not provided, UTC (0) is used. dst: Whether to apply daylight saving time adjustment. If not provided, defaults to false. label: Optional user label (max 20 characters) to identify this query in the response

Returns: OneDayResponse: GeoJSON Feature containing: - geometry: Location coordinates - properties.data: Complete sun and moon information: - sundata: List of sun events (rise, set, transit, civil twilight begin/end) - moondata: List of moon events (rise, set, transit) - curphase: Current moon phase description - fracillum: Percentage of moon illuminated (e.g., "92%") - closestphase: Details of the nearest moon phase

Tips for LLMs: - Times are in the requested timezone (or UTC if not specified) - sundata and moondata may be empty in polar regions during extreme seasons - Civil twilight is when the sun is 6 degrees below horizon - Use fracillum to determine moon brightness for night photography or stargazing - Moon transit time indicates when moon is highest in the sky (best viewing)

Example: data = await get_sun_moon_data( date="2005-9-20", latitude=47.60, longitude=-122.33, timezone=-8, dst=True ) sunrise = next(e for e in data.properties.data.sundata if e.phen == "Rise") print(f"Sunrise at {sunrise.time}")

ParametersJSON Schema
NameRequiredDescriptionDefault
dateYes
latitudeYes
longitudeYes
timezoneNo
dstNo
labelNo

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations provided, the description carries full burden and does well by disclosing key behavioral traits: timezone handling, polar region edge cases (empty data), twilight definition, and practical applications. It doesn't mention rate limits, authentication needs, or error conditions, but provides substantial operational context.

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?

Well-structured with purpose statement, usage context, parameter details, return format, LLM tips, and example. Some redundancy exists (e.g., timezone sign explained twice), but overall efficient with each section serving a clear purpose. Could be slightly more front-loaded.

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 a 6-parameter tool with no annotations and no output schema, the description provides comprehensive coverage: clear purpose, parameter semantics, return format details (GeoJSON structure with specific data fields), edge cases, and practical usage tips. It fully compensates for the lack of structured metadata.

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

Parameters5/5

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

With 0% schema description coverage, the description fully compensates by providing detailed parameter documentation: format requirements (YYYY-MM-DD), ranges (-90 to 90, -180 to 180), sign conventions (negative=South/West), defaults (timezone=UTC, dst=false), and optionality. It adds significant value beyond the bare schema.

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 clearly states the tool 'Get complete sun and moon data for one day at a specific location' with specific resources (sun and moon data) and scope (one day, specific location). It distinguishes from siblings by focusing on daily sun/moon events rather than seasons, phases, planets, or eclipses.

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 provides clear context for when to use this tool ('Essential for planning outdoor activities, photography, navigation, and astronomical observations'), but doesn't explicitly state when to choose sibling tools like get_moon_phases or get_planet_events instead. The guidance is helpful but lacks explicit alternatives.

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. Dates show when Glama detected each change.

  1. 8 tool updatesv0.3.4
    • First observedget_earth_seasons
    • First observedget_moon_phases
    • First observedget_planet_events
    • First observedget_planet_position
    • First observedget_sky
    • First observedget_solar_eclipse_by_date
    • First observedget_solar_eclipses_by_year
    • First observedget_sun_moon_data

TDQS

A4.7/5.0
Disambiguation5/5

Each tool has a clearly distinct purpose with no overlap: get_earth_seasons (Earth's orbital events), get_moon_phases (lunar cycles), get_planet_events (planet rise/set times), get_planet_position (planet positional data), get_sky (complete sky summary), get_solar_eclipse_by_date (local eclipse details), get_solar_eclipses_by_year (yearly eclipse list), and get_sun_moon_data (daily sun/moon times). The descriptions reinforce these boundaries, making tool selection unambiguous.

Naming Consistency5/5

All tools follow a consistent verb_noun pattern with 'get_' prefix and snake_case: get_earth_seasons, get_moon_phases, get_planet_events, get_planet_position, get_sky, get_solar_eclipse_by_date, get_solar_eclipses_by_year, get_sun_moon_data. This predictability aids agent understanding and tool discovery.

Tool Count5/5

With 8 tools, the server is well-scoped for its celestial/astronomical domain. Each tool serves a specific, non-trivial function (e.g., planetary data, eclipse tracking, sky summaries), and none feel redundant or excessive. The count aligns with typical MCP server ranges (3-15 tools) for comprehensive coverage.

Completeness4/5

The toolset provides strong coverage for astronomical queries, including planetary positions, lunar phases, solar eclipses, and sky summaries. Minor gaps exist, such as no tool for stellar data (stars/constellations) or historical astronomical events, but core workflows (e.g., 'what's visible tonight?', eclipse planning) are well-supported without dead ends.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/IBM/chuk-mcp-celestial'

If you have feedback or need assistance with the MCP directory API, please join our Discord server