Skip to content

sh.kicksma/kicksmash

by kicksma.sh · remote · no sign-in to list tools · v1.1.0 · published by sh.kicksma

Padel matches for people and agents: create, share one link, join, americano schedules, levels.

Deletes · 1Changes · 11

15 tools: 1 can delete or cancel things, 11 change things and 3 only read.

Scanned Oct 21, 2026

5 checks matched something in the tool definitions. No finding is not a safety guarantee. How the checks work.

claude mcp add --transport http kicksmash https://kicksma.sh/mcp

Findings

Matches of fixed checks, with the text they matched.

5 warn
  • The server marks "get_match" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

    Matched text

    annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}; The name "get_match" says "get": a word for reading.

    What this check looks for
  • The server marks "find_matches" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

    Matched text

    annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}; The name "find_matches" says "find": a word for reading.

    What this check looks for
  • The server marks "get_group" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

    Matched text

    annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}; The name "get_group" says "get": a word for reading.

    What this check looks for
  • The server marks "generate_schedule" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

    Matched text

    annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}; The name "generate_schedule" says "generate": a word for a change.

    What this check looks for
  • The server marks "cancel_lesson" not destructive (destructiveHint: false), and its own name, description or input give the class "destructive".

    Matched text

    annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}; The name "cancel_lesson" says "cancel": a word for removing or ending something.

    What this check looks for

Tools

Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.

15 tools

