CycleCalcs Astronomy
Astronomy: sun, moon, planet, eclipse, twilight and star position calculations.
¿Debería usar esto?
Calidad y seguridad
Basado en el análisis automatizado de las definiciones de herramientas y el cumplimiento del protocolo.
Costo de contexto
Este es el número aproximado de tokens que se consumen cada vez que las herramientas del servidor se cargan en el contexto de un modelo. Los recuentos más altos reducen la atención disponible para otras tareas.
Instalar
Instalación con un clic
Agrega esto a tu archivo `claude_desktop_config.json`:
{
"mcpServers": {
"astronomy": {
"url": "https://www.cyclecalcs.com/mcp"
}
}
}Puntos de conexión remotos
https://www.cyclecalcs.com/mcpstreamable-httpQué puede hacer
Inventario de herramientas
Herramientas (11)
🟢astro_sky_today(date, lat, lon, place, tz)
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.
Esquema de entrada
{
"type": "object",
"properties": {
"date": {
"type": "string",
"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."
},
"lat": {
"type": "number",
"minimum": -90,
"maximum": 90,
"description": "Latitude in decimal degrees, north positive. Send lat and lon together."
},
"lon": {
"type": "number",
"minimum": -180,
"maximum": 180,
"description": "Longitude in decimal degrees, east positive (Lisbon is about -9.14). Send lat and lon together."
},
"place": {
"type": "string",
"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."
},
"tz": {
"type": "string",
"description": "IANA timezone like \"Europe/Lisbon\" to render event times in local time. Optional; a resolved place supplies its own timezone."
}
},
"additionalProperties": false
}Esquema de salida
{
"type": "object",
"properties": {
"data": {
"type": "object",
"description": "A whole-sky snapshot for one place and moment.",
"properties": {
"local_date": {
"type": "string",
"description": "The local calendar date the snapshot describes."
},
"sun": {
"type": "object",
"description": "Sunrise, sunset and the Sun's current position."
},
"moon": {
"type": "object",
"description": "Phase, illuminated fraction, and rise/set."
},
"planets_up": {
"type": "array",
"description": "Planets above the horizon now, brightest first."
},
"planets_down": {
"type": "array",
"description": "Planets below the horizon now."
},
"night": {
"type": "object",
"description": "When true darkness begins and ends tonight."
},
"next_events": {
"type": "array",
"description": "The next notable sky events, soonest first."
},
"summary": {
"type": "string",
"description": "A one-line plain-language reading of the whole snapshot."
}
},
"additionalProperties": true
},
"warnings": {
"type": "array",
"description": "Machine-readable notices about this answer. Present only when non-empty. Never changes whether the call succeeded."
},
"not_computed": {
"type": "array",
"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\"."
},
"rights": {
"type": "string",
"description": "Either unrestricted, or attribution_required when third-party place data was used. When attribution_required, the attribution line must be shown."
},
"attribution": {
"type": "string",
"description": "The credit line to display verbatim when rights is attribution_required."
},
"next_cursor": {
"type": "string",
"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."
}
},
"required": [
"data"
],
"description": "The MCP projection of a CycleCalcs v2 response: the answer, plus the provenance a caller needs to use it honestly.",
"additionalProperties": true
}🟢astro_sun(date, start, end, step, cursor, ...)
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.
Esquema de entrada
{
"type": "object",
"properties": {
"date": {
"type": "string",
"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."
},
"start": {
"type": "string",
"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."
},
"end": {
"type": "string",
"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."
},
"step": {
"type": "string",
"description": "Range stride in whole days, e.g. \"1d\", \"7d\", \"30d\". Default \"1d\"."
},
"cursor": {
"type": "string",
"description": "Opaque pagination cursor from a previous result's next_cursor. Send it with the same start/end arguments as the first page."
},
"lat": {
"type": "number",
"minimum": -90,
"maximum": 90,
"description": "Latitude in decimal degrees, north positive. Send lat and lon together."
},
"lon": {
"type": "number",
"minimum": -180,
"maximum": 180,
"description": "Longitude in decimal degrees, east positive (Lisbon is about -9.14). Send lat and lon together."
},
"place": {
"type": "string",
"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."
},
"tz": {
"type": "string",
"description": "IANA timezone like \"Europe/Lisbon\" to render event times in local time. Optional; a resolved place supplies its own timezone."
}
},
"additionalProperties": false,
"anyOf": [
{
"required": [
"lat",
"lon"
]
},
{
"required": [
"place"
]
}
]
}Esquema de salida
{
"type": "object",
"properties": {
"data": {
"type": "object",
"description": "The complete solar day for one location, or one row per day in range mode.",
"properties": {
"window": {
"type": "object",
"description": "The instant or range actually evaluated, after parsing."
},
"rise_set": {
"type": "object",
"description": "Sunrise and sunset, with a status for polar day and polar night."
},
"solar_noon": {
"type": "string",
"description": "Instant the Sun crosses the meridian."
},
"solar_noon_altitude_deg": {
"type": "number",
"description": "Sun altitude at solar noon, in degrees."
},
"solar_noon_altitude_refracted_deg": {
"type": "number",
"description": "As seen, including atmospheric refraction."
},
"solar_noon_altitude_unrefracted_deg": {
"type": "number",
"description": "Geometric altitude, refraction excluded."
},
"solar_noon_azimuth_deg": {
"type": "number",
"description": "Compass bearing of the Sun at solar noon."
},
"solar_midnight": {
"type": "string",
"description": "Instant the Sun is lowest, opposite solar noon."
},
"solar_midnight_altitude_deg": {
"type": "number",
"description": "Sun altitude at solar midnight, in degrees."
},
"solar_midnight_altitude_refracted_deg": {
"type": "number",
"description": "Including refraction."
},
"solar_midnight_altitude_unrefracted_deg": {
"type": "number",
"description": "Geometric, refraction excluded."
},
"day_length": {
"type": "string",
"description": "Day length, human-readable."
},
"day_length_minutes": {
"type": "number",
"description": "Day length in minutes."
},
"day_length_seconds": {
"type": "integer",
"description": "Day length in whole seconds."
},
"day_length_change_from_yesterday_seconds": {
"type": "integer",
"description": "Seconds gained or lost since the previous day. Negative means shortening."
},
"twilight": {
"type": "object",
"description": "Civil, nautical and astronomical twilight boundaries."
},
"custom": {
"type": "array",
"description": "Boundaries for any custom depression angles requested."
},
"golden_hour": {
"type": "object",
"description": "The warm-light window around sunrise and sunset."
},
"blue_hour": {
"type": "object",
"description": "The blue-light window just outside golden hour."
},
"night_begins": {
"type": [
"string",
"null"
],
"description": "When astronomical night starts. Null where it never gets that dark."
},
"night_ends": {
"type": [
"string",
"null"
],
"description": "When astronomical night ends. Null where it never gets that dark."
},
"dark_minutes": {
"type": "integer",
"description": "Minutes of true astronomical darkness."
},
"position_now": {
"type": "object",
"description": "Where the Sun is at this moment."
},
"tropical_sign": {
"type": "object",
"description": "Tropical ecliptic longitude, reported as position only."
},
"constellation": {
"type": "object",
"description": "The IAU constellation the Sun currently occupies."
},
"summary": {
"type": "string",
"description": "A one-line reading of the solar day."
},
"days": {
"type": "array",
"description": "RANGE MODE ONLY: one entry per day, each with the fields above."
}
},
"additionalProperties": true
},
"warnings": {
"type": "array",
"description": "Machine-readable notices about this answer. Present only when non-empty. Never changes whether the call succeeded."
},
"not_computed": {
"type": "array",
"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\"."
},
"rights": {
"type": "string",
"description": "Either unrestricted, or attribution_required when third-party place data was used. When attribution_required, the attribution line must be shown."
},
"attribution": {
"type": "string",
"description": "The credit line to display verbatim when rights is attribution_required."
},
"next_cursor": {
"type": "string",
"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."
}
},
"required": [
"data"
],
"description": "The MCP projection of a CycleCalcs v2 response: the answer, plus the provenance a caller needs to use it honestly.",
"additionalProperties": true
}🟢astro_moon(date, start, end, count, cursor, ...)
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.
Esquema de entrada
{
"type": "object",
"properties": {
"date": {
"type": "string",
"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."
},
"start": {
"type": "string",
"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."
},
"end": {
"type": "string",
"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."
},
"count": {
"type": "integer",
"minimum": 1,
"description": "Number of daily rows from start (alternative to end)."
},
"cursor": {
"type": "string",
"description": "Opaque pagination cursor from a previous result's next_cursor. Send it with the same start/end arguments as the first page."
},
"lat": {
"type": "number",
"minimum": -90,
"maximum": 90,
"description": "Latitude in decimal degrees, north positive. Send lat and lon together."
},
"lon": {
"type": "number",
"minimum": -180,
"maximum": 180,
"description": "Longitude in decimal degrees, east positive (Lisbon is about -9.14). Send lat and lon together."
},
"place": {
"type": "string",
"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."
},
"tz": {
"type": "string",
"description": "IANA timezone like \"Europe/Lisbon\" to render event times in local time. Optional; a resolved place supplies its own timezone."
}
},
"additionalProperties": false
}Esquema de salida
{
"type": "object",
"properties": {
"data": {
"type": "object",
"description": "The Moon's state and appearance, or a sampled series in range mode.",
"properties": {
"phase": {
"type": "object",
"description": "Phase name, angle and illuminated fraction."
},
"bright_limb": {
"type": "object",
"description": "Which way the lit edge points."
},
"magnitude": {
"type": "number",
"description": "Apparent visual brightness."
},
"distance_km": {
"type": "number",
"description": "Center-to-center distance in kilometres."
},
"distance_au": {
"type": "number",
"description": "The same distance in astronomical units."
},
"distance_basis": {
"type": "string",
"description": "Whether the distance is geocentric or topocentric."
},
"angular_diameter_arcsec": {
"type": "number",
"description": "Apparent disk size in arcseconds."
},
"fraction_of_mean_distance": {
"type": "number",
"description": "Distance relative to the mean, for supermoon claims."
},
"fraction_of_mean_distance_definition": {
"type": "string",
"description": "How that fraction is defined."
},
"libration": {
"type": "object",
"description": "The rocking that reveals a little of the far side."
},
"tropical_sign": {
"type": "object",
"description": "Tropical ecliptic longitude, reported as position only."
},
"constellation": {
"type": "object",
"description": "The IAU constellation the Moon currently occupies."
},
"position_geocentric": {
"type": "object",
"description": "Position as seen from Earth's center."
},
"position_topocentric": {
"type": "object",
"description": "Position as seen from the given location."
},
"parallax_deg": {
"type": "number",
"description": "Angular shift between those two viewpoints."
},
"window": {
"type": "object",
"description": "The instant or range actually evaluated."
},
"rise_set": {
"type": "object",
"description": "Moonrise and moonset for the location."
},
"event_definition": {
"type": "string",
"description": "The altitude convention rise and set are measured against."
},
"next_phases": {
"type": "array",
"description": "Upcoming quarter phases with exact instants."
},
"summary": {
"type": "string",
"description": "A one-line reading of the Moon right now."
},
"series": {
"type": "array",
"description": "RANGE MODE ONLY: one sampled entry per step."
}
},
"additionalProperties": true
},
"warnings": {
"type": "array",
"description": "Machine-readable notices about this answer. Present only when non-empty. Never changes whether the call succeeded."
},
"not_computed": {
"type": "array",
"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\"."
},
"rights": {
"type": "string",
"description": "Either unrestricted, or attribution_required when third-party place data was used. When attribution_required, the attribution line must be shown."
},
"attribution": {
"type": "string",
"description": "The credit line to display verbatim when rights is attribution_required."
},
"next_cursor": {
"type": "string",
"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."
}
},
"required": [
"data"
],
"description": "The MCP projection of a CycleCalcs v2 response: the answer, plus the provenance a caller needs to use it honestly.",
"additionalProperties": true
}🟢astro_moon_phases(date, start, end, count, phases, ...)
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.
Esquema de entrada
{
"type": "object",
"properties": {
"date": {
"type": "string",
"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."
},
"start": {
"type": "string",
"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."
},
"end": {
"type": "string",
"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."
},
"count": {
"type": "integer",
"minimum": 1,
"description": "How many phase events to return from the anchor date."
},
"phases": {
"type": "array",
"items": {
"type": "string",
"enum": [
"new_moon",
"first_quarter",
"full_moon",
"last_quarter"
]
},
"minItems": 1,
"description": "Optional filter of phase kinds. Omit for all four. Example: [\"full_moon\"] for full moons only."
},
"cursor": {
"type": "string",
"description": "Opaque pagination cursor from a previous result's next_cursor. Send it with the same start/end arguments as the first page."
},
"lat": {
"type": "number",
"minimum": -90,
"maximum": 90,
"description": "Latitude in decimal degrees, north positive. Send lat and lon together."
},
"lon": {
"type": "number",
"minimum": -180,
"maximum": 180,
"description": "Longitude in decimal degrees, east positive (Lisbon is about -9.14). Send lat and lon together."
},
"place": {
"type": "string",
"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."
},
"tz": {
"type": "string",
"description": "IANA timezone like \"Europe/Lisbon\" to render event times in local time. Optional; a resolved place supplies its own timezone."
}
},
"additionalProperties": false
}Esquema de salida
{
"type": "object",
"properties": {
"data": {
"type": "object",
"description": "New, first quarter, full and last quarter moons in a date range.",
"properties": {
"window": {
"type": "object",
"description": "The range actually evaluated."
},
"phase_count": {
"type": "integer",
"description": "How many phases fall in the window."
},
"phases": {
"type": "array",
"description": "Each phase with its exact instant and name."
},
"summary": {
"type": "string",
"description": "A one-line reading of the range."
}
},
"additionalProperties": true
},
"warnings": {
"type": "array",
"description": "Machine-readable notices about this answer. Present only when non-empty. Never changes whether the call succeeded."
},
"not_computed": {
"type": "array",
"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\"."
},
"rights": {
"type": "string",
"description": "Either unrestricted, or attribution_required when third-party place data was used. When attribution_required, the attribution line must be shown."
},
"attribution": {
"type": "string",
"description": "The credit line to display verbatim when rights is attribution_required."
},
"next_cursor": {
"type": "string",
"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."
}
},
"required": [
"data"
],
"description": "The MCP projection of a CycleCalcs v2 response: the answer, plus the provenance a caller needs to use it honestly.",
"additionalProperties": true
}🟢astro_positions(bodies, date, start, end, step, ...)
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.
Esquema de entrada
{
"type": "object",
"properties": {
"bodies": {
"type": "array",
"items": {
"type": "string"
},
"minItems": 1,
"maxItems": 20,
"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."
},
"date": {
"type": "string",
"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."
},
"start": {
"type": "string",
"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."
},
"end": {
"type": "string",
"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."
},
"step": {
"type": "string",
"description": "Grid stride, e.g. \"1h\", \"10min\", \"1d\"."
},
"cursor": {
"type": "string",
"description": "Opaque pagination cursor from a previous result's next_cursor. Send it with the same start/end arguments as the first page."
},
"lat": {
"type": "number",
"minimum": -90,
"maximum": 90,
"description": "Latitude in decimal degrees, north positive. Send lat and lon together."
},
"lon": {
"type": "number",
"minimum": -180,
"maximum": 180,
"description": "Longitude in decimal degrees, east positive (Lisbon is about -9.14). Send lat and lon together."
},
"place": {
"type": "string",
"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."
},
"tz": {
"type": "string",
"description": "IANA timezone like \"Europe/Lisbon\" to render event times in local time. Optional; a resolved place supplies its own timezone."
}
},
"required": [
"bodies"
],
"additionalProperties": false
}Esquema de salida
{
"type": "object",
"properties": {
"data": {
"type": "object",
"description": "Where each requested body is, at an instant or sampled across a range.",
"properties": {
"instant": {
"type": "string",
"description": "SINGLE MODE: the instant evaluated."
},
"bodies": {
"type": "array",
"description": "SINGLE MODE: one entry per body, with its coordinates."
},
"window": {
"type": "object",
"description": "RANGE MODE: the range actually evaluated."
},
"series": {
"type": "array",
"description": "RANGE MODE: one sample per step, each holding every body."
}
},
"additionalProperties": true
},
"warnings": {
"type": "array",
"description": "Machine-readable notices about this answer. Present only when non-empty. Never changes whether the call succeeded."
},
"not_computed": {
"type": "array",
"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\"."
},
"rights": {
"type": "string",
"description": "Either unrestricted, or attribution_required when third-party place data was used. When attribution_required, the attribution line must be shown."
},
"attribution": {
"type": "string",
"description": "The credit line to display verbatim when rights is attribution_required."
},
"next_cursor": {
"type": "string",
"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."
}
},
"required": [
"data"
],
"description": "The MCP projection of a CycleCalcs v2 response: the answer, plus the provenance a caller needs to use it honestly.",
"additionalProperties": true
}🟢astro_rise_set(body, date, start, end, search_horizon_days, ...)
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.
Esquema de entrada
{
"type": "object",
"properties": {
"body": {
"type": "string",
"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."
},
"date": {
"type": "string",
"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."
},
"start": {
"type": "string",
"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."
},
"end": {
"type": "string",
"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."
},
"search_horizon_days": {
"type": "integer",
"minimum": 1,
"description": "How many days ahead to search when an event does not occur on the requested day (high latitudes)."
},
"cursor": {
"type": "string",
"description": "Opaque pagination cursor from a previous result's next_cursor. Send it with the same start/end arguments as the first page."
},
"lat": {
"type": "number",
"minimum": -90,
"maximum": 90,
"description": "Latitude in decimal degrees, north positive. Send lat and lon together."
},
"lon": {
"type": "number",
"minimum": -180,
"maximum": 180,
"description": "Longitude in decimal degrees, east positive (Lisbon is about -9.14). Send lat and lon together."
},
"place": {
"type": "string",
"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."
},
"tz": {
"type": "string",
"description": "IANA timezone like \"Europe/Lisbon\" to render event times in local time. Optional; a resolved place supplies its own timezone."
}
},
"required": [
"body"
],
"additionalProperties": false,
"anyOf": [
{
"required": [
"lat",
"lon"
]
},
{
"required": [
"place"
]
}
]
}Esquema de salida
{
"type": "object",
"properties": {
"data": {
"type": "object",
"description": "Rise, transit and set for one body, for a day or across a range.",
"properties": {
"window": {
"type": "object",
"description": "The day or range actually evaluated."
},
"body": {
"type": "object",
"description": "SINGLE MODE: the events, with a status covering the polar cases where a body never rises or never sets."
},
"days": {
"type": "array",
"description": "RANGE MODE ONLY: one entry per day."
}
},
"additionalProperties": true
},
"warnings": {
"type": "array",
"description": "Machine-readable notices about this answer. Present only when non-empty. Never changes whether the call succeeded."
},
"not_computed": {
"type": "array",
"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\"."
},
"rights": {
"type": "string",
"description": "Either unrestricted, or attribution_required when third-party place data was used. When attribution_required, the attribution line must be shown."
},
"attribution": {
"type": "string",
"description": "The credit line to display verbatim when rights is attribution_required."
},
"next_cursor": {
"type": "string",
"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."
}
},
"required": [
"data"
],
"description": "The MCP projection of a CycleCalcs v2 response: the answer, plus the provenance a caller needs to use it honestly.",
"additionalProperties": true
}🟢astro_eclipses(direction, type, count, date, start, ...)
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.
Esquema de entrada
{
"type": "object",
"properties": {
"direction": {
"type": "string",
"enum": [
"next",
"previous"
],
"description": "Search direction from the anchor date. Default \"next\"."
},
"type": {
"type": "string",
"enum": [
"solar",
"lunar",
"both"
],
"description": "Which kind of eclipse to report. Default \"both\"."
},
"count": {
"type": "integer",
"minimum": 1,
"description": "How many eclipses PER TYPE to return."
},
"date": {
"type": "string",
"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."
},
"start": {
"type": "string",
"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."
},
"end": {
"type": "string",
"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."
},
"visible_only": {
"type": "boolean",
"description": "true keeps only eclipses visible from the supplied location (requires a location)."
},
"include": {
"type": "array",
"items": {
"type": "string",
"enum": [
"path",
"greatest"
]
},
"uniqueItems": true,
"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)."
},
"cursor": {
"type": "string",
"description": "Opaque pagination cursor from a previous result's next_cursor. Send it with the same start/end arguments as the first page."
},
"lat": {
"type": "number",
"minimum": -90,
"maximum": 90,
"description": "Latitude in decimal degrees, north positive. Send lat and lon together."
},
"lon": {
"type": "number",
"minimum": -180,
"maximum": 180,
"description": "Longitude in decimal degrees, east positive (Lisbon is about -9.14). Send lat and lon together."
},
"place": {
"type": "string",
"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."
},
"tz": {
"type": "string",
"description": "IANA timezone like \"Europe/Lisbon\" to render event times in local time. Optional; a resolved place supplies its own timezone."
}
},
"additionalProperties": false
}Esquema de salida
{
"type": "object",
"properties": {
"data": {
"type": "object",
"description": "Solar and lunar eclipses in a date range, optionally filtered to one location.",
"properties": {
"window": {
"type": "object",
"description": "The range actually evaluated."
},
"type": {
"type": "string",
"description": "Which kinds were asked for: solar, lunar or both."
},
"eclipse_count": {
"type": "integer",
"description": "How many eclipses matched."
},
"eclipses": {
"type": "array",
"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."
},
"next_visible": {
"type": "object",
"description": "Only when a location was given: the next one visible from there, with local circumstances."
},
"next_visible_note": {
"type": "string",
"description": "Only when a location was given: a caveat about that visibility, when one applies."
},
"central_geometry_note": {
"type": "string",
"description": "Only when solar eclipses are listed: the lunar-radius convention behind hybrid, the greatest_eclipse fields and the path."
},
"summary": {
"type": "string",
"description": "A one-line reading of the range."
}
},
"additionalProperties": true
},
"warnings": {
"type": "array",
"description": "Machine-readable notices about this answer. Present only when non-empty. Never changes whether the call succeeded."
},
"not_computed": {
"type": "array",
"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\"."
},
"rights": {
"type": "string",
"description": "Either unrestricted, or attribution_required when third-party place data was used. When attribution_required, the attribution line must be shown."
},
"attribution": {
"type": "string",
"description": "The credit line to display verbatim when rights is attribution_required."
},
"next_cursor": {
"type": "string",
"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."
}
},
"required": [
"data"
],
"description": "The MCP projection of a CycleCalcs v2 response: the answer, plus the provenance a caller needs to use it honestly.",
"additionalProperties": true
}🟢astro_dark_window(date, nights, moon_illumination_max, lat, lon, ...)
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.
Esquema de entrada
{
"type": "object",
"properties": {
"date": {
"type": "string",
"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."
},
"nights": {
"type": "integer",
"minimum": 1,
"maximum": 62,
"description": "How many nights to evaluate and rank. Default 1."
},
"moon_illumination_max": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Treat the Moon as tolerable below this illuminated fraction (0..1) even when up."
},
"lat": {
"type": "number",
"minimum": -90,
"maximum": 90,
"description": "Latitude in decimal degrees, north positive. Send lat and lon together."
},
"lon": {
"type": "number",
"minimum": -180,
"maximum": 180,
"description": "Longitude in decimal degrees, east positive (Lisbon is about -9.14). Send lat and lon together."
},
"place": {
"type": "string",
"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."
},
"tz": {
"type": "string",
"description": "IANA timezone like \"Europe/Lisbon\" to render event times in local time. Optional; a resolved place supplies its own timezone."
}
},
"additionalProperties": false,
"anyOf": [
{
"required": [
"lat",
"lon"
]
},
{
"required": [
"place"
]
}
]
}Esquema de salida
{
"type": "object",
"properties": {
"data": {
"type": "object",
"description": "The best genuinely dark observing windows across a range of nights.",
"properties": {
"method": {
"type": "object",
"description": "How darkness was defined and how nights were ranked."
},
"high_latitude_caution": {
"type": "boolean",
"description": "True when latitude makes true darkness scarce or absent, so the ranking means less."
},
"high_latitude_note": {
"type": [
"string",
"null"
],
"description": "The explanation when that caution is set."
},
"best_night_index": {
"type": "integer",
"description": "Index into `nights` of the best one."
},
"ranked": {
"type": "array",
"description": "Night indices best to worst."
},
"nights": {
"type": "array",
"description": "Each night with its dark window and what the Moon does to it."
},
"summary": {
"type": "object",
"description": "The recommendation in brief."
}
},
"additionalProperties": true
},
"warnings": {
"type": "array",
"description": "Machine-readable notices about this answer. Present only when non-empty. Never changes whether the call succeeded."
},
"not_computed": {
"type": "array",
"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\"."
},
"rights": {
"type": "string",
"description": "Either unrestricted, or attribution_required when third-party place data was used. When attribution_required, the attribution line must be shown."
},
"attribution": {
"type": "string",
"description": "The credit line to display verbatim when rights is attribution_required."
},
"next_cursor": {
"type": "string",
"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."
}
},
"required": [
"data"
],
"description": "The MCP projection of a CycleCalcs v2 response: the answer, plus the provenance a caller needs to use it honestly.",
"additionalProperties": true
}🟢astro_planet_board(date, bodies, sort, lat, lon, ...)
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.
Esquema de entrada
{
"type": "object",
"properties": {
"date": {
"type": "string",
"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."
},
"bodies": {
"type": "array",
"items": {
"type": "string"
},
"minItems": 1,
"maxItems": 8,
"description": "Optional subset of planets: mercury, venus, mars, jupiter, saturn, uranus, neptune, pluto."
},
"sort": {
"type": "string",
"enum": [
"distance_from_sun",
"magnitude",
"elongation",
"altitude"
],
"description": "Optional result ordering. Default is by distance from the Sun."
},
"lat": {
"type": "number",
"minimum": -90,
"maximum": 90,
"description": "Latitude in decimal degrees, north positive. Send lat and lon together."
},
"lon": {
"type": "number",
"minimum": -180,
"maximum": 180,
"description": "Longitude in decimal degrees, east positive (Lisbon is about -9.14). Send lat and lon together."
},
"place": {
"type": "string",
"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."
},
"tz": {
"type": "string",
"description": "IANA timezone like \"Europe/Lisbon\" to render event times in local time. Optional; a resolved place supplies its own timezone."
}
},
"additionalProperties": false
}Esquema de salida
{
"type": "object",
"properties": {
"data": {
"type": "object",
"description": "Which planets are worth looking at right now, and where.",
"properties": {
"instant": {
"type": "string",
"description": "The moment evaluated."
},
"count": {
"type": "integer",
"description": "How many bodies are on the board."
},
"summary": {
"type": "string",
"description": "A one-line reading of tonight's planets."
},
"retrograde_now": {
"type": "array",
"description": "Bodies currently in apparent retrograde motion."
},
"observable_now": {
"type": "array",
"description": "Bodies both up and realistically visible."
},
"above_horizon_now": {
"type": "array",
"description": "Bodies above the horizon, visible or not."
},
"bodies": {
"type": "array",
"description": "Every body with position, brightness and a visibility verdict."
}
},
"additionalProperties": true
},
"warnings": {
"type": "array",
"description": "Machine-readable notices about this answer. Present only when non-empty. Never changes whether the call succeeded."
},
"not_computed": {
"type": "array",
"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\"."
},
"rights": {
"type": "string",
"description": "Either unrestricted, or attribution_required when third-party place data was used. When attribution_required, the attribution line must be shown."
},
"attribution": {
"type": "string",
"description": "The credit line to display verbatim when rights is attribution_required."
},
"next_cursor": {
"type": "string",
"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."
}
},
"required": [
"data"
],
"description": "The MCP projection of a CycleCalcs v2 response: the answer, plus the provenance a caller needs to use it honestly.",
"additionalProperties": true
}🟢astro_planet_events(bodies, kinds, date, start, end, ...)
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.
Esquema de entrada
{
"type": "object",
"properties": {
"bodies": {
"type": "array",
"items": {
"type": "string",
"enum": [
"mercury",
"venus",
"mars",
"jupiter",
"saturn",
"uranus",
"neptune"
]
},
"minItems": 1,
"maxItems": 7,
"description": "Which planets to report. Default mercury and venus."
},
"kinds": {
"type": "array",
"items": {
"type": "string",
"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"
]
},
"minItems": 1,
"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."
},
"date": {
"type": "string",
"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."
},
"start": {
"type": "string",
"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."
},
"end": {
"type": "string",
"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."
},
"cursor": {
"type": "string",
"description": "Opaque pagination cursor from a previous result's next_cursor. Send it with the same start/end arguments as the first page."
},
"lat": {
"type": "number",
"minimum": -90,
"maximum": 90,
"description": "Latitude in decimal degrees, north positive. Send lat and lon together."
},
"lon": {
"type": "number",
"minimum": -180,
"maximum": 180,
"description": "Longitude in decimal degrees, east positive (Lisbon is about -9.14). Send lat and lon together."
},
"place": {
"type": "string",
"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."
},
"tz": {
"type": "string",
"description": "IANA timezone like \"Europe/Lisbon\" to render event times in local time. Optional; a resolved place supplies its own timezone."
}
},
"additionalProperties": false
}Esquema de salida
{
"type": "object",
"properties": {
"data": {
"type": "object",
"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": {
"window": {
"type": "object",
"description": "The range actually evaluated."
},
"definition": {
"type": "string",
"description": "How each event kind is defined."
},
"kinds_selected": {
"type": "array",
"description": "The event kinds included."
},
"body_count": {
"type": "integer",
"description": "How many bodies are covered."
},
"event_count": {
"type": "integer",
"description": "How many events matched in total."
},
"bodies": {
"type": "array",
"description": "One entry per body, each holding its events in time order."
}
},
"additionalProperties": true
},
"warnings": {
"type": "array",
"description": "Machine-readable notices about this answer. Present only when non-empty. Never changes whether the call succeeded."
},
"not_computed": {
"type": "array",
"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\"."
},
"rights": {
"type": "string",
"description": "Either unrestricted, or attribution_required when third-party place data was used. When attribution_required, the attribution line must be shown."
},
"attribution": {
"type": "string",
"description": "The credit line to display verbatim when rights is attribution_required."
},
"next_cursor": {
"type": "string",
"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."
}
},
"required": [
"data"
],
"description": "The MCP projection of a CycleCalcs v2 response: the answer, plus the provenance a caller needs to use it honestly.",
"additionalProperties": true
}🟢astro_find_place(query, id, lat, lon, country, ...)
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.
Esquema de entrada
{
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "Place name to search for, e.g. \"Springfield\"."
},
"id": {
"type": "string",
"description": "A place_id from an earlier result, to fetch that exact place."
},
"lat": {
"type": "number",
"minimum": -90,
"maximum": 90,
"description": "Latitude in decimal degrees, north positive. Send lat and lon together."
},
"lon": {
"type": "number",
"minimum": -180,
"maximum": 180,
"description": "Longitude in decimal degrees, east positive (Lisbon is about -9.14). Send lat and lon together."
},
"country": {
"type": "string",
"description": "Two-letter ISO country code filter, e.g. \"US\"."
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 20,
"description": "Maximum matches to return. Default 5."
}
},
"additionalProperties": false
}Esquema de salida
{
"type": "object",
"properties": {
"data": {
"type": "object",
"description": "Coordinates for a place name, or the nearest named places to coordinates.",
"properties": {
"mode": {
"type": "string",
"description": "Whether this was a name search or a reverse lookup."
},
"matched": {
"type": "integer",
"description": "How many places matched before any limit was applied."
},
"found": {
"type": "integer",
"description": "How many are returned here."
},
"results": {
"type": "array",
"description": "Each place with coordinates, country, population and a place_id that other tools accept."
},
"index": {
"type": "object",
"description": "Which place index answered, and its vintage."
}
},
"additionalProperties": true
},
"warnings": {
"type": "array",
"description": "Machine-readable notices about this answer. Present only when non-empty. Never changes whether the call succeeded."
},
"not_computed": {
"type": "array",
"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\"."
},
"rights": {
"type": "string",
"description": "Either unrestricted, or attribution_required when third-party place data was used. When attribution_required, the attribution line must be shown."
},
"attribution": {
"type": "string",
"description": "The credit line to display verbatim when rights is attribution_required."
},
"next_cursor": {
"type": "string",
"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."
}
},
"required": [
"data"
],
"description": "The MCP projection of a CycleCalcs v2 response: the answer, plus the provenance a caller needs to use it honestly.",
"additionalProperties": true
}Comunidad
Evidencia