Satellite pass prediction and tracking server. Provides tools to list satellites, find upcoming passes, get satellite positions, render sky charts, check weather forecasts, and rank passes by quality across the catalog.
SeekSat demonstrates solid tool design with clear verb-noun naming (list_satellites, find_passes, get_position, etc.) and comprehensive parameter schemas using JSON Schema with type constraints, ranges, and enums. Descriptions are detailed and contextual, explaining WHEN to use each tool and how they compose (e.g., find_passes vs best_pass). However, output schemas are not formally documented in the visible code, responses are inferred from implementation rather than declared. Error handling is present but minimal; most errors are thrown as generic Error objects without recovery guidance. Tool composition is excellent (each tool has one responsibility, output IDs chain to downstream tools). Security is sound (no secrets in params, read-only operations). The main gaps are undocumented output structures and limited error categorization.
Find the best upcoming pass(es) over a location, ranked by quality. Omit `satellite` to scan ALL tracked satellites and return the single best thing flying over ("what's the best pass tonight?"); give `satellite` to rank that one satellite's passes. Returns `best` (the top pass) plus a `passes` array of the top-ranked options, each tagged with its satellite, times, peak elevation, brightness, and quality score. Set chart:true to also render the winning pass's sky chart and return it in this same call - prefer this over a separate get_pass_chart step when the user wants to see the best pass. mode "visual" (default) or "radio".
List ALL upcoming passes of one satellite over a location, ranked by a quality score. Returns an array of passes, each with rise/peak/set times, peak elevation (deg), brightness (magnitude - lower/more-negative is brighter), duration, and a quality score 0-1. Scans windowHours ahead (default 48, up to 240 = 10 days), so this is the tool for comparing passes or finding the best/brightest one over a span of days - not just the next one. mode "visual" returns only sunlit, after-dark (naked-eye) passes; "radio" returns all line-of-sight passes. Provide lat+lon or a location string. Feed any pass's peak time to get_pass_chart (to draw it) or get_pass_weather (to check clouds). To rank across ALL tracked satellites at once, use best_pass.
Render a polar sky chart (PNG) of a satellite's pass over a location - where to look, with the moon, planets, and stars in their real positions. By default it charts the NEXT pass; pass `time` (the rise or peak of a specific pass from find_passes / best_pass) to chart THAT pass instead - this is how you visualise the best pass rather than just the next one. mode "visual" (default) or "radio".
Output schemas not formally documented. Responses are inferred from implementation (e.g., find_passes returns {satellite, resolvedLocation, passes, ...freshness} but this structure is not declared in tool metadata). LLMs cannot reliably plan downstream calls without knowing return field names and types.
Error handling lacks recovery guidance. Errors are thrown as generic Error('unknown satellite: ...') or Error('could not geocode location: ...'). No categorization (retryable vs user-fixable vs fatal) or actionable next steps. LLMs receive raw error text with no guidance on what to do.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | A | 82 | 2026-07-28+ | v2 |
Cloud-cover forecast and viewing probability for a location at a given time. Network-dependent.
Get the current (or at a given time) sub-point latitude/longitude, altitude, and sunlit state of a satellite.
List the satellites this server can track, with each one's current TLE freshness.
Convenience shortcut: the single next good visible pass of one satellite from a location. Use this only when the user wants "the next pass." Set chart:true to also render that pass's sky chart and return it in this same call (so the user sees the chart without a separate get_pass_chart step). To compare multiple upcoming passes, or to find the best/brightest pass over the next several days, use find_passes (one satellite) or best_pass (ranked across all tracked satellites) instead.
get_pass_weather description is vague ('Cloud-cover forecast and viewing probability for a location at a given time. Network-dependent.'). Does not explain when to call it vs other tools, what 'viewing probability' means, or what happens if weather data is unavailable. Should clarify: 'Returns cloud cover % and viewing probability (0-1) for a specific pass time. Call after find_passes to assess observability. Returns null if forecast unavailable.'
Pagination not implemented. find_passes and best_pass return unbounded arrays (passes, top-ranked options). No limit parameter enforced in visible code. Large result sets could exhaust context windows. Should cap results at 20-50 and document the limit in descriptions.
Tier-based access control (premium satellites) throws generic 'is a premium satellite - set an API key to access it' error. Does not guide LLM on how to obtain or configure an API key, or suggest free alternatives. Should return: 'Premium satellite. Free tier available: [list]. To access premium, set SEEKSAT_API_KEY environment variable.'