Deterministic modern Western astrology natal-chart MCP server: JPL-Horizons-verified ephemeris, honest degradation when birth time is unknown, Chinese-first output
Astro MCP demonstrates strong schema definition with comprehensive parameter documentation and explicit type constraints. All 5 tools have detailed descriptions (150-300 chars) and well-structured input schemas with enums, nested objects, and validation. Tool names are action-oriented (calculate_*, lookup_*, find_*). However, output schemas are not documented in the visible code, only input schemas are defined. Error handling is present but generic (formatZodError). No tool annotations (readOnlyHint, destructiveHint) despite all tools being read-only. Composition is clean: each tool has a single responsibility, and tools chain naturally (lookup_location → calculate_natal).
Compute a Western astrology natal chart from birth date/time/location. Three modes: (A) exact clock time → full chart; (B) time window → Ascendant/Midheaven/houses degrade to candidate segments; (C) date only → angles/houses omitted, bodies get degree ranges. Honest degradation when birth time is unknown.
Compute synastry (chart comparison) between two people's natal charts. Shows how one person's planets aspect the other's, with optional house overlays. Supports all three time-precision modes (exact time, time window, date-only) for each chart independently.
Compute transits: how current/future planetary positions aspect a natal chart. Shows transiting planets' aspects to natal planets and houses. Supports all three time-precision modes for the natal chart.
Find retrograde periods for a planet within a calendar window. Returns exact station dates (direct→retrograde and retrograde→direct) and the sign where retrograde begins. Works for Mercury, Venus, Mars, Jupiter, Saturn, Uranus, Neptune, Pluto. Sun and Moon never retrograde (rejected with explanation).
Resolve a birth city name to geographic coordinates and timezone. Returns exact match, candidates list on ambiguity, or error on unknown city. Supports English city names with optional Province/Country qualifiers.
Output schemas not documented. Tool descriptions explain inputs but not return structure. LLMs cannot plan downstream operations or extract required fields without seeing what each tool returns.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). All 5 tools are read-only and idempotent, declaring this via annotations helps agents reason about safety and retry logic.
Error messages are generic Zod validation output. While formatZodError() prefixes field paths, it does not provide recovery guidance (e.g., 'ambiguous_place' error mentions candidates list but does not suggest calling lookup_location first).
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 63 | 2026-07-28+ | v2 |
Parameter descriptions include example values (e.g., 'e.g. 116.4074 or -122.4443' for longitude). LLMs may reuse these literals in real calls. Use formal constraints (min/max bounds) instead.
Nested object parameters (solarDate, clockTime, clockTimeRange) lack explicit additionalProperties: false in the visible schema definition, risking LLM injection of unexpected fields.