{"server":{"name":"io.github.thirdtrail/thirdtrail","$schema":"https://static.modelcontextprotocol.io/schemas/2025-09-29/server.schema.json","remotes":[{"url":"https://thirdtrail.life/mcp","type":"streamable-http","headers":[{"name":"Authorization","isSecret":true,"isRequired":true,"description":"Your thirdtrail API key as 'Bearer tt_live_…'. Mint one at https://thirdtrail.life/apis/keys/. The MCP server requires a paid plan; the REST API has a free tier."}]}],"version":"1.0.0","repository":{"url":"https://github.com/thirdtrail/thirdtrail-python","source":"github"},"websiteUrl":"https://thirdtrail.life/docs/mcp/","description":"Elevation-corrected sun, moon, twilight, solar and tide data for any point on Earth"},"_meta":{"io.modelcontextprotocol.registry/official":{"status":"active","isLatest":true,"updatedAt":"2026-09-22T18:11:36.414047Z","publishedAt":"2026-09-22T18:11:36.414047Z","statusChangedAt":"2026-09-22T18:11:36.414047Z"},"dev.protogrid/connectability":{"class":"R1","autonomous":true,"human_steps":[],"preferred":{"kind":"remote","idx":0},"remotes":[{"idx":0,"url":"https://thirdtrail.life/mcp","transport":"streamable-http","templated":false,"headers":[{"name":"Authorization","required":true,"secret":true,"value":null,"secret_names":["THIRDTRAIL_TOKEN"]}],"auth":{"type":"api_key","location":null,"secret_name":"THIRDTRAIL_TOKEN","oauth":null},"protocol":{"supported_versions":["2026-07-28","2025-11-25","2025-06-18","2025-03-26"],"stateless":true},"health":{"reachable":true,"uptime_30d":0.9072165,"latency_ms_p50":508,"consecutive_failures":0,"last_probe_at":"2026-10-19T21:53:28.167Z","last_ok_at":"2026-10-19T21:53:28.167Z"}}],"packages":[]},"dev.protogrid/tools":[{"name":"get_daily_light_integral","title":"Daily light integral","description":"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.","annotations":{"title":"Daily light integral","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-19T21:53:28.167Z"},{"name":"get_prayer_times","title":"Islamic prayer times","description":"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.","annotations":{"title":"Islamic prayer times","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-19T21:53:28.167Z"},{"name":"get_solar_path","title":"Solar path for a day","description":"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.","annotations":{"title":"Solar path for a day","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-19T21:53:28.167Z"},{"name":"get_solar_position","title":"Solar position and irradiance","description":"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.","annotations":{"title":"Solar position and irradiance","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-19T21:53:28.167Z"},{"name":"get_sun_moon_times","title":"Sun and moon times","description":"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.","annotations":{"title":"Sun and moon times","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-19T21:53:28.167Z"},{"name":"get_tide_extremes","title":"High and low tides","description":"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.","annotations":{"title":"High and low tides","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-19T21:53:28.167Z"},{"name":"get_tide_heights","title":"Tide height series","description":"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.","annotations":{"title":"Tide height series","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-19T21:53:28.167Z"},{"name":"get_tide_window","title":"Coastal planning window","description":"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.","annotations":{"title":"Coastal planning window","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-19T21:53:28.167Z"}],"dev.protogrid/trust":{"score":96,"components":{"hygiene":100,"liveness":96,"freshness":100,"provenance":90},"drivers":["+repository","+namespace-matches-repo","+website","+reachable","+uptime-91%","+updated-27d-ago"],"flags":[],"blocked":false,"computed_at":"2026-10-20T02:10:17.118Z","disclaimer":"Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed."},"dev.protogrid/quality":{"score":84,"label":"good","components":{"auth":null,"hygiene":100,"protocol":100,"stability":25,"dependencies":null},"checks":[{"id":"protocol.modern","detail":"supports 2026-07-28 (server/discover)","status":"pass","category":"protocol"},{"id":"protocol.stateless","detail":"answers without a session","status":"pass","category":"protocol"},{"id":"protocol.transport","detail":"streamable HTTP","status":"pass","category":"protocol"},{"id":"protocol.list_ttl","detail":"tool list is cacheable (ttlMs 3600000)","status":"pass","category":"protocol"},{"id":"auth.prm","detail":"no remote uses OAuth","status":"na","category":"auth"},{"id":"auth.as_metadata","detail":"no remote uses OAuth","status":"na","category":"auth"},{"id":"auth.cimd","detail":"no remote uses OAuth","status":"na","category":"auth"},{"id":"auth.secret_in_url","detail":"no templated URL","status":"na","category":"auth"},{"id":"tools.descriptions","detail":"every tool has a description","status":"pass","category":"hygiene"},{"id":"tools.description_length","detail":"descriptions are concise","status":"pass","category":"hygiene"},{"id":"tools.schemas","detail":"every tool has an object input schema","status":"pass","category":"hygiene"},{"id":"tools.annotations","detail":"8 of 8 tools declare readOnlyHint or destructiveHint","status":"pass","category":"hygiene"},{"id":"tools.directory_hints","detail":"every tool declares readOnlyHint, destructiveHint, idempotentHint and openWorldHint","status":"pass","category":"hygiene"},{"id":"tools.token_cost","detail":"about 2,738 tokens to load every tool","status":"pass","category":"hygiene"},{"id":"tools.api_dump","detail":"tools are not a one-to-one API dump","status":"pass","category":"hygiene"},{"id":"stability.changes","detail":"8 tool changes in 30 days","status":"warn","category":"stability"},{"id":"stability.rug_pull","detail":"7 tools kept their name but changed most of their description in 30 days; review before trusting them","status":"fail","category":"stability"},{"id":"deps.known_vulns","detail":"no npm or PyPI package","status":"na","category":"dependencies"},{"id":"deps.mcp_sdk_version","detail":"no npm or PyPI package","status":"na","category":"dependencies"},{"id":"deps.resolvable","detail":"no npm or PyPI package","status":"na","category":"dependencies"}],"drivers":["-stability.rug_pull","~stability.changes"],"flags":[],"tool_count":8,"token_estimate":2738,"tools_hash":"a9c273f478f7508f90e2baa919ed138e","tools_changed_at":"2026-10-07T06:56:01.242Z","computed_at":"2026-10-20T02:01:17.664Z","disclaimer":"Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed."},"dev.protogrid/identity":{"canonical_id":"io.github.thirdtrail/thirdtrail","aliases":[],"alias_count":0,"repository_key":"github:thirdtrail/thirdtrail-python","owner":{"verified":false,"method":null,"since":null}}},"next_actions":[{"action":"list_tools","description":"Every current tool with input schemas","href":"/v1/servers/io.github.thirdtrail%2Fthirdtrail/tools","arguments":{"name":"io.github.thirdtrail/thirdtrail"}},{"action":"get_connection","description":"Minimal connection block for the preferred remote or package","href":"/v1/servers/io.github.thirdtrail%2Fthirdtrail/connection?target=mcpServers","arguments":{"name":"io.github.thirdtrail/thirdtrail","target":"mcpServers"}},{"action":"search","description":"Find other servers by intent","href":"/v1/search?q={query}","arguments":{"q":"{query}"}}]}