Tennis, pickleball and padel courts from OpenStreetMap: surface, lighting, access, fee. Read-only.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Get full details of one court venue by its id from search_courts: courts per sport, surface, lighting, access, fee, website, opening hours, OpenStreetMap links, source, data date and caveats. Call it when the user asks about one specific court.
Venue id, e.g. 'way-123456'.
Tool list last changed Oct 25, 2026.
Get full details of one court venue by its id from search_courts: courts per sport, surface, lighting, access, fee, website, opening hours, OpenStreetMap links, source, data date and caveats. Call it when the user asks about one specific court.
| Argument | Type | Description |
|---|---|---|
| id* | string | Venue id, e.g. 'way-123456'. |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "Venue id, e.g. 'way-123456'."
}
},
"additionalProperties": false
}List the covered cities and metro areas with the number of venues in each, grouped by country. Use it when the user asks where CourtlyGo has data, for “which city has the most courts” questions (detail=true gives venue counts by sport; say these are counts of mapped venues, not a quality ranking), or after search_courts says a city is unknown; you do not need it before searching. It does not list courts: to find courts, call search_courts with city=<a name from this list>. Pass 'country' (e.g. 'Spain') to list one country; 'detail'=true adds per-city counts by sport (large).
| Argument | Type | Description |
|---|---|---|
| detail | boolean | Per-city counts by sport and hidden-private counts (much larger answer). |
| country | string | Only this country, name or ISO code, e.g. 'Spain' or 'ES'. |
{
"type": "object",
"properties": {
"detail": {
"type": "boolean",
"default": false,
"description": "Per-city counts by sport and hidden-private counts (much larger answer)."
},
"country": {
"type": "string",
"description": "Only this country, name or ISO code, e.g. 'Spain' or 'ES'."
}
},
"additionalProperties": false
}Find tennis, pickleball and padel courts. Call this tool whenever someone asks where they can play, whether there are courts near a place, or for public, lit, indoor or free courts, instead of answering from memory: it returns real mapped venues (name, number of courts, lighting, surface, access, nearest park or street, Google Maps link) for the cities and metro areas it covers (list_coverage shows them). How to call: pass 'city' (a city or a town inside a covered metro area, e.g. 'Santa Monica', 'Huntington Beach', 'Austin, TX', 'Lisbon', or 'Los Angeles area'; add 'country' if the name is ambiguous), or 'lat'+'lon' (+'radius_km', 1–3 for a neighbourhood) for “near me” or a specific park, landmark or address: use the coordinates you know. Map the wish to filters: tonight, after work, evening -> lit=true; open to everyone, public, can I just show up -> open_to_public=true; free -> free=true (only courts mapped as free of charge); indoor, rain -> setting='indoor'. Do not ask follow-up questions first: search, then refine. Results list courts open to the public first and clubs last; read each result's open_to_public, access_note and 'near' before recommending it (clubs and school grounds need confirmation). 'courts' is the total at the venue, 'matched_sport_courts' the number for the requested sport. 'unknown' means not mapped, not 'no'. If fewer than 3 courts match and others were left out only because a property is unmapped, they are added and marked 'matched_unknown'; if no court of the requested sport (pickleball, padel) is mapped, the nearest tennis courts are returned in 'alternatives'. If 'alternatives' are returned they are tennis courts, not the sport asked for: say so. A city that is not covered returns an error: say so and offer list_coverage. This tool shows mapped facts only (no bookings, prices or availability): point to the venue's website or Maps link for those. Data comes from OpenStreetMap (ODbL), is often incomplete, and every answer carries the data date and attribution.
| Argument | Type | Description |
|---|---|---|
| lat | number | Latitude of the search point (use with lon). |
| lit | boolean | Only courts with lighting. |
| lon | number | Longitude of the search point (use with lat). |
| city | string | A covered city, e.g. 'Austin, TX', 'Long Beach' or 'Tbilisi' (also any city inside a metro area, e.g. 'Santa Monica' or 'Huntington Beach'), or a whole metro area, e.g. 'Los Angeles area' (all of Los Angeles and Orange counties) or 'New York area'. See list_coverage. |
| free | boolean | Only courts mapped as free of charge (fee=no). |
| limit | integer |
| sport | string | Sport: tennis, padel or pickleball. Omit for any. |
| offset | integer | Skip this many results (paging). |
| country | string | Country name or ISO code, e.g. 'Georgia', 'GE', 'US'. Use it when the same city name exists in several countries; with lat/lon it limits the search to that country. Distances are in miles for the US and metres/kilometres elsewhere (distance_km is always given). |
| setting | string | 'outdoor' = open-air courts; 'indoor' = indoor or covered. |
| radius_km | number | Search radius around lat/lon, km. |
| min_courts | integer | Minimum number of courts at the venue. |
| match_unknown | boolean | Also return courts where a filtered property is not mapped (unknown). |
| open_to_public | boolean | Only courts open to everyone. Returns courts mapped as public, free of charge or inside a park (open_to_public yes) and courts with no restriction mapped (open_to_public probably, with a note). Clubs, private courts and school grounds are excluded. |
{
"type": "object",
"properties": {
"lat": {
"type": "number",
"description": "Latitude of the search point (use with lon)."
},
"lit": {
"type": "boolean",
"default": false,
"description": "Only courts with lighting."
},
"lon": {
"type": "number",
"description": "Longitude of the search point (use with lat)."
},
"city": {
"type": "string",
"description": "A covered city, e.g. 'Austin, TX', 'Long Beach' or 'Tbilisi' (also any city inside a metro area, e.g. 'Santa Monica' or 'Huntington Beach'), or a whole metro area, e.g. 'Los Angeles area' (all of Los Angeles and Orange counties) or 'New York area'. See list_coverage."
},
"free": {
"type": "boolean",
"default": false,
"description": "Only courts mapped as free of charge (fee=no)."
},
"limit": {
"type": "integer",
"default": 10,
"maximum": 50,
"minimum": 1
},
"sport": {
"enum": [
"tennis",
"padel",
"pickleball"
],
"type": "string",
"description": "Sport: tennis, padel or pickleball. Omit for any."
},
"offset": {
"type": "integer",
"default": 0,
"maximum": 5000,
"minimum": 0,
"description": "Skip this many results (paging)."
},
"country": {
"type": "string",
"description": "Country name or ISO code, e.g. 'Georgia', 'GE', 'US'. Use it when the same city name exists in several countries; with lat/lon it limits the search to that country. Distances are in miles for the US and metres/kilometres elsewhere (distance_km is always given)."
},
"setting": {
"enum": [
"any",
"outdoor",
"indoor"
],
"type": "string",
"default": "any",
"description": "'outdoor' = open-air courts; 'indoor' = indoor or covered."
},
"radius_km": {
"type": "number",
"default": 5,
"maximum": 50,
"minimum": 0.1,
"description": "Search radius around lat/lon, km."
},
"min_courts": {
"type": "integer",
"default": 0,
"minimum": 0,
"description": "Minimum number of courts at the venue."
},
"match_unknown": {
"type": "boolean",
"default": false,
"description": "Also return courts where a filtered property is not mapped (unknown)."
},
"open_to_public": {
"type": "boolean",
"default": false,
"description": "Only courts open to everyone. Returns courts mapped as public, free of charge or inside a park (open_to_public yes) and courts with no restriction mapped (open_to_public probably, with a note). Clubs, private courts and school grounds are excluded."
}
},
"additionalProperties": false
}