Surf MCP Server
The Surf MCP Server provides tide information for surfers and ocean enthusiasts.
Fetch Tide Data: Retrieve detailed tide information (high/low tides with heights) for any location using latitude and longitude coordinates.
Date-Specific Queries: Get tide data for a specific date in YYYY-MM-DD format.
Station Details: Includes information about the closest tide station and its distance from the requested location.
Time Zone Handling: All tide times are displayed in UTC.
Optimize Surfing: Use tide data to determine optimal surfing conditions.
Error Handling: Robust error handling for API failures, invalid inputs, and network issues.
Retrieves tide information for specific locations and dates using the Storm Glass API, providing high/low tide times, heights, and nearby station information to help determine optimal surfing conditions.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Surf MCP Serverwhat are the tides at 34.0522, -118.2437 for tomorrow?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Surf MCP Server
MCP server for people who surf waves and the web.
Diagram
Related MCP server: BC Water Tides MCP Server
Video Demo
https://github.com/user-attachments/assets/0a4453e2-66df-4bf5-8366-8538cda366ed
Features
Fetch tide information for any location using latitude and longitude
Support for date-specific tide queries
Detailed tide data including high/low tides and station information
Automatic time zone handling (UTC)
Prerequisites
Python 3.x
Storm Glass API key
Getting Your Storm Glass API Key
Visit Storm Glass
Click "Try for Free" or "Sign In" to create an account
Once registered, you'll receive your API key
Note on API Usage Limits:
Free tier: 10 requests per day
Paid plans available:
Small: 500 requests/day (€19/month)
Medium: 5000 requests/day (€49/month)
Large: 25,000 requests/day (€129/month)
Enterprise: Custom plans available
Choose a plan based on your usage requirements. The free tier is suitable for testing and personal use.
Installation
Clone the repository:
git clone https://github.com/ravinahp/surf-mcp.git
cd surf-mcpInstall dependencies using uv:
uv syncNote: We use uv instead of pip since the project uses pyproject.toml for dependency management.
Configure as MCP Server
To add this tool as an MCP server, you'll need to modify your Claude desktop configuration file. This configuration includes your Storm Glass API key, so you won't need to set it up separately.
The configuration file location depends on your operating system:
MacOS:
~/Library/Application\ Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%/Claude/claude_desktop_config.json
Add the following configuration to your JSON file:
{
"surf-mcp": {
"command": "uv",
"args": [
"--directory",
"/Users/YOUR_USERNAME/Code/surf-mcp",
"run",
"surf-mcp"
],
"env": {
"STORMGLASS_API_KEY": "your_api_key_here"
}
}
}⚠️ IMPORTANT:
Replace
YOUR_USERNAMEwith your actual system usernameReplace
your_api_key_herewith your actual Storm Glass API keyMake sure the directory path matches your local installation
Deployment
Building
To prepare the package:
Sync dependencies and update lockfile:
uv syncBuild package:
uv buildThis will create distributions in the dist/ directory.
Debugging
Since MCP servers run over stdio, debugging can be challenging. For the best debugging experience, we strongly recommend using the MCP Inspector.
You can launch the MCP Inspector with this command:
npx @modelcontextprotocol/inspector uv --directory /path/to/surf-mcp run surf-mcpUpon launching, the Inspector will display a URL that you can access in your browser to begin debugging.
The Inspector provides:
Real-time request/response monitoring
Input/output validation
Error tracking
Performance metrics
Usage
The service provides a FastMCP tool for getting tide information:
@mcp.tool()
async def get_tides(latitude: float, longitude: float, date: str) -> str:
"""Get tide information for a specific location and date."""Parameters:
latitude: Float value representing the location's latitudelongitude: Float value representing the location's longitudedate: Date string in YYYY-MM-DD format
Example Response:
Tide Times:
Time: 2024-01-20T00:30:00+00:00 (UTC)
Type: HIGH tide
Height: 1.52m
Time: 2024-01-20T06:45:00+00:00 (UTC)
Type: LOW tide
Height: 0.25m
Station Information:
Name: Sample Station
Distance: 20.5km from requested locationUse Cases
Example #1: Finding the Best Surf Time
You can use this tool to determine the optimal surfing time at your favorite beach & the closest station. Generally, the best surfing conditions are during incoming (rising) tides, about 2 hours before high tide.
Example prompt to Claude:
Note: Different beaches may have different optimal tide conditions based on their specific geography and break type. This tool also provides station distance information which should be considered alongside tide information. (ie. longer station distance means higher change of innacuracy - you can ask Claude for this as well when prompting).
Error Handling
The service includes robust error handling for:
API request failures
Invalid coordinates
Missing or invalid API keys
Network timeouts
Available Tools
1 toolget_tidesB
Get tide information for a specific location and date.
Args:
latitude: Float value representing the location's latitude
longitude: Float value representing the location's longitude
date: Date string in YYYY-MM-DD format
Returns:
Formatted string containing tide information and station details
| Name | Required | Description | Default |
|---|---|---|---|
| latitude | Yes | ||
| longitude | Yes | ||
| date | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. While it mentions what the tool returns ('Formatted string containing tide information and station details'), it lacks critical behavioral context such as rate limits, error conditions, authentication requirements, or whether this is a read-only operation. The description provides basic output format but misses important operational details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is perfectly structured and concise. It begins with a clear purpose statement, then provides organized sections for arguments and returns with specific formatting details. Every sentence adds value, and the information is front-loaded with the most important details first.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter tool with no annotations and no output schema, the description provides adequate but incomplete coverage. It explains parameters well and gives output format, but lacks behavioral context like error handling, rate limits, or authentication requirements. The absence of an output schema means the description should ideally provide more detail about the return structure beyond 'formatted string.'
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description provides excellent parameter semantics despite 0% schema description coverage. It clearly explains each parameter's purpose: 'Float value representing the location's latitude/longitude' and 'Date string in YYYY-MM-DD format.' This fully compensates for the lack of schema descriptions and adds meaningful context beyond what the bare schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Get tide information for a specific location and date.' It uses a specific verb ('Get') and resource ('tide information'), and specifies the scope ('for a specific location and date'). However, with no sibling tools provided, there's no opportunity to differentiate from alternatives, preventing a perfect score of 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives, prerequisites, or constraints. It simply states what the tool does without any context about appropriate usage scenarios. With no siblings listed, this omission is less critical but still represents a gap in guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
1 tool update
v1.0.0- Added
get_tides
TDQS
Scored across 1 tool
With only one tool, there is no possibility of ambiguity or overlap between tools. The tool's purpose is clearly defined as retrieving tide information for a specific location and date, making it distinct by default.
The single tool follows a clear verb_noun pattern (get_tides), which is consistent and predictable. Since there are no other tools to compare against, the naming convention is perfectly uniform.
A single tool is too few for a server named 'Surf MCP Server', which implies a broader scope related to surfing or ocean conditions. This minimal toolset feels incomplete and under-scoped for the apparent domain.
The tool surface is severely incomplete for a surfing-related server. While get_tides covers tide information, there are obvious gaps such as wave forecasts, weather data, or surf spot details, which are essential for the domain and will likely cause agent failures.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Find NOAA tide stations and NDBC buoys, fetch tide predictions, currents, and live conditions.
NOAA Tides & Currents — observations, predictions, datums, station metadata
NOAA tides and currents: water levels, tide predictions, currents, met data, flooding, sun and moon
Tides MCP — NOAA Tides and Currents data
Related MCP Servers
- AlicenseDqualityDmaintenanceProvides access to the Timezone By Location API to retrieve timezone information based on geographic location data.1MIT
- FlicenseNot gradedqualityDmaintenanceProvides Canadian tide predictions from the IWLS API, enabling retrieval of 7-day tide forecasts and station listings for monitoring stations across Canada.-
- FlicenseNot gradedqualityBmaintenanceMCP server that provides tide predictions, station lookup, and tidal event alerts for US coastal locations using live NOAA data.-
- AlicenseNot gradedqualityFmaintenanceProvides NOAA tide predictions and observed water levels, allowing AI agents to query tide stations and current water level data.5MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/ravinahp/surf-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server