CycleCalcs Astronomy

Read-only astronomy calculations: sun, moon, planets, eclipses, twilight and star positions.

我该使用它吗

质量与安全性

A
描述质量
100%
模式完整度
92%
命名质量
80%
投毒风险
100%
权限匹配度
100%
协议合规性
100%

基于对工具定义和协议合规性的自动分析。

上下文开销

~13,466token 数(工具定义)
~13.4 KB典型响应大小
对注意力有显著影响(占 128k 上下文窗口的 10.52%)

这是每次将服务器的工具加载到模型上下文窗口时所消耗的大致 token 数。数值越高,可用于其他任务的注意力就越少。

安装

一键安装

将以下内容添加到你的 `claude_desktop_config.json` 文件中:

{
  "mcpServers": {
    "astronomy": {
      "url": "https://www.cyclecalcs.com/mcp"
    }
  }
}

远程端点

https://www.cyclecalcs.com/mcpstreamable-http

它能做什么

工具清单

工具(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.

输入模式

{
  "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
}

输出模式

{
  "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.

输入模式

{
  "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"
      ]
    }
  ]
}

输出模式

{
  "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.

输入模式

{
  "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
}

输出模式

{
  "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.

输入模式

{
  "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
}

输出模式

{
  "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.

输入模式

{
  "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
}

输出模式

{
  "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.

输入模式

{
  "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"
      ]
    }
  ]
}

输出模式

{
  "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.

输入模式

{
  "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
}

输出模式

{
  "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.

输入模式

{
  "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"
      ]
    }
  ]
}

输出模式

{
  "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.

输入模式

{
  "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
}

输出模式

{
  "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.

输入模式

{
  "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
}

输出模式

{
  "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.

输入模式

{
  "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
}

输出模式

{
  "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
}

社区

评价此服务器

证据

最近观测

已验证未记录版本11 个工具
已验证未记录版本11 个工具