Deletes or cancels 1Claude Code: deny
  • cancel_lessonCancel a student's lesson under the coach's rules; the outcome says whether it was refunded, covered by a free pass, or counted.1 finding

    Why it is in this group

    • The name "cancel_lesson" says "cancel": a word for removing or ending something.
    • The server marks it not destructive (destructiveHint: false), but an annotation never lowers a class.

    Findings

    • Warn

      The server marks "cancel_lesson" not destructive (destructiveHint: false), and its own name, description or input give the class "destructive".

      Matched text

      annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}; The name "cancel_lesson" says "cancel": a word for removing or ending something.

      What this check looks for
    Description, as the server wrote it
    Cancel a student's lesson under the coach's rules; the outcome says whether it was refunded, covered by a free pass, or counted. Say the rule to the person before cancelling late.

    Annotations the server declares

    • title: Cancel a lesson
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: false
Changes things 11Claude Code: ask
  • about_kicksmashWhat Kicksmash is and how to use it: matches, levels, groups, boards, the API and what we ask of assistants.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    What Kicksmash is and how to use it: matches, levels, groups, boards, the API and what we ask of assistants. Read this once before acting.

    Annotations the server declares

    • title: About Kicksmash
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • book_lessonBook one lesson at a free start for an accepted student (their personal token).No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    Description, as the server wrote it
    Book one lesson at a free start for an accepted student (their personal token). Draws from their open package when they have one. Confirm the time with the person first.

    Annotations the server declares

    • title: Book a lesson
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: false
  • coach_slotsFree starts inside a coach's hours for the next days (default 14).No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Free starts inside a coach's hours for the next days (default 14). Only accepted students can book them: request_coach first.

    Annotations the server declares

    • title: A coach's free times
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • create_api_keyGet a free key instantly for roomier limits and webhooks.No findings

    Why it is in this group

    • The name "create_api_key" says "create": a word for a change.
    Description, as the server wrote it
    Get a free key instantly for roomier limits and webhooks. Shown once. Not needed for reading or for a few writes a day.

    Annotations the server declares

    • title: Create an API key
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: false
  • create_matchCreate a padel match (4 players) or an americano tournament for a person.No findings

    Why it is in this group

    • The name "create_match" says "create": a word for a change.
    Description, as the server wrote it
    Create a padel match (4 players) or an americano tournament for a person. A tournament may keep fixed pairs (fixedPairs: true): two partners play every round together and the table ranks pairs. Returns the share link for the players and the organizer's private links. Give the person all links; keep personalToken and manageUrl private. Ask before creating; one request, one match.

    Annotations the server declares

    • title: Create a match
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: false
  • find_matchesOpen, organizer-listed matches at a venue (its public board), with spots left and level ranges.1 finding

    Why it is in this group

    • The name "find_matches" says "find": a word for reading.
    • The description's first verb is "open": a word for a change.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    Findings

    • Warn

      The server marks "find_matches" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

      Matched text

      annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}; The name "find_matches" says "find": a word for reading.

      What this check looks for
    Description, as the server wrote it
    Open, organizer-listed matches at a venue (its public board), with spots left and level ranges. Give the venue name; the slug is derived.

    Annotations the server declares

    • title: Find open matches at a venue
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • generate_scheduleRounds of rotating-partner doubles for 4 to 64 players.1 finding

    Why it is in this group

    • The name "generate_schedule" says "generate": a word for a change.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    Findings

    • Warn

      The server marks "generate_schedule" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

      Matched text

      annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}; The name "generate_schedule" says "generate": a word for a change.

      What this check looks for
    Description, as the server wrote it
    Rounds of rotating-partner doubles for 4 to 64 players. Exact when the field is in fours (every pair partners once in players−1 rounds), fair sit-outs otherwise. Nothing is stored.

    Annotations the server declares

    • title: Generate an americano schedule
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • get_groupA crew that plays together: members' first names and count (their levels are for members only, so null here), weekly slot, whether it asks to join, upcoming matches, calendar feed.1 finding

    Why it is in this group

    • The name "get_group" says "get": a word for reading.
    • The input takes a statement or command to run (input.code), which can change anything it can reach.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    Findings

    • Warn

      The server marks "get_group" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

      Matched text

      annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}; The name "get_group" says "get": a word for reading.

      What this check looks for
    Description, as the server wrote it
    A crew that plays together: members' first names and count (their levels are for members only, so null here), weekly slot, whether it asks to join, upcoming matches, calendar feed.

    Annotations the server declares

    • title: Get a group
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • get_matchA match or tournament by its 4-character code: players with levels, spots left, venue, time, level range, result.1 finding

    Why it is in this group

    • The name "get_match" says "get": a word for reading.
    • The input takes a statement or command to run (input.code), which can change anything it can reach.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    Findings

    • Warn

      The server marks "get_match" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

      Matched text

      annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}; The name "get_match" says "get": a word for reading.

      What this check looks for
    Description, as the server wrote it
    A match or tournament by its 4-character code: players with levels, spots left, venue, time, level range, result. Public data only.

    Annotations the server declares

    • title: Get a match
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • join_matchPut a person into a match by first name (or by their personal token from an earlier call).No findings

    Why it is in this group

    • The description's first verb is "put": a word for a change.
    • The input takes a statement or command to run (input.code), which can change anything it can reach.
    Description, as the server wrote it
    Put a person into a match by first name (or by their personal token from an earlier call). Handles waitlists and level ranges; when the level is outside the range, the organizer is asked to approve, unless the player already played a finished, scored match with that organizer. On a fixed-pairs tournament pass partner (a first name) to sign up as a pair: the answer's partner.inviteUrl is the link the partner opens to claim their spot; without partner the person is listed as needing a partner. For a group's match the answer says whether the person is now a member of the group; a group that asks to join is never joined through a match. A place the organizer holds for the same name refuses the join (name_held) and writes nothing: if it is that person, they take the place on the match page; if not, they join with a fuller name, such as a last name. A name (with no token) that a player already in the match carries refuses the join (name_seated) and writes nothing: if it is that player, call again with their personal token; if not, join with a fuller name.

    Annotations the server declares

    • title: Join a match
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: false
  • request_coachAsk a coach to accept a person as their student, by first name or personal token.No findings

    Why it is in this group

    • The name "request_coach" says "request": a word for a change.
    Description, as the server wrote it
    Ask a coach to accept a person as their student, by first name or personal token. The coach answers with one tap. Keep the returned personalToken private to the student; book_lesson needs it. Ask the person before calling.

    Annotations the server declares

    • title: Ask to become a student
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: false
Only reads 3Claude Code: allow
  • find_clubsPadel clubs: booking link and platform, courts, today's free courts (from the club's own calendar feed, or read from its booking platform's public page: freeCourts.source says whic…No findings

    Why it is in this group

    • The name "find_clubs" says "find": a word for reading.
    Description, as the server wrote it
    Padel clubs: booking link and platform, courts, today's free courts (from the club's own calendar feed, or read from its booking platform's public page: freeCourts.source says which, and freeCourts.platform names it), founding status. Every row says `claimed`: true when the club runs the page itself, false when Kicksmash listed it from public sources, where the courts and links are our reading and may be out of date. Pass include:'listed' to get both — that is what answers "where can I play here?". Filter by city (phuket, singapore) or ask for one club by name.

    Annotations the server declares

    • title: Find clubs
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • find_coachesPadel coaches who listed their page: clubs, lesson length, languages, the rules students book under (cancellation cutoff, free late passes, notice).No findings

    Why it is in this group

    • The name "find_coaches" says "find": a word for reading.
    Description, as the server wrote it
    Padel coaches who listed their page: clubs, lesson length, languages, the rules students book under (cancellation cutoff, free late passes, notice). Filter by city. Prices are the coach's to tell; nothing is paid through Kicksmash.

    Annotations the server declares

    • title: Find coaches
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • find_seriesTournament series: same weekday and time every week, fortnight or month, with the next edition to sign up for and the past podiums.No findings

    Why it is in this group

    • The name "find_series" says "find": a word for reading.
    Description, as the server wrote it
    Tournament series: same weekday and time every week, fortnight or month, with the next edition to sign up for and the past podiums. Filter by city, or pass a slug for one series. Players sign up on the edition's match page.

    Annotations the server declares

    • title: Find series (Opens that repeat)
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false

This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.

Install

Pinned to version 1.1.0. Values in angle brackets are yours to fill in.

claude mcp add --transport http kicksmash https://kicksma.sh/mcp

Run in a terminal.

Claude Code permissions

Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.

.claude/settings.json
{
  "permissions": {
    "allow": [
      "mcp__kicksmash__find_clubs",
      "mcp__kicksmash__find_series",
      "mcp__kicksmash__find_coaches"
    ],
    "ask": [
      "mcp__kicksmash__about_kicksmash",
      "mcp__kicksmash__get_match",
      "mcp__kicksmash__find_matches",
      "mcp__kicksmash__get_group",
      "mcp__kicksmash__generate_schedule",
      "mcp__kicksmash__coach_slots",
      "mcp__kicksmash__request_coach",
      "mcp__kicksmash__book_lesson",
      "mcp__kicksmash__create_match",
      "mcp__kicksmash__join_match",
      "mcp__kicksmash__create_api_key"
    ],
    "deny": [
      "mcp__kicksmash__cancel_lesson"
    ]
  }
}

Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. It assumes the server is installed as kicksmash. Review it before you use it.