MCP-Server

LayUp Sports Booking

io.github.LayUp-Sport/sports-booking
Sonstiges Öffentlich und erreichbar MCP 2026-07-28

Was dieses MCP kann

Searches and monitors bookable London sports facilities and pickup games, with venue details, prices, booking links, and email alerts.

create_alert
Set up an email alert for the user: LayUp watches for NEW matching slots (e.g. a cancellation freeing up a peak court) and emails them when one appears. Use when the user can't find a slot now and wants to be notified, or asks to 'monitor'/'watch'/'let me know when'. Requires their email. A confirmation email is sent first — the user must click confirm before any alerts fire (so always tell them to check their inbox). LayUp does the watching; the notification arrives by email, not in this chat.
Externer Zugriff
Eingabeschema
{'type': 'object', 'required': ['email'], 'properties': {'area': {'type': 'string', 'description': "Where to watch, resolved geographically: a borough ('Hackney'), a neighbourhood ('Maida Vale'), a region ('North London'), or a postcode ('W9 2RF', 'SE1'). A postcode is the most precise option when the user gives one. NOT a venue name — to watch a specific venue use venue_names. Omit for all London."}, 'email': {'type': 'string', 'description': "The user's REAL email address, as given by them (required — alerts are emailed here). Never invent, guess or substitute a placeholder like user@example.com; if you don't have it, ask the user first."}, 'sport': {'enum': ['Football', 'Tennis', 'Squash', 'Padel', 'Swimming'], 'type': 'string', 'description': 'One of Football, Tennis, Squash, Padel, Swimming. Omit for any.'}, 'time_to': {'type': 'string', 'description': "Latest London time-of-day, 'HH:MM'."}, 'max_price': {'type': 'number', 'description': 'Only alert on slots at or under this GBP price.'}, 'time_from': {'type': 'string', 'description': "Earliest London time-of-day, 'HH:MM' (e.g. '18:00')."}, 'venue_names': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Pin the alert to specific venues BY NAME, exactly as shown in search results (e.g. ["Hay\'s Galleria", "Padel Box"]). Use this whenever the user names venues — the server resolves names to the right venue(s). Prefer this over venue_slugs.'}, 'venue_slugs': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Pin the alert to specific venues by their exact venue_slug (only if you already have slug values from search_slots). For most cases use venue_names instead. Omit for any venue.'}, 'days_of_week': {'type': 'array', 'items': {'enum': ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'], 'type': 'string'}, 'description': "Only alert on these days (e.g. ['Sat','Sun'] for weekends). The alert is standing — it keeps watching these days every week until the user unsubscribes. Omit for any day."}}, 'additionalProperties': False}
get_venue
List upcoming bookable slots at a single venue, identified by its venue_slug (as returned by search_slots). Use to drill into one venue after a search.
Nur Lesen Externer Zugriff
Eingabeschema
{'type': 'object', 'required': ['venue_slug'], 'properties': {'limit': {'type': 'integer', 'description': 'Max slots to return (1-30, default 15).'}, 'venue_slug': {'type': 'string', 'description': 'The venue_slug from a search_slots result.'}}, 'additionalProperties': False}
list_sports
List the sports LayUp covers with a count of slots available in the next 7 days. Useful as a quick overview before a more specific search.
Nur Lesen Externer Zugriff
Eingabeschema
{'type': 'object', 'properties': {}, 'additionalProperties': False}
refine_search
Find out WHERE and WHEN there is availability, before asking the user a clarifying question. Takes the same filters as search_slots and returns counts by area, day, time band and price — not slots. Use it when the request is under-specified ('find me a tennis court', 'somewhere for a group') so the question you ask back is grounded in real supply: ask 'Wandsworth (8 venues) or Richmond (7)?' rather than an open 'which area?'. Also use it when a search returned nothing, to say which nearby area or time DOES have slots instead of reporting a dead end.
Nur Lesen Externer Zugriff
Eingabeschema
{'type': 'object', 'properties': {'area': {'type': 'string', 'description': 'Optional. Same geographic resolution as search_slots — borough, neighbourhood, region, postcode or venue name. Omit to see every area.'}, 'sport': {'enum': ['Football', 'Tennis', 'Squash', 'Padel', 'Swimming'], 'type': 'string', 'description': 'One of Football, Tennis, Squash, Padel, Swimming.'}, 'date_to': {'type': 'string', 'description': 'ISO date or datetime — latest start. Defaults to 7 days out.'}, 'time_to': {'type': 'string', 'description': "London-local latest start time of day, 'HH:MM'."}, 'date_from': {'type': 'string', 'description': 'ISO date or datetime — earliest start. Defaults to now.'}, 'max_price': {'type': 'number', 'description': 'Maximum price in GBP.'}, 'time_from': {'type': 'string', 'description': "London-local earliest start time of day, 'HH:MM'."}, 'min_courts': {'type': 'integer', 'description': 'Only count venue-hours with at least this many free at the same time. Same meaning as in search_slots.'}, 'booking_type': {'enum': ['spot', 'court', 'pitch'], 'type': 'string', 'description': "'spot', 'court' or 'pitch'."}}, 'additionalProperties': False}
search_slots
Search bookable sports slots in London across every provider LayUp aggregates. Use when a user wants to find a court, pitch, lane, class or pickup game for football, tennis, squash, padel or swimming. Filter by sport, area/borough, date range, time of day and max price. Returns upcoming slots with venue, London-local time, price, provider and a booking link. Times default to the next 7 days.
Nur Lesen Externer Zugriff
Eingabeschema
{'type': 'object', 'properties': {'area': {'type': 'string', 'description': "Where to look. Resolved geographically, so any of these work: a borough ('Hackney'), a neighbourhood ('Shoreditch', 'Maida Vale'), a region ('North London', 'Central London'), a postcode or outward code ('W9 2RF', 'SE1'), or a venue name ('Clissold'). Returns venues near the resolved point, not just ones with the word in their name."}, 'limit': {'type': 'integer', 'description': 'Max results to return (1-30, default 15).'}, 'sport': {'enum': ['Football', 'Tennis', 'Squash', 'Padel', 'Swimming'], 'type': 'string', 'description': 'One of Football, Tennis, Squash, Padel, Swimming.'}, 'date_to': {'type': 'string', 'description': 'ISO date or datetime — latest start. Defaults to 7 days out.'}, 'time_to': {'type': 'string', 'description': "London-local latest start time of day, 'HH:MM'."}, 'date_from': {'type': 'string', 'description': 'ISO date or datetime — earliest start. Defaults to now.'}, 'max_price': {'type': 'number', 'description': "Maximum price in GBP. Published prices above this are removed; unpublished-price slots ('Check App', common for padel/tennis) are kept and flagged."}, 'time_from': {'type': 'string', 'description': "London-local earliest start time of day, 'HH:MM' (e.g. '18:00'). Samples the soonest upcoming slots; combine with date_from to target a specific day."}, 'min_courts': {'type': 'integer', 'description': 'Only return venues with at least this many courts/pitches free AT THE SAME TIME. Use for groups: padel and tennis are 4 per court, so 16 people need 4. Nobody else can answer this — venues cannot see each other and the booking platforms only see their own sites. Results are one slot per venue; that venue had at least this many free at that hour.'}, 'booking_type': {'enum': ['spot', 'court', 'pitch'], 'type': 'string', 'description': "'spot' = book one place (pickup game / swim seat), 'court' = whole court, 'pitch' = whole pitch."}}, 'additionalProperties': False}
Hinzugefügt
refine_search
29. September 2026 02:52
Geändert
search_slots
29. September 2026 02:52
Geändert
create_alert
27. September 2026 02:45
Geändert
search_slots
27. September 2026 02:45
Hinzugefügt
create_alert
17. September 2026 12:43
Hinzugefügt
get_venue
17. September 2026 12:43
Hinzugefügt
list_sports
17. September 2026 12:43
Hinzugefügt
search_slots
17. September 2026 12:43