{"name":"Link & Dink MCP","transport":"streamable-http (request/response subset)","protocol":"json-rpc-2.0","protocol_version":"2024-11-05","auth":"optional-bearer — read tools are anonymous; write tools require a scoped Bearer token (see auth_flow)","tools":[{"name":"list_drops","description":"List the next few open drops (real-time pickup pickleball games) hosted on play.linkanddink.com. Redacted to first names. Empty array if nothing is scheduled."},{"name":"list_popups","description":"List upcoming Popup Pickleball events on p3.linkanddink.com — small / low-fee pop-up tournaments. L&D takes 0% on entry fees."},{"name":"get_popup","description":"Fetch the public detail of a single popup event (title, when, where, capacity, redacted roster) by slug."},{"name":"list_tournaments","description":"List upcoming Maryland / DMV pickleball tournaments curated by Link & Dink. No DD / no CourtReserve events."},{"name":"list_regular_play","description":"List recurring open play, drop-in, and weekly leagues in MoCo + DMV. Schedule (day-of-week + time) plus the public path to join."},{"name":"search_nearby_open_play","description":"Find the closest, soonest open play near a location. Pass the player's current lat/lng; returns ranked open-play options — real-time drops (pickup games), free L&D community drop-ins, and low-fee popup events — closest first, soonest as the tiebreak. Distances are approximate straight-line miles (event coordinates are ZIP-centroid). Options without known coordinates are omitted rather than guessed."},{"name":"find_coach","description":"Find a published Link & Dink coach to take a lesson with. Returns vetted coaches with their headline, service area, specialties, years coaching, and direct booking deep-links for each active program (with prices). Optional filters narrow by specialty and service area; omit them to list all coaches. L&D takes 0% — the coach keeps 100% of their fee."}],"write_tools":[{"name":"create_player","description":"Create the Link & Dink player profile for the verified human this token belongs to — the one-time 'join' step that lets every other action (RSVP, rate, profile) work afterward. The player's email is taken from the token (the magic-link-verified address), NOT from your input. Adults only: if the birthdate is under 18, this is refused — players under 18 join through Link & Dink directly, with a guardian. If a player already exists for this token, returns it unchanged. After this succeeds the same token can immediately rsvp_to_popup, etc.","requires_scope":"player:create"},{"name":"claim_account","description":"Link this token to the verified human's EXISTING Link & Dink player record — for a returning player who already joined (e.g. RSVP'd via the web) but whose token came up without a player attached. The record is matched STRICTLY by the token's magic-link-verified email — you cannot claim anyone else's account, and there is no id/name/phone to pass. Adults only. If no record matches your email, use create_player instead (the one-time signup). After this succeeds the same token can immediately rsvp_to_popup, get_my_profile, etc. Idempotent: if the token is already linked, returns its player unchanged.","requires_scope":"player:claim"},{"name":"rsvp_to_popup","description":"RSVP the player to a Popup Pickleball event on p3.linkanddink.com by slug. Requires the player to already exist in the L&D system (have RSVP'd via the web form at least once). Returns confirmed or waitlist status, plus position. Adult events require a signed event waiver for the current season: if the response is 409 waiver_required, show the player the waiver at the returned waiver_url and retry with waiver_accepted: true only after they explicitly accept it.","requires_scope":"popup:rsvp"},{"name":"rsvp_to_community_event","description":"RSVP the player to a free Link & Dink community event (from the community-events feed at www.linkanddink.com/api/community-events/feed) by its event id. Requires the player to already exist in the L&D system (have RSVP'd via the web form at least once). Idempotent — RSVPing to an event the player is already registered for is a no-op that returns the existing confirmed RSVP.","requires_scope":"community:rsvp"},{"name":"subscribe_to_newsletter","description":"Subscribe the player to Link & Dink Weekly using the email already verified at token-mint time. Triggers the standard double-opt-in confirmation email; the player must click the confirm link to activate. No-op if already subscribed.","requires_scope":"newsletter:subscribe"},{"name":"submit_self_rating","description":"Submit the player's self-rating via the /rate quiz on www.linkanddink.com. Uses the email verified at token-mint time. Coach-eval-wins precedence applies server-side, so this is purely a self-claim — it will not overwrite an existing coach evaluation.","requires_scope":"rate:self"},{"name":"post_drop","description":"Host a drop — an open, joinable pickup game — on play.linkanddink.com on behalf of the player. Requires the player to have a play.linkanddink.com account (their verified email must match an existing account). Skill is a self-reported band (2.0–5.5 in 0.25 steps), never DUPR. Returns the drop id + public URL.","requires_scope":"drops:post"},{"name":"join_drop","description":"Join an open drop on play.linkanddink.com on behalf of the player, as an identified member (not a guest). Requires the player to have a play.linkanddink.com account. Idempotent — joining a drop the player is already in is a no-op. Returns join status + spots left.","requires_scope":"drops:join"},{"name":"update_profile","description":"Update the player's own Link & Dink profile preferences using the identity verified at token-mint time. Supports the player's display name, whether they're visible to other players they share events with (peer_visible), and whether they're open to practice-partner matching (partner_matching_opt_in). Pass only the fields you want to change — at least one is required. This only ever edits the token-holder's own profile.","requires_scope":"profile:write"},{"name":"manage_circle","description":"Manage the token-holder's own pickleball circle (their private social graph). Actions: 'request' (send a connection request to target_player_id), 'respond' (accept/decline an incoming request by connection_id), 'tier' (set the PRIVATE tier rank 1..N on one of your own connections by connection_id, or null to clear — never visible to the ranked person), 'note' (save a private free-text note about target_player_id). Player ids are the community ids returned by get_my_circle.","requires_scope":"circle:manage"},{"name":"get_my_circle","description":"Read the token-holder's own circle: their active connections (with each person's PRIVATE tier rank and the owner's private note) and any incoming pending connection requests. Private to the caller — no one else can read this.","requires_scope":"circle:manage"},{"name":"get_my_profile","description":"Read the token-holder's OWN player profile: display name, L&D rating + bracket, DUPR rating/reliability/id, evaluation status, home zip + travel radius, play windows + goal, plus their private Community Standing (score, tier) and 4-area skill profile. Own data only — never anyone else's.","requires_scope":"me:read"},{"name":"get_my_schedule","description":"Read the token-holder's OWN event schedule: their upcoming RSVPs and their past RSVPs (each with status, payment status, check-in, and the event's slug/title/start time). Own data only.","requires_scope":"me:read"},{"name":"cancel_popup_rsvp","description":"Cancel the token-holder's OWN RSVP to a Popup Pickleball event by the event's id (the `id` from get_my_schedule). Frees their seat. If they paid an entry fee and cancel more than 24h before start, a refund request is opened for the organizer to review (no money moves automatically) — the response's `refund_requested` flag reflects this. Idempotent; own RSVP only.","requires_scope":"popup:rsvp"},{"name":"cancel_community_rsvp","description":"Cancel the token-holder's OWN RSVP to a free Link & Dink community event by its event id. Frees their spot and updates the fill count. Idempotent (cancelling when not RSVP'd is a safe no-op); own RSVP only.","requires_scope":"community:rsvp"},{"name":"set_availability","description":"Record when the token-holder is available to play — a recurring rule (e.g. weekday mornings) or a specific time window. Used by the matcher to form games.","requires_scope":"availability:set"},{"name":"update_profile_nl","description":"Save the token-holder's natural-language pickleball self-description ('describe your game') — skill, style, preferred times/places, goals. Stored as prose plus a best-effort structured form the matcher can query.","requires_scope":"profile:write"},{"name":"manage_coach_availability","description":"Manage the coach's own bookable availability on coach.linkanddink.com. Only works for a coach token (the email was a verified coach at mint time). Four actions: add_window (a recurring weekly window), delete_window (by id), add_override (a one-off open/closed exception on a specific date), delete_override (by id). Times are 24h HH:MM in the coach's local timezone. This only ever edits the token-holder's own availability.","requires_scope":"coach:availability"},{"name":"submit_booking","description":"Book a coaching session with a Link & Dink coach on behalf of the player, using the email verified at token-mint time. Find the program slug via find_coach (each coach's programs include a booking_url whose last path segment is the slug). The player must explicitly accept the waiver. For a PAID program this returns a Stripe checkout_url the player must open to complete payment (the session is held until they pay); for a FREE program it returns booked: true outright. The coach keeps 100% of the fee — L&D takes 0%.","requires_scope":"coach:booking"}],"auth_flow":{"request":"POST /api/agent-auth/request { email, scopes[] } → magic-link email","mint":"player confirms → POST /api/agent-auth/mint { request_id } → { token, scopes }","use":"send Authorization: Bearer <token>; authenticated tools/list includes the write tools the token's scopes authorize","manage":"/agent/tokens"},"hint":"POST a JSON-RPC 2.0 request. Try { jsonrpc:'2.0', id:1, method:'tools/list' }.","llms_txt":"/llms.txt","server_card":"/.well-known/mcp/server-card.json"}