MCP server and Python library for Surfline's public forecast API. Hourly swell, wind, tide, ratings, and prose observations, merged and normalized.
Four tools with clear verb-noun naming (search_*, get_*, lookup_*, compare_*) and detailed descriptions (150-250 chars each). All tools have input schemas with typed parameters and descriptions. However, output schemas are not formally documented, responses are inferred from code. Parameter descriptions are strong but lack explicit constraints (e.g., 'days: 1-16' stated in description but not as JSON Schema min/max). No error handling guidance for common failures (invalid spot ID, API rate limits, network timeouts). Tool descriptions include helpful dependency hints ('call search_spots first'), which is excellent. Missing: per-parameter type validation rules, enum constraints, and structured error recovery paths.
Get full forecasts for multiple spots in one call. Errors on individual spots are captured per-entry rather than aborting the whole batch.
Hourly swell, wind, tide, rating + daily prose for one spot. Requires a 24-hex spot ID or a Surfline URL containing one. If the user only gave you a name, call `search_spots` first to resolve it.
Resolve a Surfline URL or 24-hex spot ID to spot metadata (name, lat/lon). Only works on URLs and IDs. If the user gave you a spot NAME, call `search_spots` instead to find the matching ID first.
Search Surfline spots by name. Returns ranked candidates with regions. Use this FIRST whenever the user gives a spot name (e.g. "Sunset Beach", "El Porto", "Pipeline") instead of a 24-hex ID or URL. Many spots share names across locations: "Sunset Beach" alone returns hits in California, Hawaii's North Shore, Florida, Dubai, and elsewhere. Use the `breadcrumbs` field to disambiguate, then pass the chosen `id` to `get_full_forecast` or `lookup_spot`.
Output schemas not formally documented. Code shows dict returns but no JSON Schema definitions for response structure. LLMs cannot plan downstream operations without knowing what fields to expect.
Parameter constraints not expressed in JSON Schema. 'days: 1-16' and 'limit: default 8' are stated in descriptions but lack min/max/default in schema. LLMs cannot validate inputs before calling.
No error handling guidance. lookup_spot returns a bare error dict on invalid input, but does not guide the LLM to call search_spots or explain the failure. Missing recovery paths for API failures (rate limits, timeouts, invalid tokens).
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 61 | 2026-07-28+ | v2 |
Surfline API token exposed in source code. _DEFAULT_TOKEN hardcoded in surfline_client.py (line ~50). Tokens should be injected via environment variables only, never committed to repo.
compare_spots silently captures per-spot errors but does not distinguish retryable (timeout, rate limit) from fatal (invalid ID, auth failure). LLM cannot decide whether to retry the batch or ask the user.