关于 thirdtrail
thirdtrail 是用于调用 API 的 Python 客户端,可获取全球地点的太阳、月亮、曙暮光、太阳辐照度和潮汐数据。它提供按海拔校正的日月时间,以及针对 API 故障的类型化异常。
主要功能
- 01太阳、月亮和曙暮光数据
- 02按海拔校正事件时间
- 03太阳位置与辐照度接口
- 04潮位、高潮低潮与潮汐窗口
- 05带时区的 datetime 结果
- 06对暂时性故障和限流进行重试
适用场景
- 01计算特定海拔的日出与黄金时段
- 02获取太阳辐照度或每日光积分数据
- 03查看潮位及高潮或低潮时间
MCP 相关
README 提到有 MCP 服务以工具形式提供相同数据,但未说明该服务的接口。
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
https://thirdtrail.life/mcpclaude mcp add --transport http thirdtrail-thirdtrail https://thirdtrail.life/mcp{"mcpServers":{"thirdtrail-thirdtrail":{"type":"http","url":"https://thirdtrail.life/mcp"}}}在 Cursor 中打开{"servers":{"thirdtrail-thirdtrail":{"type":"http","url":"https://thirdtrail.life/mcp"}}}在 VS Code 中打开{"mcpServers":{"thirdtrail-thirdtrail":{"type":"http","url":"https://thirdtrail.life/mcp"}}}{"mcpServers":{"thirdtrail-thirdtrail":{"serverUrl":"https://thirdtrail.life/mcp"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
https://thirdtrail.life/mcp需要授权工具
8| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| tz | string | 否 | 输出时间戳使用的 IANA 时区,例如 Europe/Dublin。默认为 UTC。 |
| lat | number | 是 | 十进制度数表示的纬度。 |
| lon | number | 是 | 十进制度数表示的经度。 |
| days | integer | 否 | 要返回的天数。上限取决于套餐。 |
| elevation | number | 否 | 海拔高度,单位为米。已知时请提供:在海拔较高处,日出时间明显早于海平面计算结果。仅在海拔确实未知时省略。 |
| start_date | string | 否 | YYYY-MM-DD 格式的第一天。默认为今天。 |
详细介绍
thirdtrail
用于调用 thirdtrail API 的 Python 客户端:提供地球上任意位置的太阳、月亮、曙暮光、太阳辐照度和潮汐数据。太阳和月亮的时间会根据你传入的海拔进行校正。
pip install thirdtrail
from thirdtrail import Client
tt = Client(api_key="tt_live_…")
for day in tt.ephemerides(lat=53.3498, lon=-6.2603, elevation=20):
print(day.date, day.sun.rise, day.sun.set)
为什么要考虑海拔
大多数日出 API 给出的是海平面观测者的时间。你所处的位置越高,视野就越远,太阳也就越早越过地平线。
在莫赫悬崖(214 m),时间差约为 三分钟,日出、日落以及每个黄金时段和蓝色时段的起止时间都会相应变化:
| 海平面 | 海拔 214 m | |
|---|---|---|
| 日出 | 07:23:33 | 07:20:25 |
| 黄金时段,上午开始 | 06:56:51 | 06:53:42 |
| 月出 | 18:03:48 | 17:59:40 |
黄金时段持续 20 到 40 分钟,因此三分钟所占的比例不容忽视。知道海拔时,请传入 elevation。
你将获得什么
day.sun.rise # datetime, with its timezone offset intact
day.sun.golden_hour.morning.start
day.moon.phase.name # "Waxing Gibbous"
day.moon.phase.illumination # 0.7376
时间戳以带时区的 datetime 对象返回,而不是字符串。客户端尚未建模的内容仍可通过 day.raw 和 day.response 获取,因此服务器端新增字段时,你可以在客户端支持之前使用它。
端点
tt.ephemerides(lat=…, lon=…, elevation=…, days=7) # sun + moon + twilight
tt.prayer_times(lat=…, lon=…, school="mwl") # five daily prayers
tt.solar(lat=…, lon=…, timestamp=…) # position + irradiance
tt.solar_path(lat=…, lon=…, interval="5m") # the sun's arc, sampled
tt.solar_dli(lat=…, lon=…, from_date=…, to_date=…) # Daily Light Integral
tt.tide_heights(lat=…, lon=…, step="10m") # water height series
tt.tide_extremes(lat=…, lon=…) # high and low waters
tt.tide_window(lat=…, lon=…, elevation=…) # tides + sun + moon
tt.tide_constituents(lat=…, lon=…) # harmonic constants
潮汐数据不接受海拔参数,但有一个例外
tide_heights 和 tide_extremes 有意不提供 elevation 参数,因为你站得有多高并不会改变海面高度。如果传入该参数,会得到 TypeError,而不是被静默忽略。
tide_window 是个例外,因为它返回的数据中有一半是太阳和月亮数据:
for day in tt.tide_window(lat=52.9715, lon=-9.4309, elevation=214, days=3):
print(day.date, day.sun.golden_hour.morning.start)
for t in day.low_waters:
print(" low water", t.time, t.height_m)
潮汐高度以相对于**平均海平面(而非海图基准面)**的米数表示,且不包括天气导致的风暴潮。请勿用于导航。
错误
每种失败都有各自的异常类,因此你可以捕获所需的异常,而不必解析错误消息:
from thirdtrail import PlanLimitExceeded
try:
tt.tide_extremes(lat=51.5, lon=-2.7, days=90)
except PlanLimitExceeded as e:
tt.tide_extremes(lat=51.5, lon=-2.7, days=e.limit) # e.limit == 31
AuthenticationError(401)、PermissionDenied(403,当前订阅层级不包含此权限)、PlanLimitExceeded 和 InvalidRequest(400)、RateLimited(429)、DataUnavailable(503)、ServerError(5xx)。它们都继承自 ThirdtrailError。
瞬时故障和 429 错误会通过退避机制重试。订阅限额不会触发重试,因为相同的请求每次都会以相同方式失败。
密钥
前往 thirdtrail.life/apis/keys/ 创建密钥。一个密钥对应一个订阅,因此只能用于一个 API;使用潮汐密钥调用太阳端点会得到 PermissionDenied。
每个 API 都提供免费层级。
尚未涵盖的内容
此客户端尚未涵盖批量(POST)端点、iCalendar 订阅源或 webhook 管理。对于这些功能,请直接调用 REST API;完整规范以 OpenAPI 3.1 发布。
正在使用 AI Agent?这里有一个 MCP 服务,可将相同的数据作为工具提供。
许可证
MIT
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。