关于 astronomy-mcp-server
astronomy-mcp-server 为 MCP 客户端离线计算天体位置、升落时间、月相和天文事件。可选扩展还提供 JPL Horizons 星历与卫星过境信息。
主要功能
- 01太阳系天体与星表恒星的位置
- 02升落、中天与晨昏时刻
- 03月相及即将发生的天文事件
- 04当前可见天体的排序列表
- 05可选星历与卫星过境信息
适用场景
- 01查询观测目标行星的位置
- 02查看指定地点的晨昏与升落时间
- 03规划观星活动或查看卫星过境
MCP 相关
它向 MCP 客户端提供 7 个工具、1 个天体信息资源和 1 个观星计划提示词,并支持 STDIO 与 Streamable HTTP 传输。
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
https://astronomy.caseyjhand.com/mcpclaude mcp add --transport http cyanheads-astronomy https://astronomy.caseyjhand.com/mcp{"mcpServers":{"cyanheads-astronomy":{"type":"http","url":"https://astronomy.caseyjhand.com/mcp"}}}在 Cursor 中打开{"servers":{"cyanheads-astronomy":{"type":"http","url":"https://astronomy.caseyjhand.com/mcp"}}}在 VS Code 中打开{"mcpServers":{"cyanheads-astronomy":{"type":"http","url":"https://astronomy.caseyjhand.com/mcp"}}}{"mcpServers":{"cyanheads-astronomy":{"serverUrl":"https://astronomy.caseyjhand.com/mcp"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
工具
7| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| body | enum | 否 | 要定位的太阳系天体。通过 `star` 指定恒星时省略。sun | moon | mercury | venus | mars | jupiter | saturn | uranus | neptune | pluto |
| star | string | 否 | 要定位的恒星,须来自包含 32 颗恒星的内置星表——约 30 颗最亮的肉眼可见恒星,以及北极星;不接受任意恒星。可使用常用名称或拜耳命名,希腊字母可拼写或使用符号,星座名称可用属格或 IAU 缩写(例如 "Sirius"、"Alpha Centauri"、"α CMa")。名称不在星表中时,将返回完整的星表列表。优先于 `body`。 |
| time | string | 否 | 观测时刻,使用 ISO 8601 UTC 字符串,例如 "2024-04-08T18:00:00Z"。默认为当前时间。未带时区标识符的值将按 UTC 读取,而非服务器进程的本地时区。 |
| latitude | number | 是 | 观测者纬度,单位为十进制度,北纬为正。 |
| timezone | string | 否 | 用于本地化输出的 IANA 时区,例如 "America/Los_Angeles"。省略时仅输出 UTC。 |
| elevation | number | 否 | 观测者海拔,单位为米(海平面以上)。默认为 0。 |
| longitude | number | 是 | 观测者经度,以十进制度表示,东经为正。 |
详细介绍
@cyanheads/astronomy-mcp-server
离线计算天空中的天体:通过 MCP 查询任意地点和时间的行星与卫星位置、升起和落下时间、相位、日食和季节。支持 STDIO 或 Streamable HTTP。
概述
适用于任意地点和时间的观测天文学:天体位置、升起和落下时间及曙暮光时间、月相,以及下一次日食、春分或秋分、冲或合——也可以直接询问此刻能看到什么。由 astronomy-engine 在本地计算,并可选使用 JPL Horizons 星历和卫星过境信息。
工具
| 工具 | 描述 |
|---|---|
astronomy_get_sky_position | 单个天体或指定恒星的视位置:赤经/赤纬、地平高度/方位角、黄道坐标、视星等、相位、日距角、星座 |
astronomy_get_rise_set | 天体的升起、落下和中天时间;以及太阳的民用、航海和天文曙暮光时间 |
astronomy_get_moon_phase | 照明比例、月相名称、朔望月龄,以及接下来的四个盈亏相位 |
astronomy_find_events | 下一次日食、春分或秋分、至点、月相四分点、冲、合、大距或远近日点事件 |
astronomy_list_visible | 当前可见天体:地平线以上肉眼可见的天体(以及可选的亮星),按排名列出,并提供天空状况筛选 |
astronomy_get_ephemeris | 从 JPL Horizons 获取小天体或航天器星历(可选) |
astronomy_get_satellite_passes | 根据 CelesTrak 轨道根数集通过 SGP4 传播计算可见卫星过境信息(可选) |
资源
| 资源 | 描述 |
|---|---|
astronomy://body/{body} | 太阳系天体参考卡片:名称、类型、平均半径、肉眼可见性 |
仅支持工具的客户端也能从 astronomy_get_sky_position 获取相同的类型、半径和肉眼可见性字段。
提示词
| 提示词 | 描述 |
|---|---|
astronomy_stargazing_plan | 从某个地点规划一晚观星活动,并串联天文学工具、地理编码和天气步骤 |
设计参考:docs/design.md。
功能参考
astronomy_get_sky_position 工具
- 必须提供
body(sun、moon、mercury…pluto)或star;两者都设置时以star为准。star会根据常用名称或拜耳命名(Sirius、α CMa)在内置的 32 颗恒星目录中查找;找不到时会返回star_not_found,并列出该目录 - 返回
equatorial、经折射校正的horizontal和ecliptic坐标,以及magnitude、angular_diameter_arcsec、phase_angle_degrees、illuminated_fraction、sun_elongation_degrees和constellation - 太阳系天体还会包含
body_metadata、资源卡片的type、mean_radius_km和naked_eye;恒星则不包含这些字段
astronomy_get_rise_set 工具
- 搜索一个
body,从start(默认当前时间)开始,向后查找接下来的count个周期,默认值为 1。每次调用最多返回 31 个周期;若count不超过 366,则返回前 31 个周期,并通过提示说明用于继续查询序列的start和count - 每个周期包含
rise_utc、set_utc、transit_utc和transit_altitude_degrees;对于拱极天体或永不升起的天体,rise和set为null,并提供note,而不是报错 - 对于
body: "sun",twilight包含每个周期所对应日期之后夜晚的民用、航海和天文暮光及黎明时段。若第一个日期在start之后开始,night_in_progress会包含此前的夜晚,包括没有日落的极夜;否则第一个周期会包含自身对应的夜晚。每组时段都不会超出该夜晚的范围,并且仍会包含早于start的时刻
astronomy_get_moon_phase 工具
- 地心观测:仅接受
time(默认当前时间)和可选的timezone - 返回
illuminated_fraction、phase_name、age_days、next_quarters和phase_longitude_degrees(0 表示新月,180 表示满月);此字段不同于astronomy_get_sky_position的phase_angle_degrees
astronomy_find_events 工具
- 查询一种
event(solar_eclipse、lunar_eclipse、equinox、solstice、moon_quarter、opposition、conjunction、max_elongation、perigee_apogee)及其接下来的count次发生,默认值为 1。每次调用最多返回 20 次;若count不超过 200,则返回前 20 次,并通过提示说明用于继续查询序列的start和count;搜索截止于 2100 年底 - 与天体相关的事件必须提供
body(否则返回body_required);若该事件不适用于指定天体,则返回body_not_supported。conjunction若提供body2,则该值必须是月球或不同于body的行星(否则返回invalid_body_pair),并会报告separation_degrees - 日食和月食可选提供观测者位置(必须同时提供
latitude和longitude,否则返回incomplete_observer),以添加local_visible和contact_altitudes_degrees - 日食和月食若其峰值发生在
start或之后,则会被纳入;其接触时刻可能早于start
astronomy_list_visible 工具
- 提供观测者坐标和一个评估时刻
time(默认当前时间,不是时间窗口);min_altitude(默认 0)和include_stars(默认 false)用于筛选列表 - 返回
sky_condition(daylight、civil_twilight、nautical_twilight、astronomical_twilight、dark)、sun_altitude_degrees,以及按亮度和高度从高到低排序的bodies。每个天体都附有visibility_note,说明日光、民用暮光或太阳周围 15° 内的强光何时会遮蔽或削弱其可见度
astronomy_get_ephemeris 工具
designation会原样传递给 Horizons(编号小行星使用"433;",周期彗星使用"DES=1P;CAP",航天器使用负数 SPK-ID);start默认为现在,stop默认为 24 h 后,step默认为"1h"(数字加上m、h、d、mo或y);同时提供latitude和longitude时会添加高度角/方位角- 每次调用最多返回 200 行;当
truncated为 true 时,提示会指出可用于继续查询的start。target_name是 Horizons 解析出的天体名称 - 失败时会返回
ambiguous_designation、observer_is_target、body_not_found、invalid_step、invalid_elevation、time_out_of_range或request_rejected,并指出需要更正的输入 - 仅当
ASTRONOMY_ENABLE_HORIZONS=true时注册
astronomy_get_satellite_passes 工具
norad_id和name必须且只能提供一个(ISS、Hubble/HST 和 Tiangong/CSS 可直接解析;其他名称会与 CelesTrak 匹配,若名称不明确,则会返回ambiguous_satellite_name并列出候选项);start必须在距今天约一个月的范围内,days默认为 7- 每次调用搜索 10 天;
days最大可设为 30,但只返回前 10 天的结果,并提示可用于继续搜索的start和days - 返回
norad_id、satellite_name和符合可见条件(受日照、高度角高于 10°、太阳低于 −6°)的passes;每项包含升起/最高点/落下时间及方位角、peak_altitude_degrees、duration_seconds、sunlit和visible_start_utc/visible_end_utc - 仅当
ASTRONOMY_ENABLE_SATELLITES=true时注册
astronomy://body/{body} 资源
{body}可以是sun、moon、mercury…pluto中的一个,并支持名称补全;其他值会返回unknown_bodyapplication/json卡片包含body、name、type(star/planet/moon/dwarf)、mean_radius_km和naked_eye
astronomy_stargazing_plan 提示词
- 参数:必填的
location;可选的date(YYYY-MM-DD),默认为今晚 - 返回一条用户消息,依次调用
astronomy_get_rise_set(先太阳,再月亮)、astronomy_get_moon_phase和带有include_stars的astronomy_list_visible,并包含此服务未覆盖的地理编码和天气步骤
功能
基于 @cyanheads/mcp-ts-core 构建:支持 stdio 和 Streamable HTTP 传输、可插拔身份验证(none / jwt / oauth)、可切换存储(in-memory、filesystem、Supabase、Cloudflare KV/R2/D1),以及支持可选 OpenTelemetry 跟踪的结构化日志记录。
天文学专属功能:
- 无需密钥、离线且确定性的核心:五个核心工具无需网络、API 密钥或速率限制;对于相同的天体、时间和观测者,返回相同结果
- 超出引擎高精度时间范围(约 1900–2100)的时间会返回
time_out_of_range;Horizons 工具则受各目标自身数据范围限制 - 时间采用 ISO 8601 UTC 格式;未指定时区的值会按 UTC 读取;传入 IANA
timezone(或设置ASTRONOMY_DEFAULT_TIMEZONE),即可在 UTC 字段之外获取*_local字段。服务绝不会根据坐标推断时区 - 不提供地理编码:请先在上游将地点名称解析为纬度、经度和时区,再传入坐标(
elevation默认为 0 m) - 两个可选扩展各自具有超时和重试机制;上游故障会返回
horizons_unavailable或celestrak_unavailable,绝不会回退到核心输出
便于 Agent 使用的输出:
- 保留不确定性:引擎无法计算时,
magnitude、angular_diameter_arcsec、phase_angle_degrees和illuminated_fraction为null,并显示为“unavailable”,绝不会置为零 - 确定性的可见性说明:
visibility_note根据真实星等、高度、天空状况和太阳距角生成,而非使用合成评分 - 类型化错误契约:每个已声明的故障都包含类型化的
reason和恢复提示,以便调用方修正并重试 - 精确值保留在舍入文本中:
format()会将每个舍入后的数值与方括号中的精确值配对(RA 4.4116 h [4.411597993526305]),因此仅使用content[]的客户端也不会丢失精度
开始使用
公共托管实例
可使用公共实例:https://astronomy.caseyjhand.com/mcp,无需安装。该实例提供 Streamable HTTP;每个客户端的配置格式各不相同。
对于 Claude Code:
claude mcp add --transport http astronomy-mcp-server https://astronomy.caseyjhand.com/mcp
对于 Cline(cline_mcp_settings.json):
{
"mcpServers": {
"astronomy-mcp-server": {
"type": "streamableHttp",
"url": "https://astronomy.caseyjhand.com/mcp"
}
}
}
对于 Cursor(mcp.json):
{
"mcpServers": {
"astronomy-mcp-server": {
"url": "https://astronomy.caseyjhand.com/mcp"
}
}
}
Claude Desktop 可在 Settings → Connectors 下添加远程服务。
自托管 / 本地运行
将以下内容添加到 MCP 客户端配置文件中。核心工具无需配置;设置 ASTRONOMY_ENABLE_HORIZONS 和/或 ASTRONOMY_ENABLE_SATELLITES 为 true,即可注册扩展。
{
"mcpServers": {
"astronomy-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/astronomy-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}
也可通过 npx 运行(无需 Bun):
{
"mcpServers": {
"astronomy-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/astronomy-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}
也可通过 Docker 运行:
{
"mcpServers": {
"astronomy-mcp-server": {
"type": "stdio",
"command": "docker",
"args": ["run", "-i", "--rm", "-e", "MCP_TRANSPORT_TYPE=stdio", "ghcr.io/cyanheads/astronomy-mcp-server:latest"]
}
}
}
对于 Streamable HTTP,设置传输方式并启动服务:
MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 bun run start:http
# Server listens at http://localhost:3010/mcp
先决条件
- Bun v1.4.0 或更高版本(或 Node.js v24+)。
- 无需 API 密钥。核心功能可离线运行,两个扩展(JPL Horizons、CelesTrak)也无需密钥。
安装
- 克隆代码库:
git clone https://github.com/cyanheads/astronomy-mcp-server.git
- 进入目录:
cd astronomy-mcp-server
- 安装依赖:
bun install
- 配置环境(可选):
cp .env.example .env
# edit .env only to enable the extensions or override a default
配置
所有变量均为可选项;不设置任何变量也能运行核心功能。
| 变量 | 说明 | 默认值 |
|---|---|---|
ASTRONOMY_ENABLE_HORIZONS | 注册 astronomy_get_ephemeris(JPL Horizons)。 | false |
ASTRONOMY_ENABLE_SATELLITES | 注册 astronomy_get_satellite_passes(CelesTrak + SGP4)。 | false |
ASTRONOMY_DEFAULT_TIMEZONE | 调用未提供 timezone 时使用的备用 IANA 时区。未设置时仅输出 UTC。 | 无 |
ASTRONOMY_REQUEST_TIMEOUT_MS | Horizons 和 CelesTrak 请求的 HTTP 超时时间,单位为毫秒。 | 15000 |
ASTRONOMY_TLE_CACHE_TTL_MS | 进程内轨道根数集缓存的 TTL,单位为毫秒。2 小时的默认值遵循 CelesTrak 的重新获取建议。 | 7200000 |
ASTRONOMY_HORIZONS_BASE_URL | JPL Horizons API 端点。 | https://ssd.jpl.nasa.gov/api/horizons.api |
ASTRONOMY_CELESTRAK_BASE_URL | CelesTrak GP 端点。 | https://celestrak.org/NORAD/elements/gp.php |
MCP_TRANSPORT_TYPE | 传输方式:stdio 或 http。 | stdio |
MCP_HTTP_PORT | HTTP 服务端口。 | 3010 |
MCP_SESSION_MODE | HTTP 会话模式:stateless、stateful 或 auto。 | stateless |
MCP_AUTH_MODE | 身份验证方式:none、jwt 或 oauth。 | none |
MCP_LOG_LEVEL | 日志级别(debug、info、warning、error 等)。 | info |
OTEL_ENABLED | 启用 OpenTelemetry。 | false |
完整的可选覆盖项列表请参阅 .env.example。
运行服务
本地开发
-
构建并运行:
# One-time build bun run rebuild # Run the built server bun run start:stdio # or bun run start:http -
运行检查和测试:
bun run devcheck # Lint, format, typecheck, security bun run test # Vitest test suite bun run lint:mcp # Validate MCP definitions against spec
Docker
docker build -t astronomy-mcp-server .
docker run --rm -p 3010:3010 astronomy-mcp-server
Dockerfile 默认使用 HTTP 传输、无状态会话模式,并将日志写入 /var/log/astronomy-mcp-server。默认会安装 OpenTelemetry 对等依赖项;构建时使用 --build-arg OTEL_ENABLED=false 可省略这些依赖项。
项目结构
| 目录 | 用途 |
|---|---|
src/index.ts | createApp() 入口点 — 注册工具、资源和提示词,并初始化服务。 |
src/config | 使用 Zod 解析和验证特定于服务的环境变量。 |
src/mcp-server/tools | 工具定义(*.tool.ts)。包含五个核心工具和两个可选扩展。 |
src/mcp-server/resources | 资源定义(*.resource.ts)。天体参考卡。 |
src/mcp-server/prompts | 提示词定义(*.prompt.ts)。观星计划。 |
src/services/ephemeris | 离线计算核心 — astronomy-engine 封装、天体表和亮星目录。 |
src/services/horizons | JPL Horizons HTTP 客户端(扩展)。 |
src/services/satellite | 获取 CelesTrak 轨道根数集并进行 SGP4 推算(扩展)。 |
tests/ | 与 src/ 对应的单元测试和集成测试。 |
开发指南
开发指南和架构规则请参阅 CLAUDE.md。简而言之:
- 处理程序抛出异常,框架负责捕获 — 工具逻辑中不要使用
try/catch - 使用
ctx.log记录请求范围内的日志,使用ctx.state存储租户范围内的数据 - 在
src/index.ts的createApp()数组中注册新工具和资源 - 将引擎/API 的原始值规范化为领域类型;将不确定值保留为
null,绝不伪造缺失字段
贡献
欢迎提交问题。提交前请运行检查和测试:
bun run devcheck
bun run test
许可证
Apache-2.0 — 详情请参阅 LICENSE。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。