CourtlyGo

Tennis, pickleball and padel courts from OpenStreetMap: surface, lighting, access, fee. Read-only.

Should I use this

Quality & Safety

A
Description quality
100%
Schema completeness
73%
Naming quality
100%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~867Tokens (tool definitions)
~2.2 KBTypical response size
Moderate attention impact (0.68% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "courts": {
      "url": "https://courtlygo.com/mcp"
    }
  }
}

Remote endpoints

https://courtlygo.com/mcpstreamable-http

What it can do

Tool inventory

Tools (3)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢search_courts(sport, city, country, lat, lon, ...)

Search tennis, padel and pickleball courts in a covered city, metro area or around a point. Use 'city' (e.g. 'Austin, TX', 'Long Beach', 'Tbilisi' or 'Los Angeles area'; 'country' if the name is ambiguous) or 'lat'+'lon'+'radius_km'. Results are venues (courts within 70 m are merged) with number of courts, surface, lighting, access, fee, address or the park/street nearby, and the source of each record. Filters are strict: a court passes only if the property is explicitly mapped; set match_unknown=true to also include courts where it is unknown. Data comes from OpenStreetMap (ODbL) and is often incomplete; every answer carries the data date and attribution.

Input Schema

{
  "type": "object",
  "properties": {
    "sport": {
      "type": "string",
      "enum": [
        "tennis",
        "padel",
        "pickleball"
      ],
      "description": "Sport: tennis, padel or pickleball. Omit for any."
    },
    "city": {
      "type": "string",
      "description": "A covered city, e.g. 'Austin, TX', 'Long Beach' or 'Tbilisi', or a whole metro area, e.g. 'Los Angeles area' (all of Los Angeles and Orange counties) or 'New York area'. See list_coverage."
    },
    "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)."
    },
    "lat": {
      "type": "number",
      "description": "Latitude of the search point (use with lon)."
    },
    "lon": {
      "type": "number",
      "description": "Longitude of the search point (use with lat)."
    },
    "radius_km": {
      "type": "number",
      "default": 5,
      "minimum": 0.1,
      "maximum": 50,
      "description": "Search radius around lat/lon, km."
    },
    "setting": {
      "type": "string",
      "enum": [
        "any",
        "outdoor",
        "indoor"
      ],
      "default": "any",
      "description": "'outdoor' = open-air courts; 'indoor' = indoor or covered."
    },
    "lit": {
      "type": "boolean",
      "default": false,
      "description": "Only courts with lighting."
    },
    "open_to_public": {
      "type": "boolean",
      "default": false,
      "description": "Only courts anyone can use: access is public, or free of charge, or inside a park. Clubs (access_status club), private and likely private courts are excluded."
    },
    "free": {
      "type": "boolean",
      "default": false,
      "description": "Only courts mapped as free of charge (fee=no)."
    },
    "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)."
    },
    "limit": {
      "type": "integer",
      "default": 10,
      "minimum": 1,
      "maximum": 50
    },
    "offset": {
      "type": "integer",
      "default": 0,
      "minimum": 0,
      "maximum": 5000,
      "description": "Skip this many results (paging)."
    }
  },
  "additionalProperties": false
}
🟢get_court(id)

Get full details of one court venue by id (from search_courts): courts per sport, surface, access, OpenStreetMap links, source, data date and caveats.

Input Schema

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Venue id, e.g. 'way-123456'."
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": false
}
🟢list_coverage

List the covered cities with the number of venues per sport, the data date and the attribution.

Input Schema

{
  "type": "object",
  "properties": {},
  "additionalProperties": false
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded3 tools