thirdtrail
Elevation-corrected sun, moon, twilight, solar and tide data for any point on Earth
Should I use this
Quality & Safety
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"thirdtrail": {
"url": "https://thirdtrail.life/mcp"
}
}
}Remote endpoints
https://thirdtrail.life/mcpstreamable-httpWhat it can do
Tool inventory
Tools (8)
🟢get_sun_moon_times(lat, lon, tz, elevation, days, ...)
Sunrise, sunset, solar noon, civil, nautical and astronomical twilight, golden and blue hour, moonrise, moonset and moon phase for a location, one entry per day. Use it for any question about when the sun or moon rises, sets or gets dark; for the sun's angle at a given moment use get_solar_position, and for tides alongside the sun use get_tide_window. Pass elevation whenever you know it: it shifts sunrise and sunset at altitude. Defaults: from today, 7 days or the plan's limit if lower. Requires an API key on a paid Ephemerides plan.
Input Schema
{
"type": "object",
"properties": {
"lat": {
"type": "number",
"minimum": -90,
"maximum": 90,
"description": "Latitude in decimal degrees."
},
"lon": {
"type": "number",
"minimum": -180,
"maximum": 180,
"description": "Longitude in decimal degrees."
},
"tz": {
"type": "string",
"description": "IANA timezone for output timestamps, e.g. Europe/Dublin. Defaults to UTC."
},
"elevation": {
"type": "number",
"minimum": -500,
"maximum": 9000,
"description": "Metres above sea level. Supply it when known: at altitude the sun rises measurably earlier than the sea-level answer. Omit only if the elevation is genuinely unknown."
},
"days": {
"type": "integer",
"minimum": 1,
"description": "Number of days to return. The ceiling is plan-dependent."
},
"start_date": {
"type": "string",
"description": "First day as YYYY-MM-DD. Defaults to today."
}
},
"required": [
"lat",
"lon"
]
}🟢get_prayer_times(lat, lon, tz, elevation, date, ...)
Fajr, sunrise, dhuhr, asr, maghrib and isha for one date at a location, elevation-corrected. Use it for Islamic prayer schedules; for general sunrise, sunset and twilight use get_sun_moon_times. school is required and sets the fajr and isha rules; asr_method picks the shadow rule and defaults to shafi. date defaults to today. Requires an API key on a paid Ephemerides plan.
Input Schema
{
"type": "object",
"properties": {
"lat": {
"type": "number",
"minimum": -90,
"maximum": 90,
"description": "Latitude in decimal degrees."
},
"lon": {
"type": "number",
"minimum": -180,
"maximum": 180,
"description": "Longitude in decimal degrees."
},
"tz": {
"type": "string",
"description": "IANA timezone for output timestamps, e.g. Europe/Dublin. Defaults to UTC."
},
"elevation": {
"type": "number",
"minimum": -500,
"maximum": 9000,
"description": "Metres above sea level. Supply it when known: at altitude the sun rises measurably earlier than the sea-level answer. Omit only if the elevation is genuinely unknown."
},
"date": {
"type": "string",
"description": "Day as YYYY-MM-DD. Defaults to today."
},
"school": {
"type": "string",
"enum": [
"egyptian",
"isna",
"karachi",
"mwl",
"uaq"
],
"description": "Calculation school: mwl (Muslim World League), isna (Islamic Society of North America), egyptian (Egyptian General Authority of Survey), karachi (University of Islamic Sciences, Karachi), uaq (Umm al-Qura, Makkah)."
},
"asr_method": {
"type": "string",
"enum": [
"hanafi",
"shafi"
],
"description": "Asr shadow rule: shafi (default; also Maliki and Hanbali) or hanafi, which gives a later Asr."
}
},
"required": [
"lat",
"lon",
"school"
]
}🟢get_solar_position(lat, lon, tz, elevation, timestamp, ...)
The sun's position at one instant: azimuth, altitude, zenith, declination, hour angle and equation of time, plus clear-sky irradiance (GHI, DNI and DHI in W/m²) when include asks for it and the plan covers it. Use it for where the sun is at a given moment; for its track through a whole day use get_solar_path, and for rise and set times use get_sun_moon_times. timestamp defaults to now. Positions are NREL SPA-equivalent on JPL DE421; irradiance comes from the Bird clear-sky model. Requires an API key on a paid Solar plan.
Input Schema
{
"type": "object",
"properties": {
"lat": {
"type": "number",
"minimum": -90,
"maximum": 90,
"description": "Latitude in decimal degrees."
},
"lon": {
"type": "number",
"minimum": -180,
"maximum": 180,
"description": "Longitude in decimal degrees."
},
"tz": {
"type": "string",
"description": "IANA timezone for output timestamps, e.g. Europe/Dublin. Defaults to UTC."
},
"elevation": {
"type": "number",
"minimum": -500,
"maximum": 9000,
"description": "Metres above sea level. Supply it when known: at altitude the sun rises measurably earlier than the sea-level answer. Omit only if the elevation is genuinely unknown."
},
"timestamp": {
"type": "string",
"description": "ISO 8601 instant, e.g. 2026-06-21T12:00:00Z. Defaults to now."
},
"include": {
"type": "string",
"enum": [
"position",
"position,irradiance"
],
"description": "position (default) or position,irradiance."
}
},
"required": [
"lat",
"lon"
]
}🟢get_solar_path(lat, lon, elevation, date, interval)
The sun's azimuth and altitude through one UTC day, sampled every interval: a list of timestamped positions. Use it for shading studies, PV siting and panel-angle planning; for a single instant use get_solar_position. date defaults to today and interval to 15m. Requires an API key on a paid Solar plan.
Input Schema
{
"type": "object",
"properties": {
"lat": {
"type": "number",
"minimum": -90,
"maximum": 90,
"description": "Latitude in decimal degrees."
},
"lon": {
"type": "number",
"minimum": -180,
"maximum": 180,
"description": "Longitude in decimal degrees."
},
"elevation": {
"type": "number",
"minimum": -500,
"maximum": 9000,
"description": "Metres above sea level. Supply it when known: at altitude the sun rises measurably earlier than the sea-level answer. Omit only if the elevation is genuinely unknown."
},
"date": {
"type": "string",
"description": "UTC day as YYYY-MM-DD. Defaults to today."
},
"interval": {
"type": "string",
"enum": [
"1m",
"5m",
"15m",
"1h",
"1d"
],
"description": "Sampling step. Defaults to 15m."
}
},
"required": [
"lat",
"lon"
]
}🟢get_daily_light_integral(lat, lon, elevation, from, to)
Clear-sky Daily Light Integral in mol/m²/day for each day in a range: photosynthetically active radiation integrated from sunrise to sunset. Use it to plan crop growth or supplemental greenhouse lighting; it assumes cloudless skies, so treat it as the ceiling for the site. Pass from and to together for a range of UTC days, or neither for today. Requires an API key on a paid Solar plan.
Input Schema
{
"type": "object",
"properties": {
"lat": {
"type": "number",
"minimum": -90,
"maximum": 90,
"description": "Latitude in decimal degrees."
},
"lon": {
"type": "number",
"minimum": -180,
"maximum": 180,
"description": "Longitude in decimal degrees."
},
"elevation": {
"type": "number",
"minimum": -500,
"maximum": 9000,
"description": "Metres above sea level. Supply it when known: at altitude the sun rises measurably earlier than the sea-level answer. Omit only if the elevation is genuinely unknown."
},
"from": {
"type": "string",
"description": "First UTC day, YYYY-MM-DD. Requires to."
},
"to": {
"type": "string",
"description": "Last UTC day, YYYY-MM-DD. Requires from."
}
},
"required": [
"lat",
"lon"
]
}🟢get_tide_extremes(lat, lon, tz, days, start_date)
High and low water times and heights at any coastal point, from the FES2022 global tide atlas: a list of events, each with type (high or low), time and height_m. Use it for when high or low tide is; for a continuous curve use get_tide_heights, and for tides together with sunrise, golden hour and moon phase use get_tide_window. Heights are metres relative to MEAN SEA LEVEL, not chart datum — never use for navigation. Defaults: from today, 2 days or the plan's limit if lower. Requires an API key on a paid Tides plan.
Input Schema
{
"type": "object",
"properties": {
"lat": {
"type": "number",
"minimum": -90,
"maximum": 90,
"description": "Latitude in decimal degrees."
},
"lon": {
"type": "number",
"minimum": -180,
"maximum": 180,
"description": "Longitude in decimal degrees."
},
"tz": {
"type": "string",
"description": "IANA timezone for output timestamps, e.g. Europe/Dublin. Defaults to UTC."
},
"days": {
"type": "integer",
"minimum": 1,
"description": "Number of days to return. The ceiling is plan-dependent."
},
"start_date": {
"type": "string",
"description": "First day as YYYY-MM-DD. Defaults to today."
}
},
"required": [
"lat",
"lon"
]
}🟢get_tide_heights(lat, lon, tz, days, start_date, ...)
Water height at a coastal point at a fixed step: a list of time and height_m pairs. Use it to plot a tide curve or read the height at a particular time; for just the highs and lows use get_tide_extremes. Metres relative to mean sea level, not chart datum. Defaults: from today, 2 days, and the finest step the plan allows, but no finer than 10m. Requires an API key on a paid Tides plan.
Input Schema
{
"type": "object",
"properties": {
"lat": {
"type": "number",
"minimum": -90,
"maximum": 90,
"description": "Latitude in decimal degrees."
},
"lon": {
"type": "number",
"minimum": -180,
"maximum": 180,
"description": "Longitude in decimal degrees."
},
"tz": {
"type": "string",
"description": "IANA timezone for output timestamps, e.g. Europe/Dublin. Defaults to UTC."
},
"days": {
"type": "integer",
"minimum": 1,
"description": "Number of days to return. The ceiling is plan-dependent."
},
"start_date": {
"type": "string",
"description": "First day as YYYY-MM-DD. Defaults to today."
},
"step": {
"type": "string",
"enum": [
"1m",
"5m",
"10m",
"15m",
"30m",
"1h"
],
"description": "Sampling interval. Finer steps need a higher plan."
}
},
"required": [
"lat",
"lon"
]
}🟢get_tide_window(lat, lon, tz, elevation, days, ...)
Per day: high and low waters together with sunrise, sunset, golden and blue hour, twilight and moon phase in a single call. The planning tool for coastal photography, fishing and shore work; use it instead of calling get_tide_extremes and get_sun_moon_times separately. Pass elevation when you know it: it shifts the sun and moon times — roughly three minutes at clifftop height — but never the tide heights, which do not depend on where the observer stands. Defaults: from today, 2 days or the plan's limit if lower. Requires an API key on a paid Tides plan.
Input Schema
{
"type": "object",
"properties": {
"lat": {
"type": "number",
"minimum": -90,
"maximum": 90,
"description": "Latitude in decimal degrees."
},
"lon": {
"type": "number",
"minimum": -180,
"maximum": 180,
"description": "Longitude in decimal degrees."
},
"tz": {
"type": "string",
"description": "IANA timezone for output timestamps, e.g. Europe/Dublin. Defaults to UTC."
},
"elevation": {
"type": "number",
"minimum": -500,
"maximum": 9000,
"description": "Metres above sea level. Supply it when known: at altitude the sun rises measurably earlier than the sea-level answer. Omit only if the elevation is genuinely unknown."
},
"days": {
"type": "integer",
"minimum": 1,
"description": "Number of days to return. The ceiling is plan-dependent."
},
"start_date": {
"type": "string",
"description": "First day as YYYY-MM-DD. Defaults to today."
}
},
"required": [
"lat",
"lon"
]
}Community
Evidence