Skateable runs a public Model Context Protocol (MCP) server that answers whether a skate spot is dry enough to skate. This page describes the endpoint, its two tools and the usage limits. To add it to an assistant, see Voice and AI assistants.
| URL | https://www.skateable.io/mcp/ |
|---|---|
| Transport | Streamable HTTP. Stateless: no session is created and none is required. |
| Protocol version | 2025-06-18 |
| Authentication | None. No API key, sign-in or account. |
| Access | Read-only. Both tools declare readOnlyHint: true. |
Use the www host and keep the trailing slash. The bare domain and the path
without a slash both redirect, and not every MCP client follows a redirect on POST.
search_skate_spotsFinds spots by name. Matching tolerates partial names and small misspellings. Returns up to five spots, best match first, and no conditions.
| Input | query (string, required, up to 80 characters): the spot name. |
|---|---|
| Output |
matches: an array of spots, each with id, name,
region and country.
|
get_spot_conditionsScores the best match for a spot name with the Skateable engine and explains the score. One spot is scored per call.
| Input | query (string, required, up to 80 characters): the spot name. |
|---|---|
spot |
The spot that was scored: id, name, region,
country.
|
score |
Skateability from 0 to 100. 70 and up is worth a session. |
caption |
The short caption the app shows for this score. |
spoken |
A ready-made answer in plain words: verdict, recent rain, why, when it comes good, score. |
facts |
The numbers behind the answer. See below. |
otherMatches |
Other spots the name matched. They are not scored. |
Fields of facts:
band |
primo (85+), good (70+), marginal (50+),
sketchy (25+) or no-go.
|
|---|---|
rainingNow, surfaceDryNow |
Booleans for the current state. |
lastRainedAt |
When it last rained, or null if not in the last two days. |
rainLast24hMm |
Rain in the last 24 hours, in millimetres. |
dryAt |
When the surface should be dry. Null when dry now or not within the forecast. |
nextGoodAt |
The first forecast hour worth a session. Null when good now or none in the forecast. |
minutesUntilRain |
Minutes until rain is likely, or null. |
| Weather |
temperatureCelsius, humidity, windKmh,
cloudPercent.
|
| Spot | surfaceType, sunExposure, coverType. |
timeZone |
The IANA timezone at the spot. Timestamps are ISO 8601 in UTC; say them in this timezone. |
Request:
curl -s -X POST https://www.skateable.io/mcp/ \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_spot_conditions",
"arguments": { "query": "Buckingham" }
}
}'
Response (the result, shortened):
{
"content": [
{
"type": "text",
"text": "Send it. Buckingham is primo. No rain in the last two days. That's 100 out of 100."
}
],
"structuredContent": {
"spot": {
"id": "856c3865-4c93-4bf8-9d73-ae88ecc034f3",
"name": "Buckingham",
"region": "Buckinghamshire",
"country": "United Kingdom"
},
"score": 100,
"caption": "BONE DRY. SEND IT.",
"spoken": "Send it. Buckingham is primo. No rain in the last two days. That's 100 out of 100.",
"facts": {
"score": 100,
"band": "primo",
"rainingNow": false,
"surfaceDryNow": true,
"lastRainedAt": null,
"rainLast24hMm": 0,
"dryAt": null,
"nextGoodAt": null,
"minutesUntilRain": null,
"temperatureCelsius": 19.1,
"humidity": 54,
"windKmh": 8.3,
"cloudPercent": 87,
"surfaceType": "modern_smooth",
"sunExposure": "partial_sun",
"coverType": null,
"timeZone": "Europe/London"
},
"otherMatches": []
}
}
The response arrives as JSON or as a single server-sent event, depending on the
Accept header, as the MCP Streamable HTTP transport allows.
A tool call that cannot be answered returns a normal result with isError: true
and one line of text an assistant can read out. There is no structured content.
| Situation | Text |
|---|---|
| No spot matches the name | I couldn't find that spot on Skateable. |
| Empty name, or longer than 80 characters | Which spot do you want to check? |
| A usage limit was reached | Skateable has had a lot of questions just now. Try again in a bit, or check the app. |
| The weather source is down | I can't get the weather for (spot) right now. Try again in a moment. |
| The service is switched off | Skateable isn't taking questions from assistants right now. The app has the latest. |
The service is free and has no sign-in, so it is capped in two ways.
| Limit | Amount | Resets |
|---|---|---|
| Per caller | 30 tool calls | At the start of each hour (UTC) |
| Whole service | 3,000 tool calls | At midnight UTC |
Scores are estimates from weather data, not a guarantee the surface is safe; see the disclaimer. Weather and rainfall sources are listed under data sources, and how the score is worked out is on the engine page. What is kept about requests is in the privacy policy.