Auditable MCP server + Claude Code Skills to control a ZWO Seestar S50 and QA its output
Two tools with minimal input schemas (both empty objects) and descriptions that are honest but lack LLM-optimized structure. connect_telescope has a detailed, security-conscious description (195 chars) explaining the semantic difference between 'ok' and 'connected', which is excellent for preventing misuse. get_status is similarly thorough (156 chars). However, neither tool has parameters to describe, and the descriptions, while accurate, do not follow the 50-200 char LLM-optimized baseline. No output schemas are documented. No error handling guidance is provided. The codebase shows strong engineering (separation of concerns, error catching, provenance logging) but the MCP tool definitions themselves are sparse.
Connect to the telescope via seestar_alp (Alpaca ``connected``). ``ok`` reflects whether the scope is CONNECTED, not merely whether the call completed. This used to return ``{"ok": True, "connected": False}`` on a scope that never came up — truthful in the payload, but anything branching on ``ok`` alone (a run-book, a dashboard) concluded the scope was live. For an action tool named ``connect_*``, failing to connect is a failed action. ``connected`` is still carried either way.
Read connection + pointing + tracking/slewing state. Each field is read independently; a ``NotImplemented`` GET (expected for a few standard ASCOM properties the Seestar lacks) resolves to ``None``.
No input schemas visible for either tool. Both tools accept empty input objects ({}), but no JSON Schema with types or descriptions is documented in the source.
No output schemas documented. LLMs cannot infer what fields connect_telescope and get_status return, forcing them to guess at response structure and risk misinterpreting results.
No error handling guidance in tool descriptions. Descriptions do not explain what errors are possible, whether they are retryable, or what the LLM should do if a call fails.
Tool descriptions lack actionable context for LLM selection. While technically accurate, they do not explain WHEN to call each tool or what prerequisites exist (e.g., must connect_telescope be called before get_status?).
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 46 | 2026-07-28+ | v2 |
connect_telescope is marked WRITE risk but has no confirmation or dry-run pattern. Agents may inadvertently trigger telescope connections without explicit user approval.