A local, open-source MCP server that puts the working astronomer's toolkit behind one conversation. Object lookups, catalog cross-matches, ephemerides, literature, and observation planning, all normalized with provenance you can cite.
SkyQuery demonstrates strong domain expertise with well-structured astronomy tools. All 13 tools have descriptions (avg 180 chars, within 10-1024 baseline) and explicit input schemas with types. Naming follows verb_noun convention (resolve_, get_, search_, convert_). However, several tools lack parameter descriptions, and output schemas are inferred from pydantic models rather than explicitly documented in the tool definitions. Error handling is minimal, no recovery guidance or actionable error messages visible. Tool composition is excellent: tools chain naturally (resolve_object → cone_search → crossmatch). Security is sound: no credentials in parameters, read-only operations throughout.
The headline demo: asteroid Apophis size, its 2029 close approach, a paper. Answers "where is Apophis, how big is it, and what is the latest paper" in one call, combining SBDB, Horizons, and the literature with full provenance.
Fetch NASA's Astronomy Picture of the Day (APOD) for a date, or today. Works with the public DEMO_KEY out of the box; configure a free NASA key via `skyquery login` for higher rate limits.
Return catalog sources within a radius of a position. ``center`` may be an object name (resolved via SIMBAD) or "RA DEC" in degrees. ``catalog`` is "gaia" for Gaia DR3, or a VizieR catalog id such as "II/246" for 2MASS. Every column is unit-tagged. Radius is capped at 5 degrees and ``row_limit`` at 100 to protect free public services.
Transform coordinates between reference frames (ICRS, FK5, FK4, Galactic). Uses astropy's tested transforms, never hand-rolled trigonometry. Returns the position in the target frame with the frame explicitly labeled.
Convert a value between physical units with astropy's tested conversions. Example: convert a parallax in mas, a distance in pc to ly, a velocity in km/s. Returns the converted value tagged with its new unit. Rejects unit mismatches.
Output schemas not explicitly documented in tool definitions. Pydantic models (Object, Ephemeris, SmallBody, etc.) are inferred from return type hints but not exposed as JSON Schema in the tool registration. LLMs cannot see field names, types, or structure before calling.
No error handling or recovery guidance. Tools return pydantic validation errors or service exceptions without actionable messages. E.g., if SIMBAD fails to resolve an object name, the LLM receives a raw exception instead of 'Object not found. Try a catalog ID like HIP 91262 or a Messier number like M31.'
apophis_demo violates single-responsibility principle. Combines SBDB lookup, Horizons ephemeris, and literature search in one tool. Should be three separate tools (get_small_body, get_ephemeris, search_literature) composed by the agent. Reduces flexibility and reusability.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 61 | <=2025-11-25 | v2 |
Match a list of target names to their nearest source in a catalog. Resolves each name to a position, then finds the nearest catalog source within ``tolerance_arcsec``. Reports both matches (with separation) and any targets with no source inside the tolerance. At most 50 targets per call.
Convert a parallax in milliarcseconds to a distance in parsecs. Rejects non-positive parallaxes, for which distance is undefined, rather than returning a nonsense number.
Compute a solar-system body's apparent ephemeris from JPL Horizons. Returns a time series of ICRS position, distance (delta, in AU), range rate, and V magnitude for a body such as "99942 Apophis", "Ceres", or "C/2023 A3". ``observer_location`` is a Horizons code; "500@399" is geocentric. This is the capability the other astronomy MCP servers skip, so prefer it for "where is <body> on <date>" questions. Windows that would exceed ~2000 samples are rejected.
Look up an asteroid or comet's physical and orbital parameters (JPL SBDB). Returns diameter, absolute magnitude, albedo, rotation period, and osculating orbital elements, each unit-tagged. Pair with get_ephemeris to answer "how big is it and where is it".
Resolve an object and, optionally, attach recent papers about it. Combines object intelligence with a literature lookup in one call. Use when a user asks "tell me about X" and wants both the numbers and the references.
Resolve an astronomical object name or identifier to normalized data. Returns canonical coordinates (ICRS degrees), object type, cross-identifiers, and measured properties (parallax, proper motion, redshift, magnitudes), each carrying its unit and a provenance record you can cite. Try SIMBAD-style names like "Vega", "M31", "Betelgeuse", or catalog ids. This is usually the first call: downstream tools take the returned RA/Dec.
Search the astronomy literature (NASA ADS, or arXiv when no ADS key is set). Returns normalized paper records with title, authors, year, bibcode, and a resolvable URL. ADS needs a free token configured via `skyquery login`; without one, SkyQuery falls back to arXiv automatically. ``rows`` is capped at 50.
Return the deduplicated acknowledgments for every source used this session. Call this at the end of a research conversation to get a ready-to-paste citations block honoring each service's acknowledgment policy.
Parameter descriptions missing or minimal for several tools. E.g., get_ephemeris 'start' and 'stop' lack format examples; cone_search 'center' does not explain 'RA DEC' syntax; crossmatch 'tolerance_arcsec' lacks guidance on typical values. LLMs must infer from context.
session_citations returns empty input schema ({}). Tool is stateless but LLM cannot verify this from the schema. Should document that no parameters are required.