GeoNet New Zealand MCP. Official New Zealand geological hazard monitoring (GNS Science) — recent earthquakes with felt intensity, single-quake detail, and NZ Volcanic Alert Levels (data USGS doesn't provide). Keyless.
Three well-named, read-only tools with clear descriptions and complete input schemas. Tool names follow verb_noun pattern (recent_quakes, get_quake, volcano_alerts). Descriptions are detailed (150 - 250 chars) and explain domain context (GeoNet, MMI scale, NZ volcanic alert levels). All parameters have type definitions and descriptions. However, output schemas are not documented, LLMs cannot see what fields to expect from responses. Error handling is minimal (generic error objects). No pagination support despite potential for large result sets. No tool annotations (readOnlyHint) despite all being read-only operations.
Get detail for a single New Zealand earthquake by its GeoNet publicID — time, magnitude, depth, locality, felt intensity (MMI), location quality, and coordinates. Keyless.
Recent New Zealand earthquakes from GeoNet (official NZ monitoring, GNS Science), filtered by minimum Modified Mercalli Intensity. MMI 3 ≈ widely felt, 5 ≈ damaging; -1 returns all located quakes. Returns magnitude, depth, locality, felt intensity, and coordinates, newest first. Keyless.
Current Volcanic Alert Levels for all monitored New Zealand volcanoes (Taupo, White Island/Whakaari, Ruapehu, Tongariro, Auckland Volcanic Field, etc.) from GeoNet — official data USGS doesn't cover. NZ scale 0-5: 0 no unrest, 1 minor unrest, 2 moderate/heightened unrest, 3 minor eruption, 4 moderate eruption, 5 major eruption. Includes activity description, hazards, and aviation colour code. Keyless.
Output schemas not documented. LLMs cannot see what fields recent_quakes, get_quake, and volcano_alerts return. Code shows mapQuake() returns {id, time, magnitude, depth_km, locality, mmi, quality, longitude, latitude} and volcanoAlerts() returns {volcano_id, name, alert_level, activity, aviation_colour, hazards, longitude, latitude}, but these are invisible to the agent. Without documented output schemas, LLMs cannot plan downstream tool calls or extract the right data.
No pagination support. recent_quakes accepts a limit parameter (max 50) but does not return a total count, next_cursor, or indication of whether more results exist. If GeoNet returns 100+ quakes and the agent needs all of them, there is no way to fetch the next page. Large result sets risk context window exhaustion.
Minimal error handling. callTool() catches exceptions and returns {error: message}, but does not categorize errors as retryable, user-fixable, or fatal. geoFetch() returns {error: 'not found'} or {error: 'geonet: 500 ...'} with no recovery guidance. LLMs cannot determine whether to retry, ask the user, or give up.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 62 | 2026-07-28+ | v2 |
No tool annotations. All three tools are read-only (no side effects), but the tool definitions lack readOnlyHint annotations. This forces LLMs to infer safety from descriptions rather than machine-readable metadata.
Parameter constraints not fully specified. min_mmi description says 'Out-of-range values are clamped' but does not state the clamping logic (Math.max(-1, Math.min(8, ...))). limit description says 'max 50' but does not state the minimum (1). LLMs cannot validate inputs before calling.