thirdtrail

Elevation-corrected sun, moon, twilight, solar and tide data for any point on Earth

Should I use this

Quality & Safety

A
Description quality
100%
Schema completeness
100%
Naming quality
100%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~2,771Tokens (tool definitions)
~2.3 KBTypical response size
Significant attention impact (2.16% of 128k context)

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-http

What it can do

Tool inventory

Tools (8)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢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

Rate this Server

Evidence

Recent observations

verifiedversion not recorded8 tools
verifiedversion not recorded8 tools
verifiedversion not recorded8 tools
verifiedversion not recorded8 tools
auth requiredversion not recorded—
auth requiredversion not recorded—