surf-mcp-server
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 best spots in Uluwatu for intermediate surfers?"
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
Ein kleiner MCP Server fuer Surfspot-Daten und einfache Spot-Suche. Die Spots liegen als JSON-Dateien im Ordner data/ und koennen ueber MCP Tools abgefragt werden.
Der Server ist bewusst simpel gehalten, damit er auf verschiedenen Systemen und mit unterschiedlichen Python-Versionen leicht getestet werden kann.
Voraussetzungen
Python
>=3.10Zugriff auf dieses Repo
Installation der Python-Abhaengigkeiten aus
pyproject.toml
Abhaengigkeiten:
mcp[cli]requests
Related MCP server: MCP Firecrawl Server
Setup
Vom Repo-Root aus:
cd surf-mcp-server
python -m venv .venv
source .venv/bin/activate
python -m pip install -U pip
python -m pip install -e .Alternativ, falls du mit uv arbeitest:
cd surf-mcp-server
uv syncWichtig: Den Server aus dem Repo-Root starten, weil die Spot-Dateien relativ ueber data/ geladen werden.
Server starten
python src/server.pyDer Server startet aktuell mit streamable-http:
mcp.run(transport="streamable-http")Wenn du ihn auf einem anderen System testest, reicht normalerweise:
Repo kopieren oder klonen
Python-Umgebung erstellen
Dependencies installieren
python src/server.pyaus dem Repo-Root ausfuehren
Projektstruktur
surf-mcp-server/
├── src/
│ ├── server.py # MCP Tools und Server-Start
│ ├── spots.py # Laden der Spot-Dateien
│ ├── forecast.py # Forecast-Orchestrierung
│ └── providers/ # Forecast- und Tide-Provider
├── data/ # Surfspot JSON-Dateien
├── tests/ # Unit Tests
├── charts/ # Helm Chart
├── Dockerfile
├── .dockerignore
├── LICENSE
├── pyproject.toml
├── uv.lock
└── README.mdVerfuegbare MCP Tools
list_regions()
Gibt alle verfuegbaren Regionen zurueck.
Beispiel-Resultat:
["Airport Reefs", "Lakey", "Uluwatu", "Ungasan", "West Sumbawa"]list_spots(region: string | null = null)
Listet Spots. Optional kann nach Region gefiltert werden.
Beispiel:
{
"region": "Uluwatu"
}Resultat enthaelt:
{
"id": "uluwatu_the_peak",
"name": "Uluwatu - The Peak",
"country": "Indonesia",
"island": "Bali",
"region": "Uluwatu"
}get_spot_info(spot_id: string)
Gibt alle Details fuer einen Spot zurueck.
Beispiel:
{
"spot_id": "lakey_peak"
}find_spots(...)
Findet Spots anhand mehrerer Kriterien.
Parameter:
skill: z.B.intermediate,advanced,expertcountry: z.B.Indonesiaisland: z.B.BalioderSumbawaregion: z.B.Uluwatu,Lakey,West Sumbawatide: z.B.low,mid,highwind: z.B.SE,N,NWswell_direction: z.B.S,SW,Wswell_height_ft: z.B.4
Beispiel:
{
"skill": "intermediate",
"island": "Bali",
"region": "Uluwatu",
"tide": "mid",
"wind": "SE",
"swell_direction": "SW",
"swell_height_ft": 4
}count_spots()
Gibt die Anzahl der Spot-Dateien zurueck.
search_spots(query: string)
Sucht Spots nach Name.
Beispiel:
{
"query": "uluwatu"
}get_forecast(spot_id: string)
Gibt aktuell einen Mock Forecast zurueck.
Beispiel-Resultat:
{
"wave_height_ft": 6,
"period_s": 14,
"wind_kts": 8
}Spot JSON Schema
Jeder Spot ist eine eigene JSON-Datei in data/. Der Dateiname sollte zur spot_id passen.
Beispiel:
{
"spot_id": "uluwatu_the_peak",
"name": "Uluwatu - The Peak",
"country": "Indonesia",
"island": "Bali",
"region": "Uluwatu",
"coordinates": {
"lat": -8.816633,
"lon": 115.08625
},
"conditions": {
"swell": {
"directions": ["S", "SW"],
"min_ft": 1,
"max_ft": 6
},
"wind": {
"offshore": ["SE"]
},
"tide": ["mid", "high"]
},
"wave": {
"direction": "left",
"type": "reef"
},
"ratings": {
"crowd": 10,
"localism": 9,
"risk": 6,
"fun": 9
},
"surfer_level": ["intermediate", "advanced"],
"notes": "At high tide, aim south of the cave when coming in.",
"description": "Short description of the spot.",
"hazards": [
"sharp coral reef",
"strong currents"
]
}Wichtige Daten-Konventionen
surfer_level
surfer_level ist immer ein Array, damit die Suche einzelne Levels sauber matchen kann:
{
"surfer_level": ["intermediate", "advanced"]
}Nicht mehr verwenden:
{
"surfer_level": "intermediate / advanced"
}Empfohlene Werte:
beginnerintermediateadvancedexpert
Location Felder
country, island und region sind getrennte Felder:
{
"country": "Indonesia",
"island": "Bali",
"region": "Uluwatu"
}Nicht mehr verwenden:
{
"region": "Bali - Uluwatu Area"
}Aktuelle Regionen
Airport ReefsLakeyUluwatuUngasanWest Sumbawa
Neue Spots hinzufuegen
Neue Datei in
data/erstellen, z.B.my_spot.jsonspot_idpassend zum Dateinamen setzen, z.B.my_spotSchema wie oben verwenden
JSON validieren:
jq empty data/my_spot.jsonAlle Spot-Dateien validieren:
for f in data/*.json; do jq empty "$f" || exit 1; doneHinweise
get_forecastist aktuell noch Mock-Datenlogik.Spot-Daten werden bei jedem Tool-Aufruf direkt aus
data/*.jsongelesen.src/providers/open_meteo.py,src/providers/worldtides.pyundsrc/providers/stormglass.pysind als Provider-Struktur vorbereitet. Open-Meteo liefert aktuell noch normalisierte Platzhalterdaten.Das Helm Chart nutzt standardmaessig die im Docker Image enthaltenen Spot-Daten. Ein externer ConfigMap-Mount fuer
/app/datakann ueberspotData.configMap.enabled=trueaktiviert werden.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
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/steph76k/surf-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server