Ladderboard — round-robin ladders and match scores for small clubs

Round-robin ladders and match scores for small clubs. Players join by QR poster; no app, no account.

Should I use this

Quality & Safety

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

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~392Tokens (tool definitions)
~389 BTypical response size
Minimal attention impact (0.31% 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": {
    "board": {
      "url": "https://ladder.rowb.app/mcp"
    }
  }
}

Remote endpoints

https://ladder.rowb.app/mcpstreamable-http

What it can do

Tool inventory

Tools (5)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟡create_ladder(club, sport)

Create or update the club ladder: club name and sport. Returns the join URL (the poster target) that players scan.

Input Schema

{
  "type": "object",
  "properties": {
    "club": {
      "type": "string"
    },
    "sport": {
      "type": "string"
    }
  },
  "required": [
    "club"
  ]
}
🟡add_player(name)

Register one player by name. Returns a 6-character code and a personal URL so the player can be identified at the courts without an account.

Input Schema

{
  "type": "object",
  "properties": {
    "name": {
      "type": "string"
    }
  },
  "required": [
    "name"
  ]
}
🟡record_match(player_a, player_b, sets_a, sets_b, games_a, ...)

Record a finished match result. Identify players by name, numeric id, or 6-character code. Give the set score (sets_a, sets_b) and optionally the games.

Input Schema

{
  "type": "object",
  "properties": {
    "player_a": {
      "type": "string"
    },
    "player_b": {
      "type": "string"
    },
    "sets_a": {
      "type": "integer"
    },
    "sets_b": {
      "type": "integer"
    },
    "games_a": {
      "type": "integer"
    },
    "games_b": {
      "type": "integer"
    },
    "round": {
      "type": "integer"
    }
  },
  "required": [
    "player_a",
    "player_b",
    "sets_a",
    "sets_b"
  ]
}
🟡schedule_match(player_a, player_b, round)

Put a match on the calendar before it is played. It appears as a pending card in the standings output.

Input Schema

{
  "type": "object",
  "properties": {
    "player_a": {
      "type": "string"
    },
    "player_b": {
      "type": "string"
    },
    "round": {
      "type": "integer"
    }
  },
  "required": [
    "player_a",
    "player_b"
  ]
}
🟡get_standings

The current table (rank, wins, losses, set percentage) plus the single most useful match to play next. Standings are computed with a fixed rule order, so the same results always give the same table.

Input Schema

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

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded5 tools