skateable.skateable.

Assistants developer reference

Last updated: 3 October 2026

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.

Endpoint

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.

Tools

search_skate_spots

Finds 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_conditions

Scores 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.

Example

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.

When there is no answer

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.

Usage limits

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

Data and attribution

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.

Contact

hello@skateable.io