Server definition
- Hash
- sha256:f79d72a6ac16690482ac29885d837cf4ec23dd7a6f513bbfe3eb52c1f6493a1a
- What it is
- What a remote MCP server returned when asked what it offers: 11 tools
The blob, as servednamed by its sha256
{
"instructions": "Astronomy calculations from CycleCalcs (cyclecalcs.com): sun and moon times, planet positions and visibility, Mercury and Venus apparition events, the oppositions, conjunctions with the Sun and quadratures of Mars to Neptune, constellation entries of every planet, eclipses, lunar phases, dark-sky observing windows, and place lookup. Pure astronomy only: no astrology, no fortune-telling, no claims that sky events affect people or Earth. Tool calls work without a key, up to 50 a day per network address. A CycleCalcs API key from RapidAPI (the Basic plan is free; keys at https://rapidapi.com/info-8KZIhinZ9/api/cyclecalcs-astronomy-api3), sent as \"Authorization: Bearer YOUR_KEY\" or \"X-Api-Key: YOUR_KEY\", or entered at OAuth sign-in, meters tool calls on the caller's own plan instead. Dates are ISO 8601 within 1700-2200. Locations are lat/lon in decimal degrees, or a place name the API resolves itself. Numeric field names carry their units (_deg, _km, _hours, _fraction) and coordinate fields state their frame (equatorial.j2000, ecliptic.true_of_date).",
"tools": [
{
"description": "The genuinely dark, moonless observing window for a night: astronomical night intersected with the Moon being down, ranked across up to 62 nights with a trend. The right tool for \"when should I stargaze / photograph the Milky Way / observe deep-sky objects\". Location required. For plain twilight times use astro_sun.",
"inputSchema": {
"additionalProperties": false,
"anyOf": [
{
"required": [
"lat",
"lon"
]
},
{
"required": [
"place"
]
}
],
"properties": {
"date": {
"description": "Night to start from. ISO 8601 UTC date or datetime, e.g. \"2026-08-06\" or \"2026-08-06T21:00:00Z\". Or jd: followed by a Julian Day on the UT scale, e.g. \"jd:2461000.5\". On astro_positions, date may list up to 24 datetimes separated by commas, answered in the order sent. Omit for the current moment. Years 1700 to 2200 only; outside that range the API refuses with DATE_OUT_OF_RANGE because the ephemeris is not reliable there.",
"type": "string"
},
"lat": {
"description": "Latitude in decimal degrees, north positive. Send lat and lon together.",
"maximum": 90,
"minimum": -90,
"type": "number"
},
"lon": {
"description": "Longitude in decimal degrees, east positive (Lisbon is about -9.14). Send lat and lon together.",
"maximum": 180,
"minimum": -180,
"type": "number"
},
"moon_illumination_max": {
"description": "Treat the Moon as tolerable below this illuminated fraction (0..1) even when up.",
"maximum": 1,
"minimum": 0,
"type": "number"
},
"nights": {
"description": "How many nights to evaluate and rank. Default 1.",
"maximum": 62,
"minimum": 1,
"type": "integer"
},
"place": {
"description": "Place name instead of lat/lon, as \"City\" or \"City,CC\" with an ISO country code, e.g. \"Lisbon,PT\". Resolved server-side; the response then carries a required GeoNames CC BY 4.0 credit in its attribution field, which must be preserved when shown.",
"type": "string"
},
"tz": {
"description": "IANA timezone like \"Europe/Lisbon\" to render event times in local time. Optional; a resolved place supplies its own timezone.",
"type": "string"
}
},
"type": "object"
},
"name": "astro_dark_window",
"outputSchema": {
"additionalProperties": true,
"description": "The MCP projection of a CycleCalcs v2 response: the answer, plus the provenance a caller needs to use it honestly.",
"properties": {
"attribution": {
"description": "The credit line to display verbatim when rights is attribution_required.",
"type": "string"
},
"data": {
"additionalProperties": true,
"description": "The best genuinely dark observing windows across a range of nights.",
"properties": {
"best_night_index": {
"description": "Index into `nights` of the best one.",
"type": "integer"
},
"high_latitude_caution": {
"description": "True when latitude makes true darkness scarce or absent, so the ranking means less.",
"type": "boolean"
},
"high_latitude_note": {
"description": "The explanation when that caution is set.",
"type": [
"string",
"null"
]
},
"method": {
"description": "How darkness was defined and how nights were ranked.",
"type": "object"
},
"nights": {
"description": "Each night with its dark window and what the Moon does to it.",
"type": "array"
},
"ranked": {
"description": "Night indices best to worst.",
"type": "array"
},
"summary": {
"description": "The recommendation in brief.",
"type": "object"
}
},
"type": "object"
},
"next_cursor": {
"description": "Present only when more rows exist. Send it back with the SAME start/end arguments as the first call to get the next page.",
"type": "string"
},
"not_computed": {
"description": "Data this API deliberately does not serve, and why. Present only when the question touched such a field. An absence named here is information: treat it as \"withheld\", never as \"none exists\".",
"type": "array"
},
"rights": {
"description": "Either unrestricted, or attribution_required when third-party place data was used. When attribution_required, the attribution line must be shown.",
"type": "string"
},
"warnings": {
"description": "Machine-readable notices about this answer. Present only when non-empty. Never changes whether the call succeeded.",
"type": "array"
}
},
"required": [
"data"
],
"type": "object"
}
},
{
"description": "Solar and lunar eclipses: the next or previous from a date, or all in a range, with type, magnitude, obscuration, Saros series and global geometry. A solar eclipse also carries a computed hybrid flag and, when central, the duration, path width and Sun altitude at greatest eclipse. With a location it adds local circumstances, contact times, and an explicit visible-from-here answer; set visible_only to true to keep only eclipses visible there. include adds the precomputed central path or the circumstances at greatest local eclipse. NOTE: count applies per type, so count=3 with type \"both\" can return six events.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"count": {
"description": "How many eclipses PER TYPE to return.",
"minimum": 1,
"type": "integer"
},
"cursor": {
"description": "Opaque pagination cursor from a previous result's next_cursor. Send it with the same start/end arguments as the first page.",
"type": "string"
},
"date": {
"description": "Anchor date to search from. ISO 8601 UTC date or datetime, e.g. \"2026-08-06\" or \"2026-08-06T21:00:00Z\". Or jd: followed by a Julian Day on the UT scale, e.g. \"jd:2461000.5\". On astro_positions, date may list up to 24 datetimes separated by commas, answered in the order sent. Omit for the current moment. Years 1700 to 2200 only; outside that range the API refuses with DATE_OUT_OF_RANGE because the ephemeris is not reliable there.",
"type": "string"
},
"direction": {
"description": "Search direction from the anchor date. Default \"next\".",
"enum": [
"next",
"previous"
],
"type": "string"
},
"end": {
"description": "Last day of an explicit window. ISO 8601 UTC date or datetime, e.g. \"2026-08-06\" or \"2026-08-06T21:00:00Z\". Or jd: followed by a Julian Day on the UT scale, e.g. \"jd:2461000.5\". On astro_positions, date may list up to 24 datetimes separated by commas, answered in the order sent. Omit for the current moment. Years 1700 to 2200 only; outside that range the API refuses with DATE_OUT_OF_RANGE because the ephemeris is not reliable there.",
"type": "string"
},
"include": {
"description": "Optional extras, added to the default blocks rather than replacing them. \"path\": the precomputed central path of a solar eclipse as inline GeoJSON (central line, northern and southern limits, and per-minute duration, width, phase and Sun altitude), for the central eclipses that have one; every other eclipse says why it has none. Large: about 65 to 90 KB of JSON per eclipse, returned as both text and structured content, so ask for one eclipse at a time (type \"solar\", a date just before it, count 1). \"greatest\": the circumstances at greatest eclipse from the supplied location, inside each solar eclipse's local block (requires a location).",
"items": {
"enum": [
"path",
"greatest"
],
"type": "string"
},
"type": "array",
"uniqueItems": true
},
"lat": {
"description": "Latitude in decimal degrees, north positive. Send lat and lon together.",
"maximum": 90,
"minimum": -90,
"type": "number"
},
"lon": {
"description": "Longitude in decimal degrees, east positive (Lisbon is about -9.14). Send lat and lon together.",
"maximum": 180,
"minimum": -180,
"type": "number"
},
"place": {
"description": "Place name instead of lat/lon, as \"City\" or \"City,CC\" with an ISO country code, e.g. \"Lisbon,PT\". Resolved server-side; the response then carries a required GeoNames CC BY 4.0 credit in its attribution field, which must be preserved when shown.",
"type": "string"
},
"start": {
"description": "First day of an explicit window (use with end). ISO 8601 UTC date or datetime, e.g. \"2026-08-06\" or \"2026-08-06T21:00:00Z\". Or jd: followed by a Julian Day on the UT scale, e.g. \"jd:2461000.5\". On astro_positions, date may list up to 24 datetimes separated by commas, answered in the order sent. Omit for the current moment. Years 1700 to 2200 only; outside that range the API refuses with DATE_OUT_OF_RANGE because the ephemeris is not reliable there.",
"type": "string"
},
"type": {
"description": "Which kind of eclipse to report. Default \"both\".",
"enum": [
"solar",
"lunar",
"both"
],
"type": "string"
},
"tz": {
"description": "IANA timezone like \"Europe/Lisbon\" to render event times in local time. Optional; a resolved place supplies its own timezone.",
"type": "string"
},
"visible_only": {
"description": "true keeps only eclipses visible from the supplied location (requires a location).",
"type": "boolean"
}
},
"type": "object"
},
"name": "astro_eclipses",
"outputSchema": {
"additionalProperties": true,
"description": "The MCP projection of a CycleCalcs v2 response: the answer, plus the provenance a caller needs to use it honestly.",
"properties": {
"attribution": {
"description": "The credit line to display verbatim when rights is attribution_required.",
"type": "string"
},
"data": {
"additionalProperties": true,
"description": "Solar and lunar eclipses in a date range, optionally filtered to one location.",
"properties": {
"central_geometry_note": {
"description": "Only when solar eclipses are listed: the lunar-radius convention behind hybrid, the greatest_eclipse fields and the path.",
"type": "string"
},
"eclipse_count": {
"description": "How many eclipses matched.",
"type": "integer"
},
"eclipses": {
"description": "Each eclipse with its peak instant, kind and Saros series. Solar rows also carry hybrid (true for an eclipse total along part of its central track and annular along the rest; kind keeps the value at greatest eclipse), hybrid_transitions, and greatest_eclipse_duration_seconds, greatest_eclipse_path_width_km and greatest_eclipse_sun_altitude_deg (null when there is no central line). With include path, each row has a path object: available, and when true an inline GeoJSON FeatureCollection.",
"type": "array"
},
"next_visible": {
"description": "Only when a location was given: the next one visible from there, with local circumstances.",
"type": "object"
},
"next_visible_note": {
"description": "Only when a location was given: a caveat about that visibility, when one applies.",
"type": "string"
},
"summary": {
"description": "A one-line reading of the range.",
"type": "string"
},
"type": {
"description": "Which kinds were asked for: solar, lunar or both.",
"type": "string"
},
"window": {
"description": "The range actually evaluated.",
"type": "object"
}
},
"type": "object"
},
"next_cursor": {
"description": "Present only when more rows exist. Send it back with the SAME start/end arguments as the first call to get the next page.",
"type": "string"
},
"not_computed": {
"description": "Data this API deliberately does not serve, and why. Present only when the question touched such a field. An absence named here is information: treat it as \"withheld\", never as \"none exists\".",
"type": "array"
},
"rights": {
"description": "Either unrestricted, or attribution_required when third-party place data was used. When attribution_required, the attribution line must be shown.",
"type": "string"
},
"warnings": {
"description": "Machine-readable notices about this answer. Present only when non-empty. Never changes whether the call succeeded.",
"type": "array"
}
},
"required": [
"data"
],
"type": "object"
}
},
{
"description": "Resolve a place name to coordinates, region, country, IANA timezone and a stable place_id, or reverse-look-up the nearest places to a lat/lon. Results are GeoNames data (CC BY 4.0); the response carries the required credit in its attribution field, which must be preserved when results are shown. Note the other tools accept a place argument directly, so this is only needed to disambiguate a name, filter by country, or reverse-geocode.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"country": {
"description": "Two-letter ISO country code filter, e.g. \"US\".",
"type": "string"
},
"id": {
"description": "A place_id from an earlier result, to fetch that exact place.",
"type": "string"
},
"lat": {
"description": "Latitude in decimal degrees, north positive. Send lat and lon together.",
"maximum": 90,
"minimum": -90,
"type": "number"
},
"limit": {
"description": "Maximum matches to return. Default 5.",
"maximum": 20,
"minimum": 1,
"type": "integer"
},
"lon": {
"description": "Longitude in decimal degrees, east positive (Lisbon is about -9.14). Send lat and lon together.",
"maximum": 180,
"minimum": -180,
"type": "number"
},
"query": {
"description": "Place name to search for, e.g. \"Springfield\".",
"type": "string"
}
},
"type": "object"
},
"name": "astro_find_place",
"outputSchema": {
"additionalProperties": true,
"description": "The MCP projection of a CycleCalcs v2 response: the answer, plus the provenance a caller needs to use it honestly.",
"properties": {
"attribution": {
"description": "The credit line to display verbatim when rights is attribution_required.",
"type": "string"
},
"data": {
"additionalProperties": true,
"description": "Coordinates for a place name, or the nearest named places to coordinates.",
"properties": {
"found": {
"description": "How many are returned here.",
"type": "integer"
},
"index": {
"description": "Which place index answered, and its vintage.",
"type": "object"
},
"matched": {
"description": "How many places matched before any limit was applied.",
"type": "integer"
},
"mode": {
"description": "Whether this was a name search or a reverse lookup.",
"type": "string"
},
"results": {
"description": "Each place with coordinates, country, population and a place_id that other tools accept.",
"type": "array"
}
},
"type": "object"
},
"next_cursor": {
"description": "Present only when more rows exist. Send it back with the SAME start/end arguments as the first call to get the next page.",
"type": "string"
},
"not_computed": {
"description": "Data this API deliberately does not serve, and why. Present only when the question touched such a field. An absence named here is information: treat it as \"withheld\", never as \"none exists\".",
"type": "array"
},
"rights": {
"description": "Either unrestricted, or attribution_required when third-party place data was used. When attribution_required, the attribution line must be shown.",
"type": "string"
},
"warnings": {
"description": "Machine-readable notices about this answer. Present only when non-empty. Never changes whether the call succeeded.",
"type": "array"
}
},
"required": [
"data"
],
"type": "object"
}
},
{
"description": "The Moon at an instant or as a daily series: phase name and angle, illuminated fraction, distance, apparent size, libration, bright limb, and the next quarter phases. A location adds rise/set and altitude. For a calendar of new and full moons use astro_moon_phases; for the Moon's exact coordinates use astro_positions.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"count": {
"description": "Number of daily rows from start (alternative to end).",
"minimum": 1,
"type": "integer"
},
"cursor": {
"description": "Opaque pagination cursor from a previous result's next_cursor. Send it with the same start/end arguments as the first page.",
"type": "string"
},
"date": {
"description": "ISO 8601 UTC date or datetime, e.g. \"2026-08-06\" or \"2026-08-06T21:00:00Z\". Or jd: followed by a Julian Day on the UT scale, e.g. \"jd:2461000.5\". On astro_positions, date may list up to 24 datetimes separated by commas, answered in the order sent. Omit for the current moment. Years 1700 to 2200 only; outside that range the API refuses with DATE_OUT_OF_RANGE because the ephemeris is not reliable there.",
"type": "string"
},
"end": {
"description": "Last day of a daily series. ISO 8601 UTC date or datetime, e.g. \"2026-08-06\" or \"2026-08-06T21:00:00Z\". Or jd: followed by a Julian Day on the UT scale, e.g. \"jd:2461000.5\". On astro_positions, date may list up to 24 datetimes separated by commas, answered in the order sent. Omit for the current moment. Years 1700 to 2200 only; outside that range the API refuses with DATE_OUT_OF_RANGE because the ephemeris is not reliable there.",
"type": "string"
},
"lat": {
"description": "Latitude in decimal degrees, north positive. Send lat and lon together.",
"maximum": 90,
"minimum": -90,
"type": "number"
},
"lon": {
"description": "Longitude in decimal degrees, east positive (Lisbon is about -9.14). Send lat and lon together.",
"maximum": 180,
"minimum": -180,
"type": "number"
},
"place": {
"description": "Place name instead of lat/lon, as \"City\" or \"City,CC\" with an ISO country code, e.g. \"Lisbon,PT\". Resolved server-side; the response then carries a required GeoNames CC BY 4.0 credit in its attribution field, which must be preserved when shown.",
"type": "string"
},
"start": {
"description": "First day of a daily series. ISO 8601 UTC date or datetime, e.g. \"2026-08-06\" or \"2026-08-06T21:00:00Z\". Or jd: followed by a Julian Day on the UT scale, e.g. \"jd:2461000.5\". On astro_positions, date may list up to 24 datetimes separated by commas, answered in the order sent. Omit for the current moment. Years 1700 to 2200 only; outside that range the API refuses with DATE_OUT_OF_RANGE because the ephemeris is not reliable there.",
"type": "string"
},
"tz": {
"description": "IANA timezone like \"Europe/Lisbon\" to render event times in local time. Optional; a resolved place supplies its own timezone.",
"type": "string"
}
},
"type": "object"
},
"name": "astro_moon",
"outputSchema": {
"additionalProperties": true,
"description": "The MCP projection of a CycleCalcs v2 response: the answer, plus the provenance a caller needs to use it honestly.",
"properties": {
"attribution": {
"description": "The credit line to display verbatim when rights is attribution_required.",
"type": "string"
},
"data": {
"additionalProperties": true,
"description": "The Moon's state and appearance, or a sampled series in range mode.",
"properties": {
"angular_diameter_arcsec": {
"description": "Apparent disk size in arcseconds.",
"type": "number"
},
"bright_limb": {
"description": "Which way the lit edge points.",
"type": "object"
},
"constellation": {
"description": "The IAU constellation the Moon currently occupies.",
"type": "object"
},
"distance_au": {
"description": "The same distance in astronomical units.",
"type": "number"
},
"distance_basis": {
"description": "Whether the distance is geocentric or topocentric.",
"type": "string"
},
"distance_km": {
"description": "Center-to-center distance in kilometres.",
"type": "number"
},
"event_definition": {
"description": "The altitude convention rise and set are measured against.",
"type": "string"
},
"fraction_of_mean_distance": {
"description": "Distance relative to the mean, for supermoon claims.",
"type": "number"
},
"fraction_of_mean_distance_definition": {
"description": "How that fraction is defined.",
"type": "string"
},
"libration": {
"description": "The rocking that reveals a little of the far side.",
"type": "object"
},
"magnitude": {
"description": "Apparent visual brightness.",
"type": "number"
},
"next_phases": {
"description": "Upcoming quarter phases with exact instants.",
"type": "array"
},
"parallax_deg": {
"description": "Angular shift between those two viewpoints.",
"type": "number"
},
"phase": {
"description": "Phase name, angle and illuminated fraction.",
"type": "object"
},
"position_geocentric": {
"description": "Position as seen from Earth's center.",
"type": "object"
},
"position_topocentric": {
"description": "Position as seen from the given location.",
"type": "object"
},
"rise_set": {
"description": "Moonrise and moonset for the location.",
"type": "object"
},
"series": {
"description": "RANGE MODE ONLY: one sampled entry per step.",
"type": "array"
},
"summary": {
"description": "A one-line reading of the Moon right now.",
"type": "string"
},
"tropical_sign": {
"description": "Tropical ecliptic longitude, reported as position only.",
"type": "object"
},
"window": {
"description": "The instant or range actually evaluated.",
"type": "object"
}
},
"type": "object"
},
"next_cursor": {
"description": "Present only when more rows exist. Send it back with the SAME start/end arguments as the first call to get the next page.",
"type": "string"
},
"not_computed": {
"description": "Data this API deliberately does not serve, and why. Present only when the question touched such a field. An absence named here is information: treat it as \"withheld\", never as \"none exists\".",
"type": "array"
},
"rights": {
"description": "Either unrestricted, or attribution_required when third-party place data was used. When attribution_required, the attribution line must be shown.",
"type": "string"
},
"warnings": {
"description": "Machine-readable notices about this answer. Present only when non-empty. Never changes whether the call succeeded.",
"type": "array"
}
},
"required": [
"data"
],
"type": "object"
}
},
{
"description": "Every new moon, quarter and full moon in a window (or the next few from a date): each with its exact instant, distance, apparent size, supermoon classification under both competing definitions, traditional full-moon name, and any eclipse falling on it. Use for \"when is the next full moon\" and phase calendars. For the Moon's state right now use astro_moon.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"count": {
"description": "How many phase events to return from the anchor date.",
"minimum": 1,
"type": "integer"
},
"cursor": {
"description": "Opaque pagination cursor from a previous result's next_cursor. Send it with the same start/end arguments as the first page.",
"type": "string"
},
"date": {
"description": "Anchor date; the next phases follow it. ISO 8601 UTC date or datetime, e.g. \"2026-08-06\" or \"2026-08-06T21:00:00Z\". Or jd: followed by a Julian Day on the UT scale, e.g. \"jd:2461000.5\". On astro_positions, date may list up to 24 datetimes separated by commas, answered in the order sent. Omit for the current moment. Years 1700 to 2200 only; outside that range the API refuses with DATE_OUT_OF_RANGE because the ephemeris is not reliable there.",
"type": "string"
},
"end": {
"description": "Last day of a window. ISO 8601 UTC date or datetime, e.g. \"2026-08-06\" or \"2026-08-06T21:00:00Z\". Or jd: followed by a Julian Day on the UT scale, e.g. \"jd:2461000.5\". On astro_positions, date may list up to 24 datetimes separated by commas, answered in the order sent. Omit for the current moment. Years 1700 to 2200 only; outside that range the API refuses with DATE_OUT_OF_RANGE because the ephemeris is not reliable there.",
"type": "string"
},
"lat": {
"description": "Latitude in decimal degrees, north positive. Send lat and lon together.",
"maximum": 90,
"minimum": -90,
"type": "number"
},
"lon": {
"description": "Longitude in decimal degrees, east positive (Lisbon is about -9.14). Send lat and lon together.",
"maximum": 180,
"minimum": -180,
"type": "number"
},
"phases": {
"description": "Optional filter of phase kinds. Omit for all four. Example: [\"full_moon\"] for full moons only.",
"items": {
"enum": [
"new_moon",
"first_quarter",
"full_moon",
"last_quarter"
],
"type": "string"
},
"minItems": 1,
"type": "array"
},
"place": {
"description": "Place name instead of lat/lon, as \"City\" or \"City,CC\" with an ISO country code, e.g. \"Lisbon,PT\". Resolved server-side; the response then carries a required GeoNames CC BY 4.0 credit in its attribution field, which must be preserved when shown.",
"type": "string"
},
"start": {
"description": "First day of a window (use with end). ISO 8601 UTC date or datetime, e.g. \"2026-08-06\" or \"2026-08-06T21:00:00Z\". Or jd: followed by a Julian Day on the UT scale, e.g. \"jd:2461000.5\". On astro_positions, date may list up to 24 datetimes separated by commas, answered in the order sent. Omit for the current moment. Years 1700 to 2200 only; outside that range the API refuses with DATE_OUT_OF_RANGE because the ephemeris is not reliable there.",
"type": "string"
},
"tz": {
"description": "IANA timezone like \"Europe/Lisbon\" to render event times in local time. Optional; a resolved place supplies its own timezone.",
"type": "string"
}
},
"type": "object"
},
"name": "astro_moon_phases",
"outputSchema": {
"additionalProperties": true,
"description": "The MCP projection of a CycleCalcs v2 response: the answer, plus the provenance a caller needs to use it honestly.",
"properties": {
"attribution": {
"description": "The credit line to display verbatim when rights is attribution_required.",
"type": "string"
},
"data": {
"additionalProperties": true,
"description": "New, first quarter, full and last quarter moons in a date range.",
"properties": {
"phase_count": {
"description": "How many phases fall in the window.",
"type": "integer"
},
"phases": {
"description": "Each phase with its exact instant and name.",
"type": "array"
},
"summary": {
"description": "A one-line reading of the range.",
"type": "string"
},
"window": {
"description": "The range actually evaluated.",
"type": "object"
}
},
"type": "object"
},
"next_cursor": {
"description": "Present only when more rows exist. Send it back with the SAME start/end arguments as the first call to get the next page.",
"type": "string"
},
"not_computed": {
"description": "Data this API deliberately does not serve, and why. Present only when the question touched such a field. An absence named here is information: treat it as \"withheld\", never as \"none exists\".",
"type": "array"
},
"rights": {
"description": "Either unrestricted, or attribution_required when third-party place data was used. When attribution_required, the attribution line must be shown.",
"type": "string"
},
"warnings": {
"description": "Machine-readable notices about this answer. Present only when non-empty. Never changes whether the call succeeded.",
"type": "array"
}
},
"required": [
"data"
],
"type": "object"
}
},
{
"description": "All eight planets in one call for a date and optional location: constellation, magnitude, apparent size, elongation from the Sun, morning or evening sky, retrograde state with the next station, rise/set, and a worth-looking-tonight assessment. The right tool for \"which planets are visible tonight\". For exact coordinates of specific bodies use astro_positions.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"bodies": {
"description": "Optional subset of planets: mercury, venus, mars, jupiter, saturn, uranus, neptune, pluto.",
"items": {
"type": "string"
},
"maxItems": 8,
"minItems": 1,
"type": "array"
},
"date": {
"description": "ISO 8601 UTC date or datetime, e.g. \"2026-08-06\" or \"2026-08-06T21:00:00Z\". Or jd: followed by a Julian Day on the UT scale, e.g. \"jd:2461000.5\". On astro_positions, date may list up to 24 datetimes separated by commas, answered in the order sent. Omit for the current moment. Years 1700 to 2200 only; outside that range the API refuses with DATE_OUT_OF_RANGE because the ephemeris is not reliable there.",
"type": "string"
},
"lat": {
"description": "Latitude in decimal degrees, north positive. Send lat and lon together.",
"maximum": 90,
"minimum": -90,
"type": "number"
},
"lon": {
"description": "Longitude in decimal degrees, east positive (Lisbon is about -9.14). Send lat and lon together.",
"maximum": 180,
"minimum": -180,
"type": "number"
},
"place": {
"description": "Place name instead of lat/lon, as \"City\" or \"City,CC\" with an ISO country code, e.g. \"Lisbon,PT\". Resolved server-side; the response then carries a required GeoNames CC BY 4.0 credit in its attribution field, which must be preserved when shown.",
"type": "string"
},
"sort": {
"description": "Optional result ordering. Default is by distance from the Sun.",
"enum": [
"distance_from_sun",
"magnitude",
"elongation",
"altitude"
],
"type": "string"
},
"tz": {
"description": "IANA timezone like \"Europe/Lisbon\" to render event times in local time. Optional; a resolved place supplies its own timezone.",
"type": "string"
}
},
"type": "object"
},
"name": "astro_planet_board",
"outputSchema": {
"additionalProperties": true,
"description": "The MCP projection of a CycleCalcs v2 response: the answer, plus the provenance a caller needs to use it honestly.",
"properties": {
"attribution": {
"description": "The credit line to display verbatim when rights is attribution_required.",
"type": "string"
},
"data": {
"additionalProperties": true,
"description": "Which planets are worth looking at right now, and where.",
"properties": {
"above_horizon_now": {
"description": "Bodies above the horizon, visible or not.",
"type": "array"
},
"bodies": {
"description": "Every body with position, brightness and a visibility verdict.",
"type": "array"
},
"count": {
"description": "How many bodies are on the board.",
"type": "integer"
},
"instant": {
"description": "The moment evaluated.",
"type": "string"
},
"observable_now": {
"description": "Bodies both up and realistically visible.",
"type": "array"
},
"retrograde_now": {
"description": "Bodies currently in apparent retrograde motion.",
"type": "array"
},
"summary": {
"description": "A one-line reading of tonight's planets.",
"type": "string"
}
},
"type": "object"
},
"next_cursor": {
"description": "Present only when more rows exist. Send it back with the SAME start/end arguments as the first call to get the next page.",
"type": "string"
},
"not_computed": {
"description": "Data this API deliberately does not serve, and why. Present only when the question touched such a field. An absence named here is information: treat it as \"withheld\", never as \"none exists\".",
"type": "array"
},
"rights": {
"description": "Either unrestricted, or attribution_required when third-party place data was used. When attribution_required, the attribution line must be shown.",
"type": "string"
},
"warnings": {
"description": "Machine-readable notices about this answer. Present only when non-empty. Never changes whether the call succeeded.",
"type": "array"
}
},
"required": [
"data"
],
"type": "object"
}
},
{
"description": "Dated planet events. For Mercury and Venus, the apparition cycle: inferior and superior conjunctions, greatest eastern and western elongations, peak brightness (a Venus-only event: Mercury's brightness peaks behind the Sun where it cannot be seen), and the rare transits across the Sun; with no dates it also reports where each is in its cycle right now: morning star or evening star, the conjunctions bounding the current apparition, and the live elongation, phase, magnitude and apparent size. For Mars, Jupiter, Saturn, Uranus and Neptune: conjunction with the Sun, western quadrature, opposition and eastern quadrature, the instants the planet's apparent geocentric ecliptic longitude minus the Sun's reaches 0, 270, 180 and 90 deg, each with the planet's constellation, distance, magnitude and elongation. For any of the seven, constellation_entry, returned only when listed in kinds: each crossing of an IAU constellation boundary, with the two constellations and the direction of motion. The right tool for \"when does Venus become the morning star\", \"when is Mars at opposition\", or \"when does Uranus cross from Taurus into Gemini\". For tonight's visibility of all eight planets use astro_planet_board. Mercury and Venus conjunction instants use the classical heliocentric convention, named on each event.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"bodies": {
"description": "Which planets to report. Default mercury and venus.",
"items": {
"enum": [
"mercury",
"venus",
"mars",
"jupiter",
"saturn",
"uranus",
"neptune"
],
"type": "string"
},
"maxItems": 7,
"minItems": 1,
"type": "array"
},
"cursor": {
"description": "Opaque pagination cursor from a previous result's next_cursor. Send it with the same start/end arguments as the first page.",
"type": "string"
},
"date": {
"description": "Anchor instant; with no start/end the response covers the next full synodic cycle from here. ISO 8601 UTC date or datetime, e.g. \"2026-08-06\" or \"2026-08-06T21:00:00Z\". Or jd: followed by a Julian Day on the UT scale, e.g. \"jd:2461000.5\". On astro_positions, date may list up to 24 datetimes separated by commas, answered in the order sent. Omit for the current moment. Years 1700 to 2200 only; outside that range the API refuses with DATE_OUT_OF_RANGE because the ephemeris is not reliable there.",
"type": "string"
},
"end": {
"description": "Last day of an explicit window, exclusive. ISO 8601 UTC date or datetime, e.g. \"2026-08-06\" or \"2026-08-06T21:00:00Z\". Or jd: followed by a Julian Day on the UT scale, e.g. \"jd:2461000.5\". On astro_positions, date may list up to 24 datetimes separated by commas, answered in the order sent. Omit for the current moment. Years 1700 to 2200 only; outside that range the API refuses with DATE_OUT_OF_RANGE because the ephemeris is not reliable there.",
"type": "string"
},
"kinds": {
"description": "Optional filter of event kinds. Omit for each planet's own family: the seven apparition kinds for mercury and venus, the four Sun-relative kinds for mars to neptune. peak_magnitude only ever fires for venus; the transit kinds are body-specific and genuinely rare. constellation_entry applies to all seven and must be listed.",
"items": {
"enum": [
"inferior_conjunction",
"superior_conjunction",
"greatest_elongation_east",
"greatest_elongation_west",
"peak_magnitude",
"transit_of_mercury",
"transit_of_venus",
"conjunction_with_sun",
"quadrature_west",
"opposition",
"quadrature_east",
"constellation_entry"
],
"type": "string"
},
"minItems": 1,
"type": "array"
},
"lat": {
"description": "Latitude in decimal degrees, north positive. Send lat and lon together.",
"maximum": 90,
"minimum": -90,
"type": "number"
},
"lon": {
"description": "Longitude in decimal degrees, east positive (Lisbon is about -9.14). Send lat and lon together.",
"maximum": 180,
"minimum": -180,
"type": "number"
},
"place": {
"description": "Place name instead of lat/lon, as \"City\" or \"City,CC\" with an ISO country code, e.g. \"Lisbon,PT\". Resolved server-side; the response then carries a required GeoNames CC BY 4.0 credit in its attribution field, which must be preserved when shown.",
"type": "string"
},
"start": {
"description": "First day of an explicit window (use with end). ISO 8601 UTC date or datetime, e.g. \"2026-08-06\" or \"2026-08-06T21:00:00Z\". Or jd: followed by a Julian Day on the UT scale, e.g. \"jd:2461000.5\". On astro_positions, date may list up to 24 datetimes separated by commas, answered in the order sent. Omit for the current moment. Years 1700 to 2200 only; outside that range the API refuses with DATE_OUT_OF_RANGE because the ephemeris is not reliable there.",
"type": "string"
},
"tz": {
"description": "IANA timezone like \"Europe/Lisbon\" to render event times in local time. Optional; a resolved place supplies its own timezone.",
"type": "string"
}
},
"type": "object"
},
"name": "astro_planet_events",
"outputSchema": {
"additionalProperties": true,
"description": "The MCP projection of a CycleCalcs v2 response: the answer, plus the provenance a caller needs to use it honestly.",
"properties": {
"attribution": {
"description": "The credit line to display verbatim when rights is attribution_required.",
"type": "string"
},
"data": {
"additionalProperties": true,
"description": "Planet events in a date range: the Mercury and Venus apparition events (conjunctions, greatest elongations, Venus's peak brightness, transits across the Sun), the Sun-relative events of Mars to Neptune (conjunction with the Sun, quadratures, opposition) and, when asked for, constellation entries. Stations (retrograde turning points) are not among them: astro_planet_board gives each planet's next station, and the full station list is served by the REST route /v2/retrogrades.",
"properties": {
"bodies": {
"description": "One entry per body, each holding its events in time order.",
"type": "array"
},
"body_count": {
"description": "How many bodies are covered.",
"type": "integer"
},
"definition": {
"description": "How each event kind is defined.",
"type": "string"
},
"event_count": {
"description": "How many events matched in total.",
"type": "integer"
},
"kinds_selected": {
"description": "The event kinds included.",
"type": "array"
},
"window": {
"description": "The range actually evaluated.",
"type": "object"
}
},
"type": "object"
},
"next_cursor": {
"description": "Present only when more rows exist. Send it back with the SAME start/end arguments as the first call to get the next page.",
"type": "string"
},
"not_computed": {
"description": "Data this API deliberately does not serve, and why. Present only when the question touched such a field. An absence named here is information: treat it as \"withheld\", never as \"none exists\".",
"type": "array"
},
"rights": {
"description": "Either unrestricted, or attribution_required when third-party place data was used. When attribution_required, the attribution line must be shown.",
"type": "string"
},
"warnings": {
"description": "Machine-readable notices about this answer. Present only when non-empty. Never changes whether the call succeeded.",
"type": "array"
}
},
"required": [
"data"
],
"type": "object"
}
},
{
"description": "Exact positions for up to 20 bodies at an instant or over a time grid: right ascension and declination in both J2000 and of-date frames, ecliptic longitude and latitude, distance, and, with a location, altitude and azimuth with refraction stated per field. With a location the position is topocentric, but tropical_sign and constellation stay geocentric, and meta.conventions.label_origin says so. Use for \"where exactly is X\". Do not pass earth. For rise and set TIMES use astro_rise_set; for a visibility overview of all planets use astro_planet_board.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"bodies": {
"description": "Bodies to report. Each entry: One of sun, moon, mercury, venus, mars, jupiter, saturn, uranus, neptune, pluto, or a fixed J2000 target as \"radec:RA,DEC\" with RA in hours (0-24) and DEC in degrees (-90..90), e.g. \"radec:5.6,-5.4\" for the Orion Nebula region.",
"items": {
"type": "string"
},
"maxItems": 20,
"minItems": 1,
"type": "array"
},
"cursor": {
"description": "Opaque pagination cursor from a previous result's next_cursor. Send it with the same start/end arguments as the first page.",
"type": "string"
},
"date": {
"description": "ISO 8601 UTC date or datetime, e.g. \"2026-08-06\" or \"2026-08-06T21:00:00Z\". Or jd: followed by a Julian Day on the UT scale, e.g. \"jd:2461000.5\". On astro_positions, date may list up to 24 datetimes separated by commas, answered in the order sent. Omit for the current moment. Years 1700 to 2200 only; outside that range the API refuses with DATE_OUT_OF_RANGE because the ephemeris is not reliable there.",
"type": "string"
},
"end": {
"description": "Grid end. ISO 8601 UTC date or datetime, e.g. \"2026-08-06\" or \"2026-08-06T21:00:00Z\". Or jd: followed by a Julian Day on the UT scale, e.g. \"jd:2461000.5\". On astro_positions, date may list up to 24 datetimes separated by commas, answered in the order sent. Omit for the current moment. Years 1700 to 2200 only; outside that range the API refuses with DATE_OUT_OF_RANGE because the ephemeris is not reliable there.",
"type": "string"
},
"lat": {
"description": "Latitude in decimal degrees, north positive. Send lat and lon together.",
"maximum": 90,
"minimum": -90,
"type": "number"
},
"lon": {
"description": "Longitude in decimal degrees, east positive (Lisbon is about -9.14). Send lat and lon together.",
"maximum": 180,
"minimum": -180,
"type": "number"
},
"place": {
"description": "Place name instead of lat/lon, as \"City\" or \"City,CC\" with an ISO country code, e.g. \"Lisbon,PT\". Resolved server-side; the response then carries a required GeoNames CC BY 4.0 credit in its attribution field, which must be preserved when shown.",
"type": "string"
},
"start": {
"description": "Grid start (use with end and step). ISO 8601 UTC date or datetime, e.g. \"2026-08-06\" or \"2026-08-06T21:00:00Z\". Or jd: followed by a Julian Day on the UT scale, e.g. \"jd:2461000.5\". On astro_positions, date may list up to 24 datetimes separated by commas, answered in the order sent. Omit for the current moment. Years 1700 to 2200 only; outside that range the API refuses with DATE_OUT_OF_RANGE because the ephemeris is not reliable there.",
"type": "string"
},
"step": {
"description": "Grid stride, e.g. \"1h\", \"10min\", \"1d\".",
"type": "string"
},
"tz": {
"description": "IANA timezone like \"Europe/Lisbon\" to render event times in local time. Optional; a resolved place supplies its own timezone.",
"type": "string"
}
},
"required": [
"bodies"
],
"type": "object"
},
"name": "astro_positions",
"outputSchema": {
"additionalProperties": true,
"description": "The MCP projection of a CycleCalcs v2 response: the answer, plus the provenance a caller needs to use it honestly.",
"properties": {
"attribution": {
"description": "The credit line to display verbatim when rights is attribution_required.",
"type": "string"
},
"data": {
"additionalProperties": true,
"description": "Where each requested body is, at an instant or sampled across a range.",
"properties": {
"bodies": {
"description": "SINGLE MODE: one entry per body, with its coordinates.",
"type": "array"
},
"instant": {
"description": "SINGLE MODE: the instant evaluated.",
"type": "string"
},
"series": {
"description": "RANGE MODE: one sample per step, each holding every body.",
"type": "array"
},
"window": {
"description": "RANGE MODE: the range actually evaluated.",
"type": "object"
}
},
"type": "object"
},
"next_cursor": {
"description": "Present only when more rows exist. Send it back with the SAME start/end arguments as the first call to get the next page.",
"type": "string"
},
"not_computed": {
"description": "Data this API deliberately does not serve, and why. Present only when the question touched such a field. An absence named here is information: treat it as \"withheld\", never as \"none exists\".",
"type": "array"
},
"rights": {
"description": "Either unrestricted, or attribution_required when third-party place data was used. When attribution_required, the attribution line must be shown.",
"type": "string"
},
"warnings": {
"description": "Machine-readable notices about this answer. Present only when non-empty. Never changes whether the call succeeded.",
"type": "array"
}
},
"required": [
"data"
],
"type": "object"
}
},
{
"description": "Rise, upper transit, set and lower transit for one body at one location, with an explicit status at extreme latitudes (circumpolar, never rises) instead of missing values. Accepts fixed radec targets. For the Sun specifically, astro_sun returns richer twilight structure; for positions between events use astro_positions.",
"inputSchema": {
"additionalProperties": false,
"anyOf": [
{
"required": [
"lat",
"lon"
]
},
{
"required": [
"place"
]
}
],
"properties": {
"body": {
"description": "One of sun, moon, mercury, venus, mars, jupiter, saturn, uranus, neptune, pluto, or a fixed J2000 target as \"radec:RA,DEC\" with RA in hours (0-24) and DEC in degrees (-90..90), e.g. \"radec:5.6,-5.4\" for the Orion Nebula region.",
"type": "string"
},
"cursor": {
"description": "Opaque pagination cursor from a previous result's next_cursor. Send it with the same start/end arguments as the first page.",
"type": "string"
},
"date": {
"description": "ISO 8601 UTC date or datetime, e.g. \"2026-08-06\" or \"2026-08-06T21:00:00Z\". Or jd: followed by a Julian Day on the UT scale, e.g. \"jd:2461000.5\". On astro_positions, date may list up to 24 datetimes separated by commas, answered in the order sent. Omit for the current moment. Years 1700 to 2200 only; outside that range the API refuses with DATE_OUT_OF_RANGE because the ephemeris is not reliable there.",
"type": "string"
},
"end": {
"description": "Last day of a daily series. ISO 8601 UTC date or datetime, e.g. \"2026-08-06\" or \"2026-08-06T21:00:00Z\". Or jd: followed by a Julian Day on the UT scale, e.g. \"jd:2461000.5\". On astro_positions, date may list up to 24 datetimes separated by commas, answered in the order sent. Omit for the current moment. Years 1700 to 2200 only; outside that range the API refuses with DATE_OUT_OF_RANGE because the ephemeris is not reliable there.",
"type": "string"
},
"lat": {
"description": "Latitude in decimal degrees, north positive. Send lat and lon together.",
"maximum": 90,
"minimum": -90,
"type": "number"
},
"lon": {
"description": "Longitude in decimal degrees, east positive (Lisbon is about -9.14). Send lat and lon together.",
"maximum": 180,
"minimum": -180,
"type": "number"
},
"place": {
"description": "Place name instead of lat/lon, as \"City\" or \"City,CC\" with an ISO country code, e.g. \"Lisbon,PT\". Resolved server-side; the response then carries a required GeoNames CC BY 4.0 credit in its attribution field, which must be preserved when shown.",
"type": "string"
},
"search_horizon_days": {
"description": "How many days ahead to search when an event does not occur on the requested day (high latitudes).",
"minimum": 1,
"type": "integer"
},
"start": {
"description": "First day of a daily series. ISO 8601 UTC date or datetime, e.g. \"2026-08-06\" or \"2026-08-06T21:00:00Z\". Or jd: followed by a Julian Day on the UT scale, e.g. \"jd:2461000.5\". On astro_positions, date may list up to 24 datetimes separated by commas, answered in the order sent. Omit for the current moment. Years 1700 to 2200 only; outside that range the API refuses with DATE_OUT_OF_RANGE because the ephemeris is not reliable there.",
"type": "string"
},
"tz": {
"description": "IANA timezone like \"Europe/Lisbon\" to render event times in local time. Optional; a resolved place supplies its own timezone.",
"type": "string"
}
},
"required": [
"body"
],
"type": "object"
},
"name": "astro_rise_set",
"outputSchema": {
"additionalProperties": true,
"description": "The MCP projection of a CycleCalcs v2 response: the answer, plus the provenance a caller needs to use it honestly.",
"properties": {
"attribution": {
"description": "The credit line to display verbatim when rights is attribution_required.",
"type": "string"
},
"data": {
"additionalProperties": true,
"description": "Rise, transit and set for one body, for a day or across a range.",
"properties": {
"body": {
"description": "SINGLE MODE: the events, with a status covering the polar cases where a body never rises or never sets.",
"type": "object"
},
"days": {
"description": "RANGE MODE ONLY: one entry per day.",
"type": "array"
},
"window": {
"description": "The day or range actually evaluated.",
"type": "object"
}
},
"type": "object"
},
"next_cursor": {
"description": "Present only when more rows exist. Send it back with the SAME start/end arguments as the first call to get the next page.",
"type": "string"
},
"not_computed": {
"description": "Data this API deliberately does not serve, and why. Present only when the question touched such a field. An absence named here is information: treat it as \"withheld\", never as \"none exists\".",
"type": "array"
},
"rights": {
"description": "Either unrestricted, or attribution_required when third-party place data was used. When attribution_required, the attribution line must be shown.",
"type": "string"
},
"warnings": {
"description": "Machine-readable notices about this answer. Present only when non-empty. Never changes whether the call succeeded.",
"type": "array"
}
},
"required": [
"data"
],
"type": "object"
}
},
{
"description": "One-call snapshot of the whole sky for a place and moment: moon phase and illumination, which planets are up and worth looking at, the next eclipse, and (with a location) sun times. Reach for this first when the question is broad, like \"what is in the sky tonight\". For solar-day detail use astro_sun; for choosing an observing night use astro_dark_window; for one planet's exact position use astro_positions.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"date": {
"description": "ISO 8601 UTC date or datetime, e.g. \"2026-08-06\" or \"2026-08-06T21:00:00Z\". Or jd: followed by a Julian Day on the UT scale, e.g. \"jd:2461000.5\". On astro_positions, date may list up to 24 datetimes separated by commas, answered in the order sent. Omit for the current moment. Years 1700 to 2200 only; outside that range the API refuses with DATE_OUT_OF_RANGE because the ephemeris is not reliable there.",
"type": "string"
},
"lat": {
"description": "Latitude in decimal degrees, north positive. Send lat and lon together.",
"maximum": 90,
"minimum": -90,
"type": "number"
},
"lon": {
"description": "Longitude in decimal degrees, east positive (Lisbon is about -9.14). Send lat and lon together.",
"maximum": 180,
"minimum": -180,
"type": "number"
},
"place": {
"description": "Place name instead of lat/lon, as \"City\" or \"City,CC\" with an ISO country code, e.g. \"Lisbon,PT\". Resolved server-side; the response then carries a required GeoNames CC BY 4.0 credit in its attribution field, which must be preserved when shown.",
"type": "string"
},
"tz": {
"description": "IANA timezone like \"Europe/Lisbon\" to render event times in local time. Optional; a resolved place supplies its own timezone.",
"type": "string"
}
},
"type": "object"
},
"name": "astro_sky_today",
"outputSchema": {
"additionalProperties": true,
"description": "The MCP projection of a CycleCalcs v2 response: the answer, plus the provenance a caller needs to use it honestly.",
"properties": {
"attribution": {
"description": "The credit line to display verbatim when rights is attribution_required.",
"type": "string"
},
"data": {
"additionalProperties": true,
"description": "A whole-sky snapshot for one place and moment.",
"properties": {
"local_date": {
"description": "The local calendar date the snapshot describes.",
"type": "string"
},
"moon": {
"description": "Phase, illuminated fraction, and rise/set.",
"type": "object"
},
"next_events": {
"description": "The next notable sky events, soonest first.",
"type": "array"
},
"night": {
"description": "When true darkness begins and ends tonight.",
"type": "object"
},
"planets_down": {
"description": "Planets below the horizon now.",
"type": "array"
},
"planets_up": {
"description": "Planets above the horizon now, brightest first.",
"type": "array"
},
"summary": {
"description": "A one-line plain-language reading of the whole snapshot.",
"type": "string"
},
"sun": {
"description": "Sunrise, sunset and the Sun's current position.",
"type": "object"
}
},
"type": "object"
},
"next_cursor": {
"description": "Present only when more rows exist. Send it back with the SAME start/end arguments as the first call to get the next page.",
"type": "string"
},
"not_computed": {
"description": "Data this API deliberately does not serve, and why. Present only when the question touched such a field. An absence named here is information: treat it as \"withheld\", never as \"none exists\".",
"type": "array"
},
"rights": {
"description": "Either unrestricted, or attribution_required when third-party place data was used. When attribution_required, the attribution line must be shown.",
"type": "string"
},
"warnings": {
"description": "Machine-readable notices about this answer. Present only when non-empty. Never changes whether the call succeeded.",
"type": "array"
}
},
"required": [
"data"
],
"type": "object"
}
},
{
"description": "The complete solar day for one location: sunrise, sunset, solar noon, day length, civil, nautical and astronomical twilight boundaries, and explicit polar day/night status at high latitudes. Location required. For a series, send start and end (step is whole days, e.g. \"1d\" or \"7d\"). For \"is it dark enough to observe\" prefer astro_dark_window; for a broad snapshot prefer astro_sky_today.",
"inputSchema": {
"additionalProperties": false,
"anyOf": [
{
"required": [
"lat",
"lon"
]
},
{
"required": [
"place"
]
}
],
"properties": {
"cursor": {
"description": "Opaque pagination cursor from a previous result's next_cursor. Send it with the same start/end arguments as the first page.",
"type": "string"
},
"date": {
"description": "Single day to report, ISO 8601 UTC date or datetime, e.g. \"2026-08-06\" or \"2026-08-06T21:00:00Z\". Or jd: followed by a Julian Day on the UT scale, e.g. \"jd:2461000.5\". On astro_positions, date may list up to 24 datetimes separated by commas, answered in the order sent. Omit for the current moment. Years 1700 to 2200 only; outside that range the API refuses with DATE_OUT_OF_RANGE because the ephemeris is not reliable there.",
"type": "string"
},
"end": {
"description": "Last day of a range. ISO 8601 UTC date or datetime, e.g. \"2026-08-06\" or \"2026-08-06T21:00:00Z\". Or jd: followed by a Julian Day on the UT scale, e.g. \"jd:2461000.5\". On astro_positions, date may list up to 24 datetimes separated by commas, answered in the order sent. Omit for the current moment. Years 1700 to 2200 only; outside that range the API refuses with DATE_OUT_OF_RANGE because the ephemeris is not reliable there.",
"type": "string"
},
"lat": {
"description": "Latitude in decimal degrees, north positive. Send lat and lon together.",
"maximum": 90,
"minimum": -90,
"type": "number"
},
"lon": {
"description": "Longitude in decimal degrees, east positive (Lisbon is about -9.14). Send lat and lon together.",
"maximum": 180,
"minimum": -180,
"type": "number"
},
"place": {
"description": "Place name instead of lat/lon, as \"City\" or \"City,CC\" with an ISO country code, e.g. \"Lisbon,PT\". Resolved server-side; the response then carries a required GeoNames CC BY 4.0 credit in its attribution field, which must be preserved when shown.",
"type": "string"
},
"start": {
"description": "First day of a range (use with end instead of date). ISO 8601 UTC date or datetime, e.g. \"2026-08-06\" or \"2026-08-06T21:00:00Z\". Or jd: followed by a Julian Day on the UT scale, e.g. \"jd:2461000.5\". On astro_positions, date may list up to 24 datetimes separated by commas, answered in the order sent. Omit for the current moment. Years 1700 to 2200 only; outside that range the API refuses with DATE_OUT_OF_RANGE because the ephemeris is not reliable there.",
"type": "string"
},
"step": {
"description": "Range stride in whole days, e.g. \"1d\", \"7d\", \"30d\". Default \"1d\".",
"type": "string"
},
"tz": {
"description": "IANA timezone like \"Europe/Lisbon\" to render event times in local time. Optional; a resolved place supplies its own timezone.",
"type": "string"
}
},
"type": "object"
},
"name": "astro_sun",
"outputSchema": {
"additionalProperties": true,
"description": "The MCP projection of a CycleCalcs v2 response: the answer, plus the provenance a caller needs to use it honestly.",
"properties": {
"attribution": {
"description": "The credit line to display verbatim when rights is attribution_required.",
"type": "string"
},
"data": {
"additionalProperties": true,
"description": "The complete solar day for one location, or one row per day in range mode.",
"properties": {
"blue_hour": {
"description": "The blue-light window just outside golden hour.",
"type": "object"
},
"constellation": {
"description": "The IAU constellation the Sun currently occupies.",
"type": "object"
},
"custom": {
"description": "Boundaries for any custom depression angles requested.",
"type": "array"
},
"dark_minutes": {
"description": "Minutes of true astronomical darkness.",
"type": "integer"
},
"day_length": {
"description": "Day length, human-readable.",
"type": "string"
},
"day_length_change_from_yesterday_seconds": {
"description": "Seconds gained or lost since the previous day. Negative means shortening.",
"type": "integer"
},
"day_length_minutes": {
"description": "Day length in minutes.",
"type": "number"
},
"day_length_seconds": {
"description": "Day length in whole seconds.",
"type": "integer"
},
"days": {
"description": "RANGE MODE ONLY: one entry per day, each with the fields above.",
"type": "array"
},
"golden_hour": {
"description": "The warm-light window around sunrise and sunset.",
"type": "object"
},
"night_begins": {
"description": "When astronomical night starts. Null where it never gets that dark.",
"type": [
"string",
"null"
]
},
"night_ends": {
"description": "When astronomical night ends. Null where it never gets that dark.",
"type": [
"string",
"null"
]
},
"position_now": {
"description": "Where the Sun is at this moment.",
"type": "object"
},
"rise_set": {
"description": "Sunrise and sunset, with a status for polar day and polar night.",
"type": "object"
},
"solar_midnight": {
"description": "Instant the Sun is lowest, opposite solar noon.",
"type": "string"
},
"solar_midnight_altitude_deg": {
"description": "Sun altitude at solar midnight, in degrees.",
"type": "number"
},
"solar_midnight_altitude_refracted_deg": {
"description": "Including refraction.",
"type": "number"
},
"solar_midnight_altitude_unrefracted_deg": {
"description": "Geometric, refraction excluded.",
"type": "number"
},
"solar_noon": {
"description": "Instant the Sun crosses the meridian.",
"type": "string"
},
"solar_noon_altitude_deg": {
"description": "Sun altitude at solar noon, in degrees.",
"type": "number"
},
"solar_noon_altitude_refracted_deg": {
"description": "As seen, including atmospheric refraction.",
"type": "number"
},
"solar_noon_altitude_unrefracted_deg": {
"description": "Geometric altitude, refraction excluded.",
"type": "number"
},
"solar_noon_azimuth_deg": {
"description": "Compass bearing of the Sun at solar noon.",
"type": "number"
},
"summary": {
"description": "A one-line reading of the solar day.",
"type": "string"
},
"tropical_sign": {
"description": "Tropical ecliptic longitude, reported as position only.",
"type": "object"
},
"twilight": {
"description": "Civil, nautical and astronomical twilight boundaries.",
"type": "object"
},
"window": {
"description": "The instant or range actually evaluated, after parsing.",
"type": "object"
}
},
"type": "object"
},
"next_cursor": {
"description": "Present only when more rows exist. Send it back with the SAME start/end arguments as the first call to get the next page.",
"type": "string"
},
"not_computed": {
"description": "Data this API deliberately does not serve, and why. Present only when the question touched such a field. An absence named here is information: treat it as \"withheld\", never as \"none exists\".",
"type": "array"
},
"rights": {
"description": "Either unrestricted, or attribution_required when third-party place data was used. When attribution_required, the attribution line must be shown.",
"type": "string"
},
"warnings": {
"description": "Machine-readable notices about this answer. Present only when non-empty. Never changes whether the call succeeded.",
"type": "array"
}
},
"required": [
"data"
],
"type": "object"
}
}
]
}Verify it yourself
curl -s https://api.teppi.xyz/v1/evidence/sha256:f79d72a6ac16690482ac29885d837cf4ec23dd7a6f513bbfe3eb52c1f6493a1a | sha256sum