Starlink dish MCP server — local gRPC monitoring, alerts, and control
Server has 9 tools with consistent naming (verb_noun pattern: starlink_*) and detailed descriptions (100-250 chars each). However, most tools lack input schemas entirely (7 of 9 have empty {} schemas), and parameter descriptions are missing where schemas exist. Tool descriptions are well-written and explain WHAT/WHEN/WHY, but output schemas are undocumented, LLMs cannot plan downstream calls. Error handling returns generic error strings without recovery guidance. No tool annotations (readOnlyHint/destructiveHint) despite clear risk levels. Composition is sound: each tool does one thing, names are clear, but lack of structured output and missing schemas significantly limit agent usability.
Get active dish alerts with human-readable descriptions. Checks 22 alert flags covering hardware (motors, thermal), connectivity (ethernet speed, signal), environment (water, obstruction), and policy (roaming, movement). Only active alerts are shown.
Get hardware diagnostics: firmware, GPS status, active alert count. Useful for troubleshooting — shows hardware version, software version, dish state with description, uptime, GPS satellite count, and total active alerts.
Get recent throughput/latency/power history as statistical summary (min/avg/max). Returns aggregated stats over the requested sample window — much more token-efficient than raw per-second data. Covers ping drop rate, latency, download/upload throughput, power consumption, and SNR.
Get dish GPS location (latitude, longitude, altitude). Requires opt-in: Starlink app → Settings → Advanced → Debug Data. Returns 'unavailable' if GPS sharing is not enabled.
Get obstruction data: fraction obstructed, 12-wedge directional map, and timing. Shows overall obstruction percentage, whether currently obstructed, average obstruction duration and interval, and per-wedge fractions (12 directions around the dish).
7 of 9 tools have empty input schemas ({}). Per HARD SCORING RULE, tools with no input schema must score 0 on schema. This blocks LLM understanding of what parameters are accepted and their constraints.
No output schemas documented. Tool descriptions do not specify what fields are returned (e.g., starlink_status returns 'compact summary' but LLM cannot see the structure). LLMs cannot plan downstream calls or extract specific fields without documented output types.
Error handling returns generic 'Error: {e}' strings without recovery guidance. Per pattern:recovery-guide, errors should tell the LLM what to do next (e.g., 'Connection failed. Verify dish is on LAN at 192.168.100.1:9200').
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 53 | 2026-07-28+ | v2 |
Reboot the Starlink dish. Requires STARLINK_WRITE_ENABLED=true AND confirm=true. The dish will lose connectivity for 2-5 minutes during restart. Use this to recover from stuck states or apply pending firmware updates.
Get current dish status: identity, connectivity, signal quality, orientation, uptime. Returns compact summary with dish ID, hardware/software version, state, ping drop rate, latency, throughput, SNR, and antenna orientation.
Stow the dish (point face-down for storage or transport). Requires STARLINK_WRITE_ENABLED=true AND confirm=true. The dish will lose connectivity while stowed. Use starlink_unstow to resume.
Unstow the dish (resume normal satellite tracking). Requires STARLINK_WRITE_ENABLED=true AND confirm=true.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). Tools are marked with Risk levels (READ_ONLY, REVERSIBLE) in metadata but not exposed via MCP tool annotations. Agents cannot distinguish safe reads from destructive operations without explicit hints.
Confirmation gate (confirm=true) is documented but not enforced at schema level. Parameter 'confirm' has no enum constraint, LLM could pass confirm='yes' or confirm=1 and bypass the gate. Use enum: [true] or add strict validation